Docker是如何链接容器的?在这个过程中会发生什么?Docker在容器之间创建一个安全的隧道,不需要在容器上对外暴露任何端口。请注意,不需要使用-P 或-p 标志。
Docker通过两种方式暴露了从源容器到接收容器的连接。
- 环境变量
- 更新
/etc/hosts文件
环境变量
当你链接容器时,Docker会创建几个环境变量。--env-file 它暴露了来自源容器的Docker的所有环境变量,其中包括ENV 命令、-e --env 和docker run 命令上的选项,当源容器启动时。
Docker为--link 参数中列出的每个目标容器设置一个<alias>_NAME 环境变量。例如,如果一个叫做web 的新容器通过--link db:webbed 链接到一个叫做db 的数据库容器,那么Docker在web 容器中创建一个WEBDB_NAME=/web/webdb 变量。
Docker还为源容器所暴露的每个端口定义了一组环境变量。每个变量都有一个唯一的前缀。
<name>_PORT_<port>_<protocol>
<name> 是在--link 参数中指定的(例如:webdb)<port> 的数字是暴露的那个<protocol> 是TCP或UDP
Docker使用这种格式来定义环境变量,例如。
prefix_ADDR变量包含URL中的IP地址,例如WEBDB_PORT_8080_TCP_ADDR=172.17.0.82。 prefix_PORT变量只包含URL中的端口号,例如WEBDB_PORT_8080_TCP_PORT=8080。 prefix_PROTO变量只包含URL中的协议,例如WEBDB_PORT_8080_TCP_PROTO=tcp。
注意,如果容器暴露了多个端口,则要为每个端口定义一个环境变量集。
更新/etc/hosts文件
除了环境变量之外,Docker还为源容器在/etc/hosts文件中添加了一个主机条目。下面是一个样本条目。
$ 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 地址。
你可以ping该主机并尝试。
ping webdb
*注意,如果你重新启动源容器,链接的容器/etc/hosts ,文件将自动更新源容器的新IP地址,允许链接通信继续进行。