旧版容器链接
警告
这
--link
flag 是 Docker 的遗留功能。它可能最终 被删除。除非您绝对需要继续使用它,否则我们建议您使用 用户定义的网络,以促进两个容器之间的通信,而不是使用--link
.用户定义的网络不支持的一项功能,您可以执行 跟--link
在容器之间共享环境变量。然而 您可以使用其他机制(例如卷)来共享环境变量 以更可控的方式在容器之间。请参阅用户定义的网桥和默认网桥之间的差异,了解使用
--link
.
本节中的信息介绍了
Docker 默认bridge
网络,该网络在安装时自动创建
Docker。
在 Docker 网络功能之前,您可以使用
Docker 链接功能允许容器安全地发现彼此
将有关一个容器的信息传输到另一个容器。使用
引入 Docker 网络功能,您仍然可以创建链接,但它们
默认bridge
network 和 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
旗。由
默认使用-p
flag 将指定的端口绑定到
主机。但您也可以指定对特定
接口,例如仅连接到localhost
.
$ docker run -d -p 127.0.0.1:80:5000 training/webapp python app.py
这会将容器内的端口 5000 绑定到localhost
或127.0.0.1
interface 的 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
在本指南中。您还可以命名容器
你自己。此命名提供了两个有用的功能:
以某种方式命名执行特定功能的容器可能很有用 这样您可以更轻松地记住它们,例如,将 包含 Web 应用程序的容器
web
.它为 Docker 提供了一个参考点,允许它引用其他 containers 等,您可以指定链接容器
web
到容器db
.
您可以使用--name
flag 的 intent 示例:
$ docker run -d -P --name web training/webapp python app.py
这将启动一个新容器并使用--name
flag 设置为
为容器命名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
),然后才能创建新的 容器。作为替代方法,您可以使用--rm
flag 替换为docker run
命令。这将删除容器 在它停止后立即。
跨链接通信
链接允许容器相互发现并安全地传输信息
关于一个容器到另一个容器。设置链接时,您需要创建一个
源容器和收件人容器之间的管道。收件人可以
然后访问 Select Data about the source.要创建链接,请使用--link
旗。首先,创建一个新容器,这次是一个包含数据库的容器。
$ docker run -d --name db training/postgres
这将创建一个名为db
从training/postgres
image,其中包含 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
您创建的容器
早些时候。这--link
flag 采用以下形式:
--link <name or id>:alias
哪里name
是我们要链接到的容器的名称,alias
是一个
alias 作为链接名称。该别名很快就会用到。
这--link
flag 也采用以下形式:
--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
您在上面指定。如果alias
是db1
,则变量将以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