我想知道如何通过主机名在 Docker 容器之间进行 ping 操作。我使用network create
命令创建了一个网络。我正在使用以下命令运行机器人容器:
docker run --hostname=app --net=custom container1
docker run --hostname=web --net=custom container2
但是当我进入第一个容器时
docker exec -it name /bin/bash
然后运行
ping web
,响应是
ping:web:名称或服务未知
答案1
主机名不与 docker 的内置 DNS 解析一起使用。您可以解析容器名称、服务名称(在 Compose 文件中)以及您提供的任何网络别名。所有这些值均由 docker 在容器外部控制,其中主机名可能会在容器内部在 docker 视图之外进行修改。
要使用容器名称,您只需要:
docker run --name=app --net=custom container1
docker run --name=web --net=custom container2
或者对于网络别名,您可以尝试:
docker run --network-alias=app --net=custom container1
docker run --network-alias=web --net=custom container2
答案2
为系统或容器提供主机名是一回事,但让它从其他系统/容器中实际解析又是另一回事。
看看Oracle 文档使docker容器相互通信。
长话短说,你可以采用以下两种方法之一:
添加运行命令的链接
对于这种方法,只需更改--hostname
为--name
,并添加链接选项,如下所示:
docker run --name=web --net=custom container1
docker run --name=app --net=custom container2 --link web:web
这将修改第二个容器中的 hosts 文件,将主机名“web”链接到其容器的 ip。
直接更改Hosts文件
在 /etc/hosts 中,在相应的容器中添加以下行
in app container: <IP_WEB_CONTAINER> web
in web container: <IP_APP_CONTAINER> app
主机名现在应该可以正确解析了。