互联网技术 / 互联网资讯 · 2024年3月14日

在 Docker 容器中修改 /etc/hosts 的方法

除了环境变量之外,容器在 /etc/hosts 中还会自动添加源容器的主机条目。以下示例展示了一个 web 容器的相关条目。

$ docker run -t -i --rm --link db:webdb training/webapp /bin/bash

root@aed84ee21bde:/opt/webapp# cat /etc/hosts

172.17.0.7 aed84ee21bde

172.17.0.5 webdb 6e5cdeb2d300 db

可以看到有两个相关的主机条目。第一个是 web 使用容器 ID 作为主机名的条目;第二个条目使用链接别名来引用 db 容器的 IP 地址。除了链接别名本身外,链接容器的名称以及链接容器的主机名也会被添加到 /etc/hosts,并指向链接容器的 IP 地址。你可以通过以下任意条目对该主机进行 Ping:

$ apt-get install -yqq inetutils-ping

root@aed84ee21bde:/opt/webapp# ping webdb

PING webdb (172.17.0.5): 48 data bytes

56 bytes from 172.17.0.5: icmp_seq=0 ttl=64 time=0.267 ms

56 bytes from 172.17.0.5: icmp_seq=1 ttl=64 time=0.250 ms

56 bytes from 172.17.0.5: icmp_seq=2 ttl=64 time=0.256 ms

注意:示例中,初始容器中未包含 ping,需要安装后再执行。

通过上述主机条目,数据库服务可以通过主机名进行访问。也就是说,可以使用 webdb 这样的主机名来定位数据库容器的 IP 地址 172.17.0.5,从而配置应用程序以使用数据库容器。

如果重新启动源容器,/etc/hosts 中链接容器的条目会自动更新为源容器的新 IP 地址,从而继续维持链接通信。

$ docker restart db

$ docker run -t -i --rm --link db:db training/webapp /bin/bash

root@aed84ee21bde:/opt/webapp# cat /etc/hosts

172.17.0.7 aed84ee21bde

172.17.0.9 db