同一台宿主机下容器之间是如何通信的?
当我们安装好docker就会出现一个docker0的网络,这里的docker0就是一个路由转发的功能,docker0与宿主机网卡是直连模式,ip就是所有容器下的网关,我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker, 就会有一个网卡docker0桥接模式,使用的技术是evth-pair技术
evth-pair技术 就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一端彼此相连 正因为这个特性,evth-pair充当一个桥梁,连接各种虚拟网络设备的
容器互联
在实际工作中,容器中的连接需要填写ip地址,但是重新运行一个容器,容器的ip地址可能会产生变化,如果可以用名字来访问容器就很好了
docker提供了--link的参数
docker run -d -P --name tomcat01 --link tomcat02 tomcat
[root@localhost ~]# docker exec -it tomcat02 ping tomcat01
PING tomcat01 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat01 (172.17.0.3): icmp_seq=1 ttl=64 time=0.359 ms
64 bytes from tomcat01 (172.17.0.3): icmp_seq=2 ttl=64 time=0.094 ms
64 bytes from tomcat01 (172.17.0.3): icmp_seq=3 ttl=64 time=0.082 ms
[root@localhost ~]# docker exec -it tomcat01 ping tomcat02
ping: tomcat02: Name or service not known
我们发现tomcat02可以ping同tomcat01,而tomcat01却ping不同tomcat02,如果我们去查看一下两个容器的hosts文件就会发现问题了
[root@localhost ~]# docker exec -it tomcat01 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 613af5f74419
[root@localhost ~]# docker exec -it tomcat02 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 tomcat01 613af5f74419
172.17.0.4 dee0a7027166
在tomcat02中有tomcat01的地址,tomcat01却没有tomcat02的地址,这就解释了为什么tomcat01ping不通tomcat02
link就是我们在hosts配置中添加了一个主机名,如果有很多容器配置起来就很麻烦了
所有我们可以考虑自定义网络
[root@localhost ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
b4365d374a64a7176f82e71dfd03c33eb412310d1a92c8490d52f9a0d98237cd
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
1e1def63579f bridge bridge local
eb31bee2ac17 host host local
b4365d374a64 mynet bridge local
[root@localhost ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
49e3bc9f4271e2994e331b82090a46c9604fb9fdb40cd52cafc965ee742e8856
[root@localhost ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat
7242d9369be0d36382f32b71c162ba47de9168e0c4656e57d5a555749c7f844b
[root@localhost ~]# docker exec -it tomcat-net-01 ping tocat-net-02
^C[root@localhost ~]# docker exec -it tomcat-net-01 ping tomcat-net-02
PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.223 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.081 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.105 ms
^C
--- tomcat-net-02 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 3ms
rtt min/avg/max/mdev = 0.081/0.136/0.223/0.062 ms
[root@localhost ~]# docker exec -it tomcat-net-02 ping tomcat-net-01
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.095 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.141 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.141 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=4 ttl=64 time=0.153 ms
在自定义网络中所有容器都实现了互联