Docker Link
IP直接通讯
Dcoker 容器之间默认是支持通过IP互联的
我们查看一个容器的IP
[docker@VM_121_116_centos ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb1d9cd3a282 redis "docker-entrypoint..." 22 hours ago Up 29 seconds 0.0.0.0:26379->6379/tcp tworedis
6636fb7d293c redis "docker-entrypoint..." 23 hours ago Up 40 seconds 0.0.0.0:6379->6379/tcp oneredis
[docker@VM_121_116_centos ~]$ docker exec -it oneredis /bin/bash
root@6636fb7d293c:/data# 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
172.17.0.2 6636fb7d293c
root@6636fb7d293c:/data# exit
exit
[docker@VM_121_116_centos ~]$
得到 IP
进入另一个容器 ping 一下
先安装一下ping 的依赖
[docker@VM_121_116_centos ~]$ docker exec -it tworedis /bin/bash
root@bb1d9cd3a282:/data# apt-get update
Ign:2 http://cdn-fastly.deb.debian.org/debian stretch InRelease
Get:3 http://cdn-fastly.deb.debian.org/debian stretch-updates InRelease [91.0 kB]
==================================省略==============================
Reading package lists... Done
root@bb1d9cd3a282:/data# apt-get install inetutils-ping
==================================省略=============================
After this operation, 390 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Get:1 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 netbase all 5.4 [19.1 kB]
Get:2 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 inetutils-ping amd64
===================================省略==============================
Setting up inetutils-ping (2:1.9.4-2+b1) ...
root@bb1d9cd3a282:/data# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: icmp_seq=0 ttl=64 time=0.082 ms
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.074 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.068 ms
^C--- 172.17.0.2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.068/0.075/0.082/0.000 ms
root@bb1d9cd3a282:/data#
验证是可以成功的
问题:
上面例子我们是通过容器IP直接互联的吗, 但是容器重新启动后 IP是会改变的,这个时候就没招了
使用link通讯
使用 -link 容器name:容器别名 , 就相当于给容器加了一个 DNS 解析, 会把容器(name) 和设置的别名(alias) 解析成对应容器现在的IP.
实验一下
停掉刚刚的 tworedis
[root@VM_121_116_centos ~]# docker run -p 26379:6379 --link oneredis:one --name tworedis -it redis /bin/bash
root@f1fc80e69bab:/data# apt-get update
root@f1fc80e69bab:/data# apt-get install inetutils-ping
root@f1fc80e69bab:/data# ping one
PING one (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: icmp_seq=0 ttl=64 time=0.117 ms
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.123 ms
^C--- one ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.117/0.120/0.123/0.000 ms
root@f1fc80e69bab:/data# ping oneredis
PING one (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: icmp_seq=0 ttl=64 time=0.076 ms
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.082 ms
^C--- one ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.076/0.079/0.082/0.000 ms
root@f1fc80e69bab:/data#
可以发现name和别名都能联通
看看 tworedis的host
root@f1fc80e69bab:/data# cat /etc/hosts
同时在 /etc/host 能发现映射, oneredis的容器ID, name, 别名都有的