旧版容器链接

警告

--linkflag 是 Docker 的遗留功能。它可能最终 被删除。除非您绝对需要继续使用它,否则我们建议您使用 用户定义的网络,以促进两个容器之间的通信,而不是使用--link.用户定义的网络不支持的一项功能,您可以执行 跟--link在容器之间共享环境变量。然而 您可以使用其他机制(例如卷)来共享环境变量 以更可控的方式在容器之间。

请参阅用户定义的网桥和默认网桥之间的差异,了解使用--link.

本节中的信息介绍了 Docker 默认bridge网络,该网络在安装时自动创建 Docker。

Docker 网络功能之前,您可以使用 Docker 链接功能允许容器安全地发现彼此 将有关一个容器的信息传输到另一个容器。使用 引入 Docker 网络功能,您仍然可以创建链接,但它们 默认bridgenetwork 和 user defined networks

本节简要讨论通过网络端口进行连接,然后进入 默认容器链接的详细信息bridge网络。

使用网络端口映射进行连接

假设您使用以下命令运行一个简单的 Python Flask 应用程序:

$ docker run -d -P training/webapp python app.py

注意

容器具有内部网络和 IP 地址。 Docker 可以具有多种网络配置。你可以看到更多 有关 Docker 网络的信息

创建该容器后,-P标志用于自动映射 将其内部的任何网络端口连接到临时端口内的随机高端口 范围。接下来,当docker ps已运行,您看到那个端口 5000 绑定到主机上的端口 49155。

$ docker ps nostalgic_morse

CONTAINER ID  IMAGE                   COMMAND       CREATED        STATUS        PORTS                    NAMES
bc533791f3f5  training/webapp:latest  python app.py 5 seconds ago  Up 2 seconds  0.0.0.0:49155->5000/tcp  nostalgic_morse

您还了解了如何使用 这-p旗。此处,主机的端口 80 映射到 容器:

$ docker run -d -p 80:5000 training/webapp python app.py

您明白了为什么这不是一个好主意,因为它限制了您 该特定端口上只有一个容器。

相反,您可以指定要将容器端口绑定到的主机端口范围 这与默认的临时端口范围不同:

$ docker run -d -p 8000-9000:5000 training/webapp python app.py

这会将容器中的端口 5000 绑定到随机可用的端口 在 8000 到 9000 之间。

还有一些其他方法可以配置-p旗。由 默认使用-pflag 将指定的端口绑定到 主机。但您也可以指定对特定 接口,例如仅连接到localhost.

$ docker run -d -p 127.0.0.1:80:5000 training/webapp python app.py

这会将容器内的端口 5000 绑定到localhost127.0.0.1interface 的 API 中。

或者,要将容器的端口 5000 绑定到动态端口,但仅在localhost,您可以使用:

$ docker run -d -p 127.0.0.1::5000 training/webapp python app.py

您还可以通过添加尾随来绑定 UDP 和 SCTP(通常由 SIGTRAN、Diameter 和 S1AP/X2AP 等电信协议使用)端口/udp/sctp.例如:

$ docker run -d -p 127.0.0.1:80:5000/udp training/webapp python app.py

您还了解了docker port快捷方式,它向我们展示了 当前端口绑定。这对于显示特定端口也很有用 配置。例如,如果您已将容器端口绑定到localhost在主机上,则docker port输出反映了这一点。

$ docker port nostalgic_morse 5000

127.0.0.1:49155

注意

-p标志可以多次使用来配置多个端口。

连接链接系统

注意

本节介绍默认bridge网络。 有关用户定义网络中链接的更多信息,请参阅用户定义网桥和默认网桥之间的差异

网络端口映射并不是 Docker 容器可以连接到一个 另一个。Docker 还有一个链接系统,允许您链接多个 容器一起发送连接信息,并将连接信息从一个容器发送到另一个容器。什么时候 containers 的 收件人容器。这允许收件人查看描述的选定数据 源容器的方面。

命名的重要性

为了建立链接,Docker 依赖于容器的名称。 您已经看到,您创建的每个容器都有一个自动 created 名称;您确实已经熟悉我们的老朋友了nostalgic_morse在本指南中。您还可以命名容器 你自己。此命名提供了两个有用的功能:

  1. 以某种方式命名执行特定功能的容器可能很有用 这样您可以更轻松地记住它们,例如,将 包含 Web 应用程序的容器web.

  2. 它为 Docker 提供了一个参考点,允许它引用其他 containers 等,您可以指定链接容器web到容器db.

您可以使用--nameflag 的 intent 示例:

$ docker run -d -P --name web training/webapp python app.py

这将启动一个新容器并使用--nameflag 设置为 为容器命名web.您可以使用docker ps命令。

$ docker ps -l

CONTAINER ID  IMAGE                  COMMAND        CREATED       STATUS       PORTS                    NAMES
aed84ee21bde  training/webapp:latest python app.py  12 hours ago  Up 2 seconds 0.0.0.0:49154->5000/tcp  web

您还可以使用docker inspect以返回容器的名称。

注意

容器名称必须唯一。这意味着您只能调用 一个集装箱web.如果要重复使用容器名称,则必须删除 旧容器(带有docker container rm),然后才能创建新的 容器。作为替代方法,您可以使用--rmflag 替换为docker run命令。这将删除容器 在它停止后立即。

链接允许容器相互发现并安全地传输信息 关于一个容器到另一个容器。设置链接时,您需要创建一个 源容器和收件人容器之间的管道。收件人可以 然后访问 Select Data about the source.要创建链接,请使用--link旗。首先,创建一个新容器,这次是一个包含数据库的容器。

$ docker run -d --name db training/postgres

这将创建一个名为dbtraining/postgresimage,其中包含 PostgreSQL 数据库。

