©
本文档使用
php.cn手册 发布
本节中的信息解释bridge
了在安装 Docker 时自动创建的
Docker 默认网络中的旧容器链接。
在 Docker 网络功能之前,您可以使用 Docker 链接功能来允许容器相互发现并安全地将有关一个容器的信息传输到另一个容器。通过引入 Docker 网络功能,您仍然可以创建链接,但它们在默认bridge
网络和用户定义网络之间的行为不同。
本节简要讨论通过网络端口进行连接,然后详细介绍默认bridge
网络中的容器链接。
警告:该
--link
标志是 Docker 的弃用遗留功能。它最终可能会被删除。除非您绝对需要继续使用它,否则我们建议您使用用户定义的网络来促进两个容器之间的通信而不是使用--link
。用户定义的网络不支持的一个功能--link
是在容器之间共享环境变量。但是,您可以使用其他机制(如卷)以更受控制的方式在容器之间共享环境变量。
假设您使用此命令来运行简单的 Python Flask 应用程序:
$ docker run -d -P training/webapp python app.py
注意:容器具有内部网络和IP地址。Docker 可以有多种网络配置。您可以在这里看到有关 Docker 网络的更多信息。
创建该容器时,该-P
标志用于自动将其内部的任何网络端口映射到 Docker 主机上临时端口范围内的随机高端口。接下来,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映射到容器的端口5000:
$ 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
标志将指定的端口绑定到主机上的所有接口。但是,您还可以指定绑定到特定接口,例如,仅将绑定指定到localhost
...
$ docker run -d -p 127.0.0.1:80:5000 training/webapp python app.py
这将将容器内的端口5000绑定到localhost
或127.0.0.1
主机上的接口。
或者,将容器的端口5000绑定到动态端口,但仅在localhost
,你可以:
$ docker run -d -p 127.0.0.1::5000 training/webapp python app.py
还可以通过添加尾随来绑定UDP端口。/udp
例如:
$ 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 5000127.0.0.1:49155
注*
-p
可以多次使用标志来配置多个端口。
注本节将介绍默认情况下的遗留链接功能。
bridge
网络。请参阅在用户定义的网络中连接容器有关用户定义网络中链接的更多信息。
网络端口映射并不是Docker容器相互连接的唯一方式。Docker还有一个链接系统,允许您将多个容器连接在一起,并从一个容器到另一个容器发送连接信息。链接容器时,可以将有关源容器的信息发送到收件人容器。这允许收件人查看所选数据描述源容器的各个方面。
要建立链接,Docker依赖于容器的名称。您已经看到,您创建的每个容器都有一个自动创建的名称;实际上,您已经熟悉了我们的老朋友nostalgic_morse
在这个指南里。您也可以自己命名容器。这个命名提供了两个有用的功能:
将执行特定功能的容器命名为使您更容易记住它们的方法是有用的,例如命名包含web应用程序的容器。web
...
它为Docker提供了一个引用点,允许它引用其他容器,例如,可以指定链接容器web
到集装箱db
...
您可以使用--name
例如,国旗:
$ docker run -d -P --name web training/webapp python app.py
这将启动一个新容器,并使用--name
标志以命名容器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
.如果要重用容器名称,必须删除旧容器%28docker rm
%29,然后才能创建同名的新容器。作为替代,您可以使用--rm
带docker run
命令。这将在容器停止后立即删除它。
链接允许容器彼此发现并安全地将有关一个容器的信息传输到另一个容器。设置链接时,可以在源容器和收件人容器之间创建管道。然后,收件人可以访问有关源的选择数据。若要创建链接,请使用--link
旗子。首先,创建一个新容器,这次是一个包含数据库的容器。
$ docker run -d --name db training/postgres
这将创建一个名为db
从training/postgres
图像,其中包含PostgreSQL数据库。
现在,您需要删除web
之前创建的容器,以便用链接的容器替换它:
$ docker rm -f web
现在,创建一个新的web
容器并将其与您的db
集装箱。
$ docker run -d -P --name web --link db:db training/webapp python app.py
这将连接新的web
容器db
您之前创建的容器。大--link
国旗形式如下:
--link <name or id>:alias
何地name
是我们链接到的容器的名称,并且alias
是链接名的别名。您很快就会看到这个别名是如何使用的。大--link
标志还采取以下形式:
--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
集装箱。
那么,连接容器实际上是做什么的呢?您已经了解到,链接允许源容器向收件人容器提供有关自身的信息。在我们的例子中,接受者,web
,可以访问有关源的信息。db
为此,Docker在容器之间创建一个安全隧道,不需要在容器外部公开任何端口;您将注意到,当我们启动db
容器,我们也没有使用-P
或-p
旗子。这是链接的一个巨大好处:我们不需要将源容器(这里是PostgreSQL数据库)公开到网络中。
Docker以两种方式公开源容器到收件人容器的连接信息:
环境变量,
更新/etc/hosts
档案。
当您链接容器时,Docker会创建多个环境变量。控件自动在目标容器中创建环境变量。--link
参数。它还将公开源自源容器的Docker的所有环境变量。这些变量包括:
大ENV
源容器的Dockerfile中的命令
大-e
,,,--env
,和--env-file
上的选项docker run
在启动源容器时发出
这些环境变量可以从目标容器中发现与源容器相关的信息。
警告*重要的是要理解全从容器内的Docker中产生的环境变量可用于任何链接到它的容器。如果将敏感数据存储在其中,这可能会对安全产生严重影响。
码头设置<alias>_NAME
中列出的每个目标容器的环境变量。--link
参数。例如,如果一个新容器调用web
链接到名为db
通孔--link db:webdb
,然后Docker创建一个WEBDB_NAME=/web/webdb
变量中的web
集装箱。
Docker还为源容器公开的每个端口定义了一组环境变量。每个变量在表单中都有一个唯一的前缀:
<name>_PORT_<port>_<protocol>
这个前缀中的组件是:
别名<name>
中指定的--link
参数%28例如,webdb
%29
大<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
变量仅包含来自URL的协议,例如WEBDB_PORT_5432_TCP_PROTO=tcp
...
如果容器公开多个端口,则为每个端口定义一个环境变量集。这意味着,例如,如果容器公开了Docker创建的4个端口,每个端口将创建12个环境变量。
此外,Docker还创建了一个名为<alias>_PORT
此变量包含源容器的第一个公开端口的URL。“第一个”端口被定义为具有最低数目的公开端口。例如,考虑WEBDB_PORT=tcp://172.17.0.82:5432
变量。如果该端口同时用于TCP和UDP,则指定TCP端口。
最后,Docker还将来自源容器的每个Docker源环境变量公开为目标中的环境变量。对于每个变量,Docker创建一个<alias>_ENV_<name>
变量在目标容器中。变量的值设置为启动源容器时使用的值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
集装箱。
不像/etc/hosts
档案,如果重新启动源容器,存储在环境变量中的IP地址不会自动更新。我们建议在/etc/hosts
若要解析链接容器的IP地址,请执行以下操作。
这些环境变量仅为容器中的第一个进程设置。一些守护进程,例如sshd
,当它们产卵时,会擦洗它们以连接。
/etc/hosts
档案除了环境变量之外,Docker还将源容器的主机项添加到/etc/hosts
档案。这里有一个条目web
集装箱:
$ docker run -t -i --rm --link db:webdb training/webapp /bin/bash root@aed84ee21bde:/opt/webapp# cat /etc/hosts172.17.0.7 aed84ee21bde. . .172.17.0.5 webdb 6e5cdeb2d300 db
您可以看到两个相关的主机条目。第一个条目是web
容器,它使用容器ID作为主机名。第二个条目使用链接别名引用db
集装箱。除了您提供的别名之外,链接容器的名称-如果是唯一的,则从提供给--link
参数-并且链接容器的主机名也将被添加到/etc/hosts
用于链接容器的IP地址。您现在可以通过以下任何一个条目来平该主机:
root@aed84ee21bde:/opt/webapp# apt-get install -yqq inetutils-ping root@aed84ee21bde:/opt/webapp# ping webdb PING webdb (172.17.0.5): 48 data bytes56 bytes from 172.17.0.5: icmp_seq=0 ttl=64 time=0.267 ms56 bytes from 172.17.0.5: icmp_seq=1 ttl=64 time=0.250 ms56 bytes from 172.17.0.5: icmp_seq=2 ttl=64 time=0.256 ms
注:在本例中,您将注意到您必须安装
ping
因为它最初没有包含在容器中。
在这里,你用ping
命令,将db
容器使用其主机项,该条目解析为172.17.0.5
.您可以使用此主机项配置应用程序以使用db
集装箱。
注::可以将多个收件人容器链接到单个源。例如,可以将多个%28不同名称的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/hosts172.17.0.7 aed84ee21bde. . .172.17.0.9 db