Docker入门8 - 通信 - 容器互联

170 阅读3分钟

容器互联
是一种让多个容器中的应用进行快速交互的方式。它会在源和接收容器之间创建连接关系,接收容器可以通过容器名快速访问到源容器,而不用指定具体的IP地址。\

1.自定义容器命名

为什么要自定义命名?
1.可读性好
2.当要连接其他容器时候(即便重启),也可以使用容器名而不用改变,比如连接web容器到db容器。

--name

docuer run -d -P --name name container

注意
容器的名称是唯一的。如果已经命名了一个叫web的容器,当你要再次使用web这个名称的时候,需要先用docker rm命令删除之前创建的同名容器

Tips: 在执行docker [container] run的时候如果添加--rm标记,则容器在终止后会立刻删除。注意,--rm和-d参数不能同时使用。

2.容器互联
--link name:alias,其中name是要链接的容器的名称,alias是别名

[root@yz117 ~]# docker run -d --name db training/postgres
e2124d1f1db6c92f0b4e5a098b15b06ce046f0f1fbf3c5cbf366200327ed7855
[root@yz117 ~]# docker run -d -P --name web --link db:db training/webapp python app.py
4354dbb6223756d4499c9615c14eddfab4c12e53a3604ab15c99ead5833f41ae
[root@yz117 ~]# docker ps
CONTAINER ID   IMAGE               COMMAND                  CREATED             STATUS             PORTS                                         NAMES
4354dbb62237   training/webapp     "python app.py"          3 seconds ago       Up 2 seconds       0.0.0.0:49156->5000/tcp, :::49156->5000/tcp   web
e2124d1f1db6   training/postgres   "su postgres -c '/us…"   45 seconds ago      Up 45 seconds      5432/tcp                                      db

Docker相当于在两个互联的容器之间创建了一个虚机通道,而且不用映射它们的端口到宿主主机上。 在启动db容器的时候并没有使用-p和-P标记,从而避免了暴露数据库服务端口到外部网络上。

为容器公开连接信息的两种方式
更新环境变量

[root@yz117 ~]# docker run --rm --name web2 --link db:db training/webapp env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=e26d309482e4
其中DB_开头的环境变量是供web容器连接db容器使用,前缀采用大写的连接别名。
DB_PORT=tcp://172.17.0.3:5432
DB_PORT_5432_TCP=tcp://172.17.0.3:5432
DB_PORT_5432_TCP_ADDR=172.17.0.3
DB_PORT_5432_TCP_PORT=5432
DB_PORT_5432_TCP_PROTO=tcp
DB_NAME=/web2/db
DB_ENV_PG_VERSION=9.3
HOME=/root

更新/etc/hosts文件。使用env命令来查看web容器的环境变量

[root@yz117 ~]# docker run -t -i --rm --link db:db training/webapp cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
这里有2个hosts信息,第一个是db容器的IP和主机名,第二个是web容器,web容器用自己的id作为默认主机名。
172.17.0.3      db e2124d1f1db6
172.17.0.6      b8a0c7994b05

利用ping来验证容器互联

[root@yz117 ~]# docker run -t -i --rm --link db:db training/webapp /bin/bash
root@5db3d788d886:/opt/webapp# apt-get install -yqq inetutils-ping
(Reading database ... 18233 files and directories currently installed.)
Removing ubuntu-minimal (1.325) ...
Removing iputils-ping (3:20121221-4ubuntu1.1) ...
Selecting previously unselected package inetutils-ping.
(Reading database ... 18221 files and directories currently installed.)
Preparing to unpack .../inetutils-ping_2%3a1.9.2-1_amd64.deb ...
Unpacking inetutils-ping (2:1.9.2-1) ...
Setting up inetutils-ping (2:1.9.2-1) ...
root@5db3d788d886:/opt/webapp# ping db
PING db (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: icmp_seq=0 ttl=64 time=0.152 ms
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.085 ms

Tips: 在生产环境中,网络方面的需求更加复杂和多变,包括跨主机甚至跨数据中心的通信,这时候往往就需要引入额外的机制,例如SDN(软件定义网络)或NFV(网络功能虚拟化)的相关技术