Linking Containers Together
Docker container中services/applications与主机或者其它containers之间通信的两种方式
port mapping(端口映射)
container linking(容器连接)
Connect using Network port mapping
使用端口映射来连接
常用的命令(以training/webapp
为例):
docker run -d -P traning/webapp ...
docker run -d -p traning/webapp ...
-P
flag
当container被创建并且运行时,-P标记立刻生效
它container内部的任意端口映射到docker host的port
Docker host的port是随机的
它的生命力是短暂的(容器停止后端口映射就会失效)
e.g.
adolph@geek:~$ docker run -d -P training/webapp python app.py
3f30e81a01cdf9895a70828beebea32910f848ac00f92303e6af77faeee1db0a
adolph@geek:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f30e81a01cd training/webapp:latest "python app.py" 8 seconds ago Up 8 seconds 0.0.0.0:32769->5000/tcp agitated_hawking
内部的5000端口映射到外部的主机的32769
端口
-p
flag
可以指定container内外的端口
内外的5000端口映射
docker run -d -p 5000:5000 training/webapp python app.py
adolph@geek:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cf6bd021034d training/webapp:latest "python app.py" 4 seconds ago Up 2 seconds 0.0.0.0:5000->5000/tcp compassionate_lalande
这样做的不好的地方在于你只把congtainer内外的5000端口映射在一起,container内的其它端口被抛弃了
映射到主机的××端口
docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
映射到主机的某个随机端口
docker run -d -p 127.0.0.1::5000 training/webapp python app.py
注意127.0.0.1:
有个冒号
-p参数使用的次数很多,主要用来配置多个端口
Connect with the linking system
Docker有自带的
linking system
用来连接多个container,并且允许从一个container发送信息到另一个。发送信息的称为source container
,接收信息的称为recipient container
,recipient container智能看到一些经过筛选的关于source container的某些信息
The importance of naming
Docker依赖于容器的名字来建立连接,Docker启动容器时会自动给它起个名字,当然你也可以自己命名
命名有两个非常棒的好处:
告知container的作用或者属于哪种类型,如
traning/webapp
可以看出是webapp的container方便Docker通过name指定container
在运行container时通过--name
标记来命名新的container
adolph@geek:~$ docker run -d -P --name web training/webapp python app.py
1be7fc1ca8f9b683a8c309a1f6315c65819db15e8105ddd1b198e50c4082842f
adolph@geek:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1be7fc1ca8f9 training/webapp:latest "python app.py" 4 seconds ago Up 3 seconds 0.0.0.0:32770->5000/tcp web
adolph@geek:~$ docker inspect -f "{{.Name}}" 1be7f
/web
<span style="color:red;">注意:</span>container的name必须是唯一的,比如说刚才的web
,如果你想给另一个容器起名为web
,那只能把原来的web
container删除(docker rm [-f])。另外,docker run --rm --name..
会在容器停止运行后立即删除
Communication across links
通过连接通信
links允许容器发现对方并且建立安全的信息传输通道,link创建好后容器间通信的通道就建立好了。
注意事项:
需要运行的两个容器不能重名
不能和其它已经存在的(不管有没有运行)容器重名
docker ps -a
查看所有容器的信息docker rm [container name]
删除容器
link代码
--link <name or id>:alias
name or id
指我们要连接的container的名字
shell1的代码(我在一个shell中运行这些命令总会有1个容器在启动后就EXIT(0)
)
adolph@geek:~$ docker run -i -t --name db adolph/ubuntu:14.04
root@a1bb409128b9:/#
shell2
adolph@geek:~$ docker run -d -P --name web --link db:db training/webapp python app.py
09fed08b63e709e61d17f698ccec55a6d04ddb6e33c1aea3879f78d1970451ce
adolph@geek:~$ docker inspect -f "{{.HostConfig.Links}}" web
[/db:/web/db]
we can see that the
web
container is now linked to thedb
containerweb/db
. Which allows it to access information about the db container.
recipient container | source container |
---|---|
web | db |
为了做到容器间的通信,Docker没有使用端口,而是自己建立了tunnel
(隧道),使用link
连接容器的好处是我们不需要将source container
的端口暴露给网络,Docker的tunnel使用两种方式实现连接:
Environment variables(环境变量)
Updating the /etc/hosts file(更新
/etc/hosts
文件)
环境变量
当我们连接容器是Docker会创建很多环境变量,并且它会在目标容器自动基于
--link
后面的参数创建环境变量。Docker会公开来自source container
的所有环境变量,这些变量包括:
the ENV commands in the source container's Dockerfile(源容器Dockerfile中的
ENV
命令)the
-e
,--env
and--env-file
options on the docker run command when the source container is started(容器运行时run
后面的-e
,--env
和--env-file
参数)
这些环境变量允许我们通过编程从目标容器发现来自源容器的信息
警告:理解docker link连接容器的机制很重要,link允许所有目标容器获得源容器的指定数据和信息,所以从安全性的角度,不建议在源容器中存储敏感的数据
一些环境变量
<alias>_NAME
docker run -d -P --name web --link db:db training/webapp python app.py
这个变量是为目标容器建立的,如上,--link db:db
后web
容器被链接到db
容器,这是Docker会在web
容器中创建DB_NAME=/web/db
<name>_PORT_<port>_<protocol>
Docker为每一个源容器暴露的每一个端口。
<name>指--link中指定的目标容器的别名
<port>源容器暴露的端口号
<protocol> TCP或UDP
Docker使用不同的前缀格式来规定3种不同的环境变量:
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.
每一组环境变量对应一个端口,如果容器公开多个端口(比如3个),Docker就会创建9个环境变量,每个端口3个。
此外,Docker还会为源容器
第一个公开的端口创建<alias>_PORT
,这里的第一个
指的是具有lowest port
的端口。例如:WEBDB_PORT=tcp://172.17.0.82:8080
,如果它吗满足tcp和udp,那指的是tcp
最后,Docker还会创建这样一个变量:<alias>_ENV_<name>
,用来连接源容器和目标容器的桥梁。Docker使用这个值来启动源容器。
e.g:
adolph@geek:~$ sudo docker run --rm --name web2 --link db:db training/webapp env
[sudo] password for adolph:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=20fb0166d9c6
DB_NAME=/web2/db
HOME=/
我的电脑上并没有看到环境变量!可能因为我的db容器和官网例子上的容器不一直吧,而且我的db容器中并没有安装数据库。
Docker创建的这些变量有助于我们用来连接和配置源容器里的工具,比如连接数据库...
Updating the /etc/hosts file
更新
/etc/hosts
文件
这部分自己有不懂的地方,以后慢慢看吧。
总结
连接容器的两种方法
-p
,-P
标记
link system
容器的命名是唯一的,不能重复。可以更改容器的名字
docker rename oldname newname
--link <name or id>:alias,name指要连接的容器,alais指目标容器/简称
能够清除代码中那个是目标容器,哪个是源容器,资源开放共享的方向
docker run -d -P --name web --link db:webdb training/webapp python app.py
这条命令中db
是要连接的容器,是源容器,web是目标容器,webdb是web的别称
adolph@geek:~$ docker inspect -f "{{.HostConfig.Links}}" web
[/db:/web/webdb]
都是个人理解,可能有错误,还请指正。
Linking Containers Together相关推荐
- Docker多容器连接-以Nginx+PHP为例
Docker提供了多个容器直接访问的方法,最简单的方式是直接使用端口映射-p参数指定映射的端口或者-P映射所有端口,多个容器直接通过网络端口进行访问. 但网络端口映射方式并不是Docker中连接多个容 ...
- docker官方文档中的dns,link,expose,publish
link是过时的了,尽量不要用. dns内部集成,也可以用外部. expose只是用于记录,并不真的. publish是否起作用,也要看情况,是否被占用端口. -------------------- ...
- Docker 原理、学习教程
From:https://blog.csdn.net/dataiyangu/article/details/82260586 Docker 常用命令总结:https://blog.csdn.net/i ...
- 能从入门到精通的 Docker 学习指南
原文链接:https://blog.opskumu.com/docker.html 作者:Kumu 这是一份我一直参考的 Docker 学习指南,最近感觉访问慢了很多,发在公众号里留作备份也分享给大家 ...
- 转,docker学习笔记
一.Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub: 用于分享.管理 Docker 容器的 Docker SaaS 平台 -- Docke ...
- 利用ambassador实现container跨主机连接
针对于同一个主机上的两个Container,我们可以使用Docker的link机制来它们之间的连接,具体的连接方式可以参照docker主页的文章Linking Containers Together, ...
- 非常详细的 Docker 学习笔记
一.Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub: 用于分享.管理 Docker 容器的 Docker SaaS 平台 -- Docke ...
- 非常详细的Docker学习教程
一.Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub: 用于分享.管理 Docker 容器的 Docker SaaS 平台 -- Docke ...
- 深入理解docker的link机制
什么是docker的link机制 同一个宿主机上的多个docker容器之间如果想进行通信,可以通过使用容器的ip地址来通信,也可以通过宿主机的ip加上容器暴露出的端口号来通信,前者会导致ip地址的硬编 ...
最新文章
- 手写体数字识别(理解起来更简单一点)
- SQL基础整理(事务)
- gamma校正_什么是Gamma校正?
- HDU 3549 Flow Problem (网络流板子)
- Android与Js交互时,屏幕不适配问题
- Selenium 控制浏览器
- MapInfo开发心得——控件篇
- helpdesk2 foxmail和outlook互导问题
- 游戏BOSS关卡的设计
- median _matlab 中值滤波函数
- 区块链普惠云签扶持计划 京东数科助力中小企业复工复产
- 千兆以太网PHY芯片调试-88E1111(RGMII接口-数据收发ECHO测试) Verilog实现python测试
- Ceph 命令 pool image 纠删
- 【江苏省大学生核心就业能力培训(笔记)】
- C++函数之递归调用
- 数据库如何修改编码格式?
- Bilinear CNN Faster代码解读
- AutoCAD快速入门(二十四):修改标注
- HTML|页面结构分析
- aws iam入门之简介