簡體   English   中英

為什么 docker 容器無法通過默認網絡名稱中的容器名稱相互 ping 通,如網橋和驅動程序網橋

[英]Why docker containers are not pingable to each other through container name in the default network name as bridge and driver bridge

我通過以下命令在默認的 docker 網絡中啟動了兩個名為c1c2的 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 中推出了另外兩個名為c3c4docker容器。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM