首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

旧容器链接(引擎) | Legacy container links (Engine)

本节中的信息解释bridge了在安装 Docker 时自动创建的 Docker 默认网络中的旧容器链接。

在 Docker 网络功能之前,您可以使用 Docker 链接功能来允许容器相互发现并安全地将有关一个容器的信息传输到另一个容器。通过引入 Docker 网络功能,您仍然可以创建链接,但它们在默认bridge网络和用户定义网络之间的行为不同。

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

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

使用网络端口映射连接

假设您使用此命令来运行简单的 Python Flask 应用程序:

代码语言:javascript
复制
$ docker run -d -P training/webapp python app.py

注意:容器具有内部网络和IP地址。Docker 可以有多种网络配置。您可以在这里看到有关 Docker 网络的更多信息。

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

代码语言:javascript
复制
$ 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:

代码语言:javascript
复制
$ docker run -d -p 80:5000 training/webapp python app.py

你也看到了为什么这不是一个好主意,因为它限制你在那个特定的港口上只有一个集装箱。

相反,您可以指定一系列主机端口,以便将容器端口绑定到与默认端口不同的位置。短时端口范围*

代码语言:javascript
复制
$ docker run -d -p 8000-9000:5000 training/webapp python app.py

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

还有一些其他方法可以配置-p旗子。默认情况下,-p标志将指定的端口绑定到主机上的所有接口。但是,您还可以指定绑定到特定接口,例如,仅将绑定指定到localhost...

代码语言:javascript
复制
$ docker run -d -p 127.0.0.1:80:5000 training/webapp python app.py

这将将容器内的端口5000绑定到localhost127.0.0.1主机上的接口。

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

代码语言:javascript
复制
$ docker run -d -p 127.0.0.1::5000 training/webapp python app.py

还可以通过添加尾随来绑定UDP端口。/udp例如:

代码语言:javascript
复制
$ docker run -d -p 127.0.0.1:80:5000/udp training/webapp python app.py

你也学到了有用的东西docker port显示当前端口绑定的快捷方式。这对于显示特定的端口配置也很有用。例如,如果您已经将容器端口绑定到localhost在主机上,然后docker port产出将反映这一点。

代码语言:javascript
复制
$ docker port nostalgic_morse 5000

127.0.0.1:49155

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

与连接系统连接

本节将介绍默认情况下的遗留链接功能。bridge网络。请参阅在用户定义的网络中连接容器有关用户定义网络中链接的更多信息。

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

命名的重要性

要建立链接,Docker依赖于容器的名称。您已经看到,您创建的每个容器都有一个自动创建的名称;实际上,您已经熟悉了我们的老朋友nostalgic_morse在这个指南里。您也可以自己命名容器。这个命名提供了两个有用的功能:

  1. 将执行特定功能的容器命名为使您更容易记住它们的方法是有用的,例如命名包含web应用程序的容器。web...
  1. 它为Docker提供了一个引用点,允许它引用其他容器,例如,可以指定链接容器web到集装箱db...

您可以使用--name例如,国旗:

代码语言:javascript
复制
$ docker run -d -P --name web training/webapp python app.py

这将启动一个新容器,并使用--name标志以命名容器web.您可以使用docker ps命令。

代码语言:javascript
复制
$ 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,然后才能创建同名的新容器。作为替代,您可以使用--rmdocker run命令。这将在容器停止后立即删除它。

跨链路通信

链接允许容器彼此发现并安全地将有关一个容器的信息传输到另一个容器。设置链接时,可以在源容器和收件人容器之间创建管道。然后,收件人可以访问有关源的选择数据。若要创建链接,请使用--link旗子。首先,创建一个新容器,这次是一个包含数据库的容器。

代码语言:javascript
复制
$ docker run -d --name db training/postgres

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

现在,您需要删除web之前创建的容器,以便用链接的容器替换它:

代码语言:javascript
复制
$ docker rm -f web

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

代码语言:javascript
复制
$ docker run -d -P --name web --link db:db training/webapp python app.py

这将连接新的web容器db您之前创建的容器。大--link国旗形式如下:

代码语言:javascript
复制
--link <name or id>:alias

何地name是我们链接到的容器的名称,并且alias是链接名的别名。您很快就会看到这个别名是如何使用的。大--link标志还采取以下形式:

代码语言:javascript
复制
--link <name or id>

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

代码语言:javascript
复制
$ docker run -d -P --name web --link db training/webapp python app.py

接下来,使用docker inspect*

代码语言:javascript
复制
$ 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命令列出指定容器的环境变量。

代码语言:javascript
复制
    $ 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集装箱。

关于码头环境变量的重要注记

不像/etc/hosts档案,如果重新启动源容器,存储在环境变量中的IP地址不会自动更新。我们建议在/etc/hosts若要解析链接容器的IP地址,请执行以下操作。

这些环境变量仅为容器中的第一个进程设置。一些守护进程,例如sshd,当它们产卵时,会擦洗它们以连接。

更新/etc/hosts档案

除了环境变量之外,Docker还将源容器的主机项添加到/etc/hosts档案。这里有一个条目web集装箱:

代码语言:javascript
复制
$ 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集装箱。除了您提供的别名之外,链接容器的名称-如果是唯一的,则从提供给--link参数-并且链接容器的主机名也将被添加到/etc/hosts用于链接容器的IP地址。您现在可以通过以下任何一个条目来平该主机:

代码语言:javascript
复制
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容器使用其主机项,该条目解析为172.17.0.5.您可以使用此主机项配置应用程序以使用db集装箱。

::可以将多个收件人容器链接到单个源。例如,可以将多个%28不同名称的web容器附加到db集装箱。

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

代码语言:javascript
复制
$ 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

扫码关注腾讯云开发者

领取腾讯云代金券