docker之容器互联


容器命令回顾

  • 容器的启动和结束
    docker start IMAGE_ID 启动容器
    docker stop IMAGE_ID 结束容器
  • 容器的运行和删除
    docker rm IMAGE_ID 删除容器,已经启动的容器要先结束后才能删除
    docker run

容器之间互联

在介绍容器之间互联过程中需要使用linux系统,为此引入介绍busybox。

Busybox

Busybox是一个集成一百多个常用Linux命令和工具的精简工具箱,只有几MB大小,被称为Linux系统的瑞士军刀。Busybox镜像从官方的仓库下载速度较慢,本例从网易云docker镜像仓库下载镜像,https://c.163yun.com/hub#/m/home/,搜索busybox,获取busybox的镜像地址并下载镜像:docker pull hub.c.163.com/library/busybox:latest

首先创建容器busybox1:

docker run -d --name busybox1 hub.c.163.com/library/busybox:latest /bin/sh -c "while true;do sleep 3600;done"

运行一个名为busybox1的容器,-d表示在后台运行容器,并返回容器id,容器启动后会自动执行/bin/sh命令,-c 这个参数是/bin/sh命令的附加参数,表示/bin/sh会自动执行这个字符串的指令,此处使用了一个死循环,保证了容器启动后一直都在运行。
接着创建容器busybox2:

docker run -d -P --name busybox2 --link busybox1:busycon ub.c.163.com/library/busybox /bin/sh -c "while true;do sleep 3600;done"

此时容器busybox2和容器busybox1就建立了互联关系。其中--link参数的格式为--link name:alias,name为要连接的容器名称,alias是这个连接的别名。
Docker相当于在两个互联的容器之间创建了虚拟通道,而且不用映射它们的端口到宿主主机上。
连接成功后,busybox2容器作为父容器,执行
docker exec -it CONTAINER_ID
表示在运行的容器中执行命令,-it指分配一个伪终端,这串指令意思是:在容器中开启一个交互模式的终端。
进入容器后,查看/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
172.17.0.2      busyconn 374453a45218 busybox1
172.17.0.3      e084346345b4

其中127.0.0.1为本地主机的ip地址,172.17.0.2就是容器busybox1映射到本地主机的地址,172.17.0.3是当前容器busybox2的地址(此处用镜像id来体现)。通过在busybox2容器内部去ping 容器busybox1也是通的:

/ # ping busybox1
PING busybox1 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.120 ms
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.144 ms
64 bytes from 172.17.0.2: seq=2 ttl=64 time=0.091 ms
64 bytes from 172.17.0.2: seq=3 ttl=64 time=0.111 ms
^C
--- busybox1 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.091/0.116/0.144 ms

由此证明两个容器的确是连接成功的。

应用场景

部署一个后台的应用时,往往还需要部署相关的数据库,当我们把应用部署在一个docker容器中时,其内部会去访问数据库所在的容器的IP地址,为此我们先部署数据库容器test1,然后再部署应用容器test2的时候,使用--link 命名,参数为数据库容器的名称test1,就可以使应用容器可以访问数据库容器。这样我们在应用容器test2的内部就可以ping通test1,并且除了使用ping test1的ip地址外,还可以使用ping test 1这种直接跟名称的形式就可以ping通。这样可以减少配置,不需要知道数据库容器的ip地址,使用起来更加方便。

注意

当启动容器test2的时候使用--link命令去连接test1容器的时候,实际上连接是单向的,只能test2去ping test1,而不能在test1容器内ping test2。

你可能感兴趣的:(docker之容器互联)