首页 » 翻译 » Docker » 正文

Docker 入门教程05 关联两个容器 第二部分

原文地址:https://docs.docker.com/userguide/dockerlinks/

使用“链接系统”关联容器

网络端口映射并不是唯一一种连接两个容器的方式,Docker还有一个“链接系统”允许我们连接多个容器,并发送网络数据从一个容器到另外一个容器,当容器被链接之后,源容器的一些信息就能够被发送到与之链接的容器,这样一来,被链接的容器就可以看到源容器的部分数据

命名的重要性
想要建立链接,Docker依赖两个容器的名字,我们在之前的例子中就已经看到了系统自动给我们生成的名称,(如上节课中的hungry_ardinghelli),但是,这个名字我们可能比较难记忆,我们也可以手挡命名容器的名称而不是让系统来自动给我们生成,命名提供了两个非常有用的功能

1:我们可以根据容器的作用来命名,比如做web前端的我们命名为web,这样的话比较容易记忆

2:命名给我们提供了一个可以作为链接的参考点,比如,我们想把容器web和容器db链接起来

下面我们看一个例子

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

–name 的作用就是命名了,我们可以使用docker ps来查看


[root@fedora ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
13ff2cb5113a training/webapp "python app.py" 4 seconds ago Up 3 seconds 0.0.0.0:32769->5000/tcp web
c637a4b0039b training/webapp "python app.py" 3 days ago Up 3 days 0.0.0.0:32768->5000/tcp hungry_ardinghelli
[root@fedora ~]#

通过链接来传递数据

链接允许容器之间去发现对方,并安全的在容器之间传输数据,当你创建了一个链接,你就在两个容器(源容器和目标容器)之间创建了一个“导管”,目标容器就有权限查看源容器的指定的数据了。如果想创建一个链接,我们要使用参数–link,第一步,创建一个新的容器,这次我们创建一个包含数据库的

docker run -d –name db training/postgres

这样我们就创建了一个包含PostgreSQL的容器。

现在我们要删除之前的web容器,并且创建一个新的web

docker rm web(先要stop docker stop web)

好,我们来创建一个新的web

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

–link 后的第一个db是容器的名称,第二个db是链接的别名,别名的作用我们很快就可以看到(第二个也可以不写)
docker run -d -P –name web –link db training/webapp python app.py

这个时候我们可以看一下web容器的链接情况

docker inspect -f “{{ .HostConfig.Links }}” web

[root@fedora ~]# docker inspect -f "{{ .HostConfig.Links }}" web
[/db:/web/db]
[root@fedora ~]#

我们可以看到现在web容器已经和db容器 /web/db
这个时候web容器就可以使用db容器的一些服务了

那么,链接究竟做了什么,我们已经知道源容器可以把自己的一些信息暴露给目标容器,在我们的例子中,目标容器为web,能够看到数据库的相关数据,为了实现这个目标,Docker在两个容器之间不是用任何的端口映射创建了一个安全的通道,我们在启动db时候并没有使用-P 或者-p的参数,链接的最大好处:我们不需要将我们的数据库暴露到互联网上

源容器暴露自己的连接信息给目标容器通过如下两个方法:

1:环境变量
2:使用 /etc/hosts

环境变量
当你链接到别的容器的时候,docker创建了许多的环境变量,Docker自动的根据–link的参数在目标容器创建了环境变量,这些变量会暴露所有的源容器的信息:
在源容器中执行ENV命令之后的所有参数
-e ,–env –evn-file 参数后包含的参数在我们使用docker run的时候

Docker 设置了 _NAME (alias就是之前的别名,我们例子中的db)给每一个目标容器–link,举个例子

如果一个新的容器叫web,连接到一个db的容器,通过–link db:webdb,那么,docker就会创建一个WEBDB_NAME=/web/webdb 在web这个容器中

docker 还定义了一系列的端口的环境变量,每个变量都有唯一的前缀

_PORT_ _

:例如webdb,就是别名

:端口

:TCP还是UDP

Docker还利用这样的前缀定义了三个比较明显的环境变量

prefix_ADDR变量定义了url的Ip地址,比如WEBDB_PORT_8080_TCP_ADDR=172.17.0.82

prefix_port定义了url端口数字WEBDB_PORT_8080_TCP_PORT=8080

prefix_PROTO定义了url的协议例如:WEBDB_PORT_8080_TCP_PROTO=tcp

如果一个容器暴露了多个端口,那么每个端口都会有这些变量,比如一个容器暴露了4个端口,那么Docker就会创建12个环境变量

另外:Docker还创建了,环境变量_PORT,这个变量是URL暴露的第一个端口,例如WEBDB_PORT=tcp://172.17.0.82:8080,如果变量同时使用了TCP和UDP,那么Tcp就是这个值

Zhiming Zhang

Senior devops at Appannie
一个奔跑在运维路上的胖子
Zhiming Zhang

Latest posts by Zhiming Zhang (see all)