了解Docker Link的作用?

412 阅读2分钟

Docker是如何链接容器的?在这个过程中会发生什么?Docker在容器之间创建一个安全的隧道,不需要在容器上对外暴露任何端口。请注意,不需要使用-P-p 标志。

Docker通过两种方式暴露了从源容器到接收容器的连接。

  • 环境变量
  • 更新/etc/hosts 文件

环境变量

当你链接容器时,Docker会创建几个环境变量。--env-file 它暴露了来自源容器的Docker的所有环境变量,其中包括ENV 命令、-e --envdocker 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地址,允许链接通信继续进行。