原文地址: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 设置了
如果一个新的容器叫web,连接到一个db的容器,通过–link db:webdb,那么,docker就会创建一个WEBDB_NAME=/web/webdb 在web这个容器中
docker 还定义了一系列的端口的环境变量,每个变量都有唯一的前缀
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还创建了,环境变量
Latest posts by Zhiming Zhang (see all)
- aws eks node 自动化扩展工具 Karpenter - 8月 10, 2022
- ReplicationController and ReplicaSet in Kubernetes - 12月 20, 2021
- public key fingerprint - 5月 27, 2021