关于docker --link 参数的问题

questions about docker --link parameter

我们知道,在一台主机上 docker 守护进程,容器连接到 docker0 网桥,因此默认情况下容器可以相互访问。

--link选项有什么用呢? direct access by ip方式有什么不同吗?

它到底有什么作用?

当您使用 --link 选项创建容器时,Docker 通过两种方式将 linked 容器暴露到新容器中:

  • 它使用 linked 容器的 IP 和创建 link 时给定的别名在 /etc/hosts 中创建一个条目。
  • 它将一些信息公开为有关 linked 容器的环境变量。如 Docker documentation 所示:

Docker will then also define a set of environment variables for each port that is exposed by the source container. The pattern followed is:

<name>_PORT_<port>_<protocol> will contain a URL reference to the port. Where <name> is the alias name specified in the --link parameter (e.g. webdb), <port> is the port number being exposed, and <protocol> is either TCP or UDP. The format of the URL will be: <protocol>://<container_ip_address>:<port> (e.g. tcp://172.17.0.82:8080). This URL will then be split into the following 3 environment variables for convenience:
<name>_PORT_<port>_<protocol>_ADDR will contain just the IP address from the URL (e.g. WEBDB_PORT_8080_TCP_ADDR=172.17.0.82).
<name>_PORT_<port>_<protocol>_PORT will contain just the port number from the URL (e.g. WEBDB_PORT_8080_TCP_PORT=8080).
<name>_PORT_<port>_<protocol>_PROTO will contain just the protocol from the URL (e.g. WEBDB_PORT_8080_TCP_PROTO=tcp).

如果您通过 IP 访问没有区别,但是使用 links 让容器设置忽略将由 Docker 守护程序分配的 ip。检查 Docker documentation 了解更多信息。

来自Docker docs

When you set up a link, you create a conduit between a source container and a recipient container. The recipient can then access select data about the source

When two containers are linked, Docker will set some environment variables in the target container to enable programmatic discovery of information related to the source container.

还有一些:

In addition to the environment variables, Docker adds a host entry for the source container to the /etc/hosts file. Here's an entry for the web container:

所以,基本上 --link 创建了一组环境变量,并向 /etc/hosts 文件添加了一些条目,以便于交流。但是,容器仍然可以通过 IP 直接访问。

如果您使用 --icc=false 选项启动 docker,默认情况下容器无法相互通信。您必须使用 --link 连接两个容器。