无法 ping docker 托管在不同 VM 上的容器
Unable to ping docker container hosted on a different VM
Two docker container hosted on two different VM, port exposed to both docker container 60000.
Both VMs communicate through each through NAT NETWORK and not using docker
network compose. Running docker-A sudo docker run --rm -it -p 8888:8888 -v
$(pwd):/workdir -w /workdir tensor
Docker-A->172.17.0.1
Docker-B->172.17.0.3
VM-A(Docker-A hosted)->172.25.1.24
VM-B(Docker-B hosted)->172.25.1.13
当我尝试从 Docker-A ping 到 Docker-B 时,出现目标主机无法访问错误。我使用 ping 172.17.0.3 连接 Docker-B。与 Docker 基本网络问题作斗争。非常感谢您的帮助。
谢谢
切勿直接使用容器专用 IP 地址。在这种情况下,VM A 无法访问 VM B 上的容器私有 IP 地址。实际上只有两种情况可以访问容器私有 IP 地址,在这两种情况下都有更好的方法。
每个 VM 都是 运行 自己的 Docker 实例,并且有自己的专用网络 space。虽然看起来两个容器的地址都在 172.17.0.0/16 中,但它们实际上是独立的网络,实际上两个 Docker 守护进程可以独立决定为两个容器分配相同的 IP 地址。除非您特意配置 overlay network 一个 VM(或物理系统)无法通过私有 IP 地址访问另一台服务器的容器,否则没有 IP 路由可以到达那里。 (在这种情况下,由于两台主机具有相同的 IPv4 网络范围,VM A 到 172.17.0.0/16 的路由指向 VM A 的 Docker 网络,这与 VM B 的网络不同。)
要使容器可以从外部访问 Docker space,您需要使用 docker run -p
选项(或等效的 Docker Compose ports:
环境)。然后,您可以使用主机(或虚拟机)的 DNS 名称或 IP 地址以及已发布的(第一个)端口号访问容器。您不能通过这种方式 ping(1) 远程容器,但也没有任何特殊原因想要发送容器 ICMP 数据包。
vm-a$ curl http://172.25.1.13:8888 # using vm-b's IP address
如果这两个容器位于同一主机(或 VM)上,即使您不使用 Compose,您也可以 create a Docker network and run both containers --name some-name --net some-net
; if both have the same --net some-net
then each container can reach the other using the other's some-name
as a hostname. Networking in Compose 更容易接近;如果没有 Compose,您必须手动 docker network create
一个网络。
(我说过容器专用地址在两种情况下起作用。它们是(1)来自同一 Linux 主机 运行 容器的控制台,以及(2)在同一个 Docker 网络上的容器之间。它们不能在其他主机上工作,或者在 MacOS 或 Windows 主机上工作。上面的方法没有这些限制并且也可以在容器私有 IP 地址更改等情况下生存当容器被删除并重新创建时。)
Two docker container hosted on two different VM, port exposed to both docker container 60000.
Both VMs communicate through each through NAT NETWORK and not using docker
network compose. Running docker-A sudo docker run --rm -it -p 8888:8888 -v
$(pwd):/workdir -w /workdir tensor
Docker-A->172.17.0.1
Docker-B->172.17.0.3
VM-A(Docker-A hosted)->172.25.1.24
VM-B(Docker-B hosted)->172.25.1.13
当我尝试从 Docker-A ping 到 Docker-B 时,出现目标主机无法访问错误。我使用 ping 172.17.0.3 连接 Docker-B。与 Docker 基本网络问题作斗争。非常感谢您的帮助。 谢谢
切勿直接使用容器专用 IP 地址。在这种情况下,VM A 无法访问 VM B 上的容器私有 IP 地址。实际上只有两种情况可以访问容器私有 IP 地址,在这两种情况下都有更好的方法。
每个 VM 都是 运行 自己的 Docker 实例,并且有自己的专用网络 space。虽然看起来两个容器的地址都在 172.17.0.0/16 中,但它们实际上是独立的网络,实际上两个 Docker 守护进程可以独立决定为两个容器分配相同的 IP 地址。除非您特意配置 overlay network 一个 VM(或物理系统)无法通过私有 IP 地址访问另一台服务器的容器,否则没有 IP 路由可以到达那里。 (在这种情况下,由于两台主机具有相同的 IPv4 网络范围,VM A 到 172.17.0.0/16 的路由指向 VM A 的 Docker 网络,这与 VM B 的网络不同。)
要使容器可以从外部访问 Docker space,您需要使用 docker run -p
选项(或等效的 Docker Compose ports:
环境)。然后,您可以使用主机(或虚拟机)的 DNS 名称或 IP 地址以及已发布的(第一个)端口号访问容器。您不能通过这种方式 ping(1) 远程容器,但也没有任何特殊原因想要发送容器 ICMP 数据包。
vm-a$ curl http://172.25.1.13:8888 # using vm-b's IP address
如果这两个容器位于同一主机(或 VM)上,即使您不使用 Compose,您也可以 create a Docker network and run both containers --name some-name --net some-net
; if both have the same --net some-net
then each container can reach the other using the other's some-name
as a hostname. Networking in Compose 更容易接近;如果没有 Compose,您必须手动 docker network create
一个网络。
(我说过容器专用地址在两种情况下起作用。它们是(1)来自同一 Linux 主机 运行 容器的控制台,以及(2)在同一个 Docker 网络上的容器之间。它们不能在其他主机上工作,或者在 MacOS 或 Windows 主机上工作。上面的方法没有这些限制并且也可以在容器私有 IP 地址更改等情况下生存当容器被删除并重新创建时。)