12.Docker网络:容器互联之--link

【目录导览】
1.Docker入门:什么是Docker?如何安装Docker?
2.Docker入门:Docker命令
3.Docker实战:Docker部署Nginx
4.Docker实战:Docker部署Tomcat
5.Docker实战:Docker部署MySQL
6.Docker镜像:什么是Docker镜像?Docker镜像加载原理?
7.Docker容器:什么是Docker容器?
8.Docker数据卷:数据交互、数据卷、数据卷容器
9.Docker镜像制作:Commit和DockerFile
10.Docker入门学习回顾小结
11.Docker网络:基础原理&示例
12.Docker网络:容器互联之–link
13.Docker网络:容器互联之自定义网络
14.Docker网络:容器互联之不同网络间的容器互联

写在前面:本节可以作为了解,不看也行,因为--link技术已经被淘汰了,可以直接学下一节:自定义网络

1.问题

看完上一节,我们可以知道,在同一个Docker环境中,容器与容器之间的网络是联通的,只要知道两个容器的ip,就可以实现两个容器之间通信。

那么能不能通过ping容器名访问呢?

# 示例
# 以两个tomcat容器为例
docker run -d -P --name tomcat-1 tomcat
docker run -d -P --name tomcat-2 tomcat

# 查看一下tomcat-2的ip
docker exec -it tomcat-2 ip addr

# 内容如下:
[root@iZ2zefjrz9szlt99tuu23fZ wy]# docker exec -it tomcat-2 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

# tomcat-1容器ping一下tomcat-2的ip
docker exec -it tomcat-1 ping 172.17.0.3

# 内容如下:
[root@iZ2zefjrz9szlt99tuu23fZ wy]# docker exec -it tomcat-1 ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.073 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.079 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.088 ms

# tomcat-1容器直接ping一下tomcat-2
docker exec -it tomcat-1 ping tomcat-2

# 内容如下:
[root@iZ2zefjrz9szlt99tuu23fZ wy]# docker exec -it tomcat-1 ping tomcat-2
ping: tomcat-2: Name or service not known

从示例中可以看到,普通方式启动容器,不能使容器之间直接通过容器名通信,那么该怎么办呢?

2.解决方法

答案就是,容器互联。

容器互联包括:--link方式和自定义网络方式,这节只讲--link,自定义网络在下一节介绍。

3.容器互联 --link

# 示例
# 再启动一个tomcat-3为例
docker run -d -P --name tomcat-3 --link tomcat-2 tomcat

# 用tomcat-3直接ping一下tomcat-2
docker exec -it tomcat-3 ping tomcat-2

# 内容如下:
[root@iZ2zefjrz9szlt99tuu23fZ wy]# docker exec -it tomcat-3 ping tomcat-2
PING tomcat-2 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat-2 (172.17.0.3): icmp_seq=1 ttl=64 time=0.089 ms
64 bytes from tomcat-2 (172.17.0.3): icmp_seq=2 ttl=64 time=0.061 ms
64 bytes from tomcat-2 (172.17.0.3): icmp_seq=3 ttl=64 time=0.062 ms

可以看到,使用容器互联 --link后,tomcat-3可以直接通过容器名与tomcat-2进行通信了

但是,这仍然存在一个小问题:--link是单向联通,并非双向联通

# 示例

# 用tomcat-2接ping一下tomcat-3
docker exec -it tomcat-2 ping tomcat-3

# 内容如下:
[root@iZ2zefjrz9szlt99tuu23fZ wy]# docker exec -it tomcat-2 ping tomcat-3
ping: tomcat-3: Name or service not known

可以看到,使用容器互联 --link后,tomcat-3可以直接通过容器名与tomcat-2进行通信,但反过来,tomcat-2仍然不可以直接通过容器名与tomcat-3进行通信,如果想要tomcat-2直接通过容器名与tomcat-3进行通信,tomcat-2也需要--link配置

4.探究容器互联 --link的原理

# 在容器外执行命令
docker exec -it tomcat-3 cat /etc/hosts

# 内容如下:
[root@iZ2zefjrz9szlt99tuu23fZ wy]# docker exec -it tomcat-3 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.3	tomcat-2 3ab088d3def5
172.17.0.4	43916e9d59ac

可以看到,在tomcat-3容器中,已经在域名解析文件中添加了tomcat-2的ip

总结:--link的原理就是在hosts文件中添加了域名解析

5.建议

  • 容器互联 --link虽然能帮助容器之间直接通过容器名通信,方便了一点点,但是这种方法仍然不够好,不够强,比如容器的ip动态改变以后,还是需要再更改一次hosts文件内容才行。
  • 现在Docker已经不建议使用–link了,更好的方法在下一节将会讲到:自定义网络。

你可能感兴趣的:(Docker,docker)