我开始使用 docker 并喜欢它主要是因为 Docker 容器是一种轻量级虚拟机。但我无法弄清楚,docker 容器如何解析彼此的主机名。他们可以使用 IP 地址相互连接,但不能使用主机名,我什至无法编辑容器中的 /etc/hosts 来弥补这一点。当我重新启动容器时,它们会获得不同的 IP,因此我想使用主机名代替 IP 来相互通信。假设我想在容器中运行 Zookeeper 集群的 Zookeeper 实例,并且想将 Zookeeper 服务器的主机名放入配置 (zoo.cfg) 文件中。
我正在阅读这个官方Docker 0.10.3文档(此时,它仍在分支中)并且它说:
--net-alias=ALIAS
Run Code Online (Sandbox Code Playgroud)
除了如上所述的--name之外,容器还是由用户定义的网络中的一个或多个已配置的--net-alias(或docker network connect命令中的--alias)发现的.嵌入式DNS服务器维护所有容器别名与其在特定用户定义网络上的IP地址之间的映射.通过使用docker network connect命令中的--alias选项,容器可以在不同的网络中具有不同的别名.
--link=CONTAINER_NAME:ALIAS
Run Code Online (Sandbox Code Playgroud)
在运行容器时使用此选项会为嵌入式DNS提供一个名为ALIAS的额外条目,该条目指向CONTAINER_NAME标识的容器的IP地址.使用--link时,嵌入式DNS将保证仅在使用--link的容器上进行本地化查找.这使得新容器内的进程可以连接到容器,而无需知道其名称或IP.
来自一个容器的网络别名实际上是来自同一网络中第二个容器的链接吗?
1. --name和--hostnamedocker run命令有什么区别?
2.为什么foo不能通过bar其hostname= 到达barhost?
创建网络并连接两个容器:
docker network create test
docker run --rm -dit --name bar --network test --hostname barhost alpine:latest
docker run --rm -it --name foo --network test --hostname foohost alpine:latest
Run Code Online (Sandbox Code Playgroud)
barhost从foo终端ping
ping -c2 barhost
Run Code Online (Sandbox Code Playgroud)
给出结果:
错误的地址“ barhost”
但是bar从foo
ping -c2 bar
Run Code Online (Sandbox Code Playgroud)
成功:
PING条(172.31.0.2):56个数据字节来自172.31.0.2的64字节:seq = 0 ttl = 64时间= 0.260 ms来自172.31.0.2的64字节:seq = 1 ttl = 64时间= 0.155 ms
--- bar ping统计信息---传输2个数据包,接收2个数据包,0%数据包丢失 …