现在,您需要删除web容器,以便可以替换它 替换为链接的:

$ docker container rm -f web

现在,创建一个新的web容器并将其与您的db容器。

$ docker run -d -P --name web --link db:db training/webapp python app.py

这会将新的web容器的db您创建的容器 早些时候。这--linkflag 采用以下形式:

--link <name or id>:alias

哪里name是我们要链接到的容器的名称,alias是一个 alias 作为链接名称。该别名很快就会用到。 这--linkflag 也采用以下形式:

--link <name or id>

在这种情况下,别名与名称匹配。你可以编写前面的 示例为:

$ docker run -d -P --name web --link db training/webapp python app.py

接下来,使用docker inspect:

$ docker inspect -f "{{ .HostConfig.Links }}" web

[/db:/web/db]

您可以看到,web容器现在已链接到db容器web/db.这允许它访问有关db容器。

那么链接容器实际上是做什么的呢?您已经了解到,链接允许 source 容器向接收者容器提供有关自身的信息。在 我们的示例,接收者web可以访问有关源的信息db.待办事项 这样,Docker 会在容器之间创建一个不需要 在容器外部公开任何端口;当我们启动db容器中,我们也没有使用-P-p标志。这是一个很大的好处 linking:我们不需要将源容器(这里是 PostgreSQL 数据库)暴露给 网络。

Docker 将源容器的连接信息公开给 收件人容器:

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

环境变量

Docker 会在您链接容器时创建多个环境变量。Docker 根据 Target 容器自动创建环境变量 这--link参数。它还公开了所有环境变量 源自源容器的 Docker。这些变量包括:

  • ENV命令
  • -e,--env--env-file选项docker run命令

这些环境变量支持从 与源容器相关的信息的目标容器。

警告

重要的是要了解源自 对任何容器都可用 链接到它。如果敏感,则可能会产生严重的安全隐患 数据存储在其中。

Docker 将<alias>_NAME每个目标容器的环境变量 列在--link参数。例如,如果名为web链接到名为db通过--link db:webdb, 然后 Docker 会创建一个WEBDB_NAME=/web/webdb变量在web容器。

Docker 还为 source 容器中。每个变量在格式中都有一个唯一的前缀<name>_PORT_<port>_<protocol>

此前缀中的组件是:

  • 别名<name>--link参数(例如webdb)
  • <port>暴露的数量
  • 一个<protocol>即 TCP 或 UDP

Docker 使用此前缀格式来定义三个不同的环境变量:

  • prefix_ADDR变量包含来自 URL 的 IP 地址,对于 例WEBDB_PORT_5432_TCP_ADDR=172.17.0.82.
  • prefix_PORT变量仅包含 URL 中的端口号 例WEBDB_PORT_5432_TCP_PORT=5432.
  • prefix_PROTO变量仅包含 例WEBDB_PORT_5432_TCP_PROTO=tcp.

如果容器公开多个端口,则环境变量设置为 为每个 1 个定义。这意味着,例如,如果一个容器公开了 4 个端口 Docker 创建 12 个环境变量,每个端口有 3 个。

此外,Docker 还会创建一个名为<alias>_PORT. 此变量包含源容器的第一个公开端口的 URL。 “第一个”端口定义为具有最小编号的公开端口。 例如,考虑WEBDB_PORT=tcp://172.17.0.82:5432变量。如果 该端口同时用于 TCP 和 UDP,然后指定 TCP 端口。

最后,Docker 还公开了每个 Docker 发起的环境变量 作为目标中的环境变量。对于每个 变量 Docker 会创建一个<alias>_ENV_<name>目标中的 variable 容器。变量的值设置为 Docker 在使用 启动源容器。

回到我们的数据库示例,您可以运行env命令列出指定容器的环境变量。

$ docker run --rm --name web2 --link db:db training/webapp env

<...>
DB_NAME=/web2/db
DB_PORT=tcp://172.17.0.5:5432
DB_PORT_5432_TCP=tcp://172.17.0.5:5432
DB_PORT_5432_TCP_PROTO=tcp
DB_PORT_5432_TCP_PORT=5432
DB_PORT_5432_TCP_ADDR=172.17.0.5
<...>

你可以看到 Docker 已经用 有关源的有用信息db容器。每个变量都带有前缀 跟DB_,它由alias您在上面指定。如果aliasdb1,则变量将以DB1_.您可以使用这些 环境变量来配置应用程序以连接到数据库 在db容器。连接是安全和私密的;只有 联系web容器可以与db容器。

有关 Docker 环境变量的重要说明

/etc/hosts文件, 存储在环境变量中的 IP 地址不会自动更新 如果源容器已重新启动。我们建议使用/etc/hosts解析链接容器的 IP 地址。

这些环境变量仅针对 容器。一些守护进程(例如sshd、在生成 shell 时擦洗它们 用于连接。

更新/etc/hosts文件

除了环境变量之外,Docker 还为 source 容器添加到/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 作为主机名的容器。第二个条目使用 link 别名引用db容器。除了 您提供的别名,链接容器的名称(如果与别名不同) 提供给--link参数,链接容器的主机名为 还添加到/etc/hosts以获取链接容器的 IP 地址。您可以 ping 该主机通过以下任何条目:

root@aed84ee21bde:/opt/webapp# 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因为它没有被包括 最初在容器中。

在这里,您使用了ping命令对db容器使用其 host 条目, 解析为172.17.0.5.您可以使用此主机条目来配置应用程序 要利用您的db容器。

注意

您可以将多个收件人容器链接到单个源。为 例如,您可以将多个(名称不同)Web 容器附加到您的db容器。

如果重新启动源容器,则/etc/hosts链接容器上的文件 会自动使用源容器的新 IP 地址进行更新, 允许链接通信继续。

$ docker restart db
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