如何通过主机名访问 docker 容器?(从我的主机)
How to access docker container through hostname?(from my host pc)
(我这样做只是为了练习,知道docker。)
我的主机是 ubuntu 18.04 LTS
。
这是我的 docker-compose
文件(默认网络模式是网桥)。
version: "2"
services:
zookeeper1:
image: wurstmeister/zookeeper
zookeeper2:
image: wurstmeister/zookeeper
zookeeper3:
image: wurstmeister/zookeeper
在docker容器中,他们可以找到彼此。
> docker container exec -it 8b1c2b412989 ping zookeeper2
PING zookeeper2 (172.19.0.3) 56(84) bytes of data.
64 bytes from setup-zookeeper-kafka_zookeeper2_1.setup-zookeeper-kafka_default (172.19.0.3): icmp_seq=1 ttl=64 time=0.097 ms
64 bytes from setup-zookeeper-kafka_zookeeper2_1.setup-zookeeper-kafka_default (172.19.0.3): icmp_seq=2 ttl=64 time=0.129 ms
但是当我尝试连接到我的主机时,它不起作用
> ping zookeeper2
ping: zookeeper2: Name or service not known
> ping 8b1c2b412989 # container id also doesn't work
ping: 8b1c2b412989: Name or service not known
Ping ip
,效果很好。
> ping 172.19.0.3
PING 172.19.0.3 (172.19.0.3) 56(84) bytes of data.
64 bytes from 172.19.0.3: icmp_seq=1 ttl=64 time=0.142 ms
64 bytes from 172.19.0.3: icmp_seq=2 ttl=64 time=0.046 ms
我加了hostname
属性,还是不行。
version: "2"
services:
zookeeper1:
hostname: zookeeper1
image: wurstmeister/zookeeper
zookeeper2:
hostname: zookeeper2
image: wurstmeister/zookeeper
zookeeper3:
hostname: zookeeper3
image: wurstmeister/zookeeper
如何从我的主机 PC 访问带有主机名的容器?
现在,我只能使用 ports
选项。(或者我必须写静态 IP 地址)
这是我想错了什么?
Docker 不会自动更新您的主机 /etc/hosts 文件,因此您无法通过主机名访问主机。
您可以手动为 docker-compose 编写包装器,这将更新主机的 /etc/hosts 文件。
但另一个问题是,为什么你需要它。
正如 Giga 评论的那样。如果您的 /etc/hosts 中没有主机名,那么这里没有魔法。
如果您需要 ping 健康检查,您可以使用 docker-compose's healthcheck
因此,有了它,您可以随时查看您的动物园管理员是否还活着。
如果您坚持需要使用主机名进行 ping,我建议您卷起袖子,使用 docker 格式制作一个 bash 脚本,例如...
docker ps --format "table {{.ID}}\t{{.Ports}}"
然后对每个带有容器名称的容器 ID 执行:
docker inspect <containerid> and extract the IP like you have [here.][2]
(我这样做只是为了练习,知道docker。)
我的主机是 ubuntu 18.04 LTS
。
这是我的 docker-compose
文件(默认网络模式是网桥)。
version: "2"
services:
zookeeper1:
image: wurstmeister/zookeeper
zookeeper2:
image: wurstmeister/zookeeper
zookeeper3:
image: wurstmeister/zookeeper
在docker容器中,他们可以找到彼此。
> docker container exec -it 8b1c2b412989 ping zookeeper2
PING zookeeper2 (172.19.0.3) 56(84) bytes of data.
64 bytes from setup-zookeeper-kafka_zookeeper2_1.setup-zookeeper-kafka_default (172.19.0.3): icmp_seq=1 ttl=64 time=0.097 ms
64 bytes from setup-zookeeper-kafka_zookeeper2_1.setup-zookeeper-kafka_default (172.19.0.3): icmp_seq=2 ttl=64 time=0.129 ms
但是当我尝试连接到我的主机时,它不起作用
> ping zookeeper2
ping: zookeeper2: Name or service not known
> ping 8b1c2b412989 # container id also doesn't work
ping: 8b1c2b412989: Name or service not known
Ping ip
,效果很好。
> ping 172.19.0.3
PING 172.19.0.3 (172.19.0.3) 56(84) bytes of data.
64 bytes from 172.19.0.3: icmp_seq=1 ttl=64 time=0.142 ms
64 bytes from 172.19.0.3: icmp_seq=2 ttl=64 time=0.046 ms
我加了hostname
属性,还是不行。
version: "2"
services:
zookeeper1:
hostname: zookeeper1
image: wurstmeister/zookeeper
zookeeper2:
hostname: zookeeper2
image: wurstmeister/zookeeper
zookeeper3:
hostname: zookeeper3
image: wurstmeister/zookeeper
如何从我的主机 PC 访问带有主机名的容器?
现在,我只能使用 ports
选项。(或者我必须写静态 IP 地址)
这是我想错了什么?
Docker 不会自动更新您的主机 /etc/hosts 文件,因此您无法通过主机名访问主机。 您可以手动为 docker-compose 编写包装器,这将更新主机的 /etc/hosts 文件。 但另一个问题是,为什么你需要它。
正如 Giga 评论的那样。如果您的 /etc/hosts 中没有主机名,那么这里没有魔法。
如果您需要 ping 健康检查,您可以使用 docker-compose's healthcheck 因此,有了它,您可以随时查看您的动物园管理员是否还活着。
如果您坚持需要使用主机名进行 ping,我建议您卷起袖子,使用 docker 格式制作一个 bash 脚本,例如...
docker ps --format "table {{.ID}}\t{{.Ports}}"
然后对每个带有容器名称的容器 ID 执行:
docker inspect <containerid> and extract the IP like you have [here.][2]