[英]Why docker containers are not pingable to each other through container name in the default network name as bridge and driver bridge
我通過以下命令在默認的 docker 網絡中啟動了兩個名為c1和c2的 docker 容器,該網絡名為橋接驅動程序。
docker container run -dit --name c1 centos:7
docker container run -dit --name c2 centos:7
所以兩個容器都在同一個網絡中
ubuntu@master-node:~$ docker network inspect bridge
[
{
"Name": "bridge",
"Id": "7301725ee3bdfd470c67c202532e",
"Created": "2021-11-30T13:39:25.074992675Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"40378c3bf6219ad34b3da9debdf7ef1": {
"Name": "c1",
"EndpointID": "f170b34a405483ebb90737a2df255",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"18cbe312f339001c159d30b1a53ec80": {
"Name": "c2",
"EndpointID": "fbeb085a049f4127f9411e0b86ca7",
"MacAddress": "02:42:ac:11:00:04",
"IPv4Address": "172.17.0.4/16",
"IPv6Address": ""
},
並且兩者都應該可以通過容器名稱和 IP 地址相互 ping 通。 但是兩者都可以通過 IP 地址 ping 通。
[root@309b8307b0bc /]# ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.092 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.077 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.070 ms
並且它們無法使用容器名稱 ping 並顯示以下消息。
[root@309b8307b0bc /]# ping c1
ping: c1: Name or service not known
現在我又創建了一個自己命名為mynet的網絡,並帶有橋接驅動程序。
docker network create --attachable --driver bridge mynet
並在 mynet 中推出了另外兩個名為c3和c4的docker容器。
ubuntu@master-node:~$ docker container run -dit --name c3 --network mynet myimage
9456b0be0875fe89f5e6ff2135598ec396
ubuntu@master-node:~$ docker container run -dit --name c4 --network mynet myimage
29cb726f195a3d7ae734b8a960eaf56fc9
但是現在我嘗試使用具有相同網絡驅動程序的網絡,然后兩個容器也可以通過 IP 地址和容器名稱相互 ping 通。
[root@3c7774229cb7 /]# ping 172.20.0.2
PING 172.20.0.2 (172.20.0.2) 56(84) bytes of data.
64 bytes from 172.20.0.2: icmp_seq=1 ttl=64 time=0.108 ms
64 bytes from 172.20.0.2: icmp_seq=2 ttl=64 time=0.085 ms
64 bytes from 172.20.0.2: icmp_seq=3 ttl=64 time=0.085 ms
^C
--- 172.20.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2047ms
rtt min/avg/max/mdev = 0.085/0.092/0.108/0.015 ms
[root@3c7774229cb7 /]# ping c3
PING c3 (172.20.0.2) 56(84) bytes of data.
64 bytes from c3.mynet (172.20.0.2): icmp_seq=1 ttl=64 time=0.052 ms
64 bytes from c3.mynet (172.20.0.2): icmp_seq=2 ttl=64 time=0.075 ms
64 bytes from c3.mynet (172.20.0.2): icmp_seq=3 ttl=64 time=0.082 ms
^C
--- c3 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2038ms
rtt min/avg/max/mdev = 0.052/0.069/0.082/0.016 ms
現在我無法理解 c1 和 c2 無法通過具有默認網絡和驅動程序橋的容器名稱相互 ping 通,而 c3 和 c4 在名為 mynet 的內部可以相互 ping 通,而我使用相同的驅動程序橋創建了這個網絡。
這是設計使然。 對於 docker 的嵌入式 DNS,您需要一個用戶創建的網絡:
默認情況下,容器會繼承 /etc/resolv.conf 配置文件中定義的主機的 DNS 設置。 使用默認橋接網絡的容器獲取此文件的副本,而使用自定義網絡的容器使用 Docker 的嵌入式 DNS 服務器,該服務器將外部 DNS 查找轉發到主機上配置的 DNS 服務器。
參考: https://docs.docker.com/config/containers/container-networking/#dns-services
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.