博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Docker 入门系列(6)- Docker 互联
阅读量:497 次
发布时间:2019-03-07

本文共 4334 字,大约阅读时间需要 14 分钟。

容器互联机制

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

1. 自定义容器命名

连接系统依据容器的名称来执行。虽然当创建容器的时候,系统默认会分配一个名字,但自定义容器名字有两个好处:

  • 自定义的命名比较好记
  • 当要连接其他容器时,即便重启,也可以使用容器名而不用改变

使用 --name 标记可以为容器自定义命名:

wohu@iZm5egn5zptnov4j3oxh4fZ:~/docker$ docker run -d -P --name web training/webapp python app.py57043fa975a05bf03bb9f590a57432dfb06977c70f9ea6b15ede665537b199bdwohu@iZm5egn5zptnov4j3oxh4fZ:~/docker$ docker ps -aCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS                     NAMES57043fa975a0        training/webapp     "python app.py"     5 seconds ago       Up 3 seconds                0.0.0.0:32769->5000/tcp   web4233fd67e97c        training/webapp     "python app.py"     22 hours ago        Up 22 hours                 0.0.0.0:32768->5000/tcp   reverent_blackburnwohu@iZm5egn5zptnov4j3oxh4fZ:~/docker$

也可以使用 docker inspect 来查看容器的名字:

wohu@iZm5egn5zptnov4j3oxh4fZ:~/docker$ docker inspect -f "{
{ .Name }}" 57/webwohu@iZm5egn5zptnov4j3oxh4fZ:~/docker$

容器的名称是唯一的。如果已经命名了一个叫 web 的容器,当你要再次使用 web 这个名称的时候,需要先用 docker rm 来删除之前创建的同名容器。在执行 docker run 的时候如果添加 --rm 标记,则容器在终止后会立刻删除。注意,–rm 和 -d 参数不能同时使用。

2. 容器互联

使用 --link 参数可以让容器之间安全地进行交互。下面先创建一个新的数据库容器:

docker run -d --name db training/postgres

删除之前创建的web容器:

docker rm -f web

然后创建一个新的 web 容器,并将它连接到 db 容器:

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

此时,db 容器和 web 容器建立互联关系:

  • –link参数的格式为 --link name:alias,其中name是要连接的容器名称,alias是这个连接的别名。

使用docker ps来查看容器的连接,如下所示:

wohu@iZm5egn5zptnov4j3oxh4fZ:~/docker$ docker ps -aCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMESed5b3fdd48f0        training/webapp     "python app.py"          8 seconds ago       Up 7 seconds        0.0.0.0:32770->5000/tcp   webbcfcc084bd07        training/postgres   "su postgres -c '/us…"   18 seconds ago      Up 18 seconds       5432/tcp                  db4233fd67e97c        training/webapp     "python app.py"          22 hours ago        Up 22 hours         0.0.0.0:32768->5000/tcp   reverent_blackburnwohu@iZm5egn5zptnov4j3oxh4fZ:~/docker$

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

Docker 通过两种方式为容器公开连接信息:

  • 更新环境变量;
  • 更新/etc/hosts文件;

使用 env 命令来查看 web 容器的环境变量:

wohu@iZm5egn5zptnov4j3oxh4fZ:~/docker$ docker run --rm --name web2 --link db:db training/webapp envPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binHOSTNAME=0c192de8f674DB_PORT=tcp://172.17.0.3:5432DB_PORT_5432_TCP=tcp://172.17.0.3:5432DB_PORT_5432_TCP_ADDR=172.17.0.3DB_PORT_5432_TCP_PORT=5432DB_PORT_5432_TCP_PROTO=tcpDB_NAME=/web2/dbDB_ENV_PG_VERSION=9.3HOME=/rootwohu@iZm5egn5zptnov4j3oxh4fZ:~/docker$

其中 DB_ 开头的环境变量是供 web 容器连接 db 容器使用的,前缀采用大写的连接别名。

除了环境变量之外,Docker 还添加 host 信息到父容器的 /etc/hosts 文件。下面是父容器web的hosts文件:

wohu@iZm5egn5zptnov4j3oxh4fZ:~/docker$ docker run -t -i --rm --link db:db training/webapp /bin/bash root@00c0b5ac4599:/opt/webapp# cat /etc/hosts 127.0.0.1	localhost::1	localhost ip6-localhost ip6-loopbackfe00::0	ip6-localnetff00::0	ip6-mcastprefixff02::1	ip6-allnodesff02::2	ip6-allrouters172.17.0.3	db bcfcc084bd07172.17.0.5	00c0b5ac4599root@00c0b5ac4599:/opt/webapp# exitexitwohu@iZm5egn5zptnov4j3oxh4fZ:~/docker$

这里有两个 hosts 信息,第一个是 web 容器,web 容器用自己的 id 作为默认主机名,第二个是 db 容器的 IP 和主机名。可以在 web 容器中安装 ping 命令来测试与 db 容器的连通:

wohu@iZm5egn5zptnov4j3oxh4fZ:~/docker$ docker exec -it web /bin/bashroot@ed5b3fdd48f0:/opt/webapp# cat /etc/hosts 127.0.0.1	localhost::1	localhost ip6-localhost ip6-loopbackfe00::0	ip6-localnetff00::0	ip6-mcastprefixff02::1	ip6-allnodesff02::2	ip6-allrouters172.17.0.3	db bcfcc084bd07172.17.0.4	ed5b3fdd48f0root@ed5b3fdd48f0:/opt/webapp# ping dbPING db (172.17.0.3) 56(84) bytes of data.64 bytes from db (172.17.0.3): icmp_seq=1 ttl=64 time=0.111 ms64 bytes from db (172.17.0.3): icmp_seq=2 ttl=64 time=0.075 ms64 bytes from db (172.17.0.3): icmp_seq=3 ttl=64 time=0.093 ms64 bytes from db (172.17.0.3): icmp_seq=4 ttl=64 time=0.093 ms^C--- db ping statistics ---4 packets transmitted, 4 received, 0% packet loss, time 2998msrtt min/avg/max/mdev = 0.075/0.093/0.111/0.012 msroot@ed5b3fdd48f0:/opt/webapp# exitexitwohu@iZm5egn5zptnov4j3oxh4fZ:~/docker$

用 ping 来测试 db 容器,它会解析成 172.17.0.3。用户可以连接多个子容器到父容器,比如可以连接多个 web 到同一个 db 容器上。

转载地址:http://sckjz.baihongyu.com/

你可能感兴趣的文章