需求
我们有两个容器,一个容器启动的后台服务,一个容器启动的mysql服务。后台服务必须知道mysql服务的IP地址是什么。但在开发的过程中,我们并不知道我们mysql数据库的ip地址是多少。
解决办法
我们可以给mysql一个名字,通过名字访问容器,名字是固定的。把第二个容器link到第一个容器上面,在第一个容器上面只需要通过name就可以访问了。
我们将上一节中的test2容器停止并且删除:
iie4bu@hostdocker:~$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d85b091d4deb ubuntu:xenial "/bin/bash -c 'while…" 4 hours ago Up 4 hours test2
b21a9d817e25 ubuntu:xenial "/bin/bash -c 'while…" 4 hours ago Up 4 hours test1
iie4bu@hostdocker:~$ docker container stop test2
test2
iie4bu@hostdocker:~$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b21a9d817e25 ubuntu:xenial "/bin/bash -c 'while…" 4 hours ago Up 4 hours test1
iie4bu@hostdocker:~$ docker container rm test2
test2
iie4bu@hostdocker:~$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b21a9d817e25 ubuntu:xenial "/bin/bash -c 'while…" 4 hours ago Up 4 hours test1
我们新建test2容器,并将test2容器link到test1容器上面。
iie4bu@hostdocker:~$ sudo docker run -d --name test2 --link test1 ubuntu:xenial /bin/bash -c "while true; do sleep 3600; done"
--link的格式:
--link <name or id>:alias
其中,name和id是源容器的name和id,alias是源容器在link下的别名。
我们在test2中可以ping通test1的IP地址的。
root@7fe6f95d2992:/# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.094 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.062 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.062 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.062 ms
64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.059 ms
此外我们在test2中是不是可以ping通test1的名字呢?答案是可以的
root@7fe6f95d2992:/# ping test1
PING test1 (172.17.0.2) 56(84) bytes of data.
64 bytes from test1 (172.17.0.2): icmp_seq=1 ttl=64 time=0.093 ms
64 bytes from test1 (172.17.0.2): icmp_seq=2 ttl=64 time=0.061 ms
64 bytes from test1 (172.17.0.2): icmp_seq=3 ttl=64 time=0.063 ms
^C
--- test1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
原因就是我们使用--link的方式,给test2添加了一个dns的一个记录。这样在test2中不需要知道test1的具体ip地址了。只需要知道名字就行。
然而我们在test1中是无法根据test2的名字ping通的。因为link是有方向的。
使用link的方式在生产环境中并不常见,后面介绍常见的解决办法。