大量的互联网应用服务包括多个服务组件,这往往需要多个容器之间通过网络通信进行互相配合。
目前Docker提供了映射容器端口到宿主机主机和容器互联机制来为容器提供网络服务:
对于一个微服务而言,database uri=ip,如果docker容器重启那么ip也会更改,所以我们希望可以通过名字来访问容器
举个例子:
# 启动两个tomcat容器
[root@VM-4-17-centos home]# docker run -d -P --name tomcat01 tomcat
[root@VM-4-17-centos home]# docker run -d -P --name tomcat02 tomcat
# 直接通过ping名称的方式进行测试
[root@VM-4-17-centos home]# docker exec -it tomcat02 ping tomcat01
如何解决这个问题docker提供了方案。容器的连接(link),它会在源和接受容器直接建立一个隧道。
# 通过link的方式再启动一个容器
[root@VM-4-17-centos home]# docker run -d -P --name tomcat04 --link tomcat02 tomcat
#再尝试ping一下,可以解决
[root@VM-4-17-centos tomcat]# docker exec -it tomcat04 ping tomcat02
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.117 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.076 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.081 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.064 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=5 ttl=64 time=0.076 ms
上面我们可以看到tomcat04可以ping通tomcat02,但是返回来是不行的,具体原因进入容器查看
[root@VM-4-17-centos tomcat]# docker exec -it tomcat04 cat /etc/hosts
当我们使用–link时源容器会在hosts文件中绑定目标容器的ip地址,反观tomcat02是没有的
但是在生产实际中不建议使用–link。
查看所有的docker网络
网络模式
自己创建一个docker网络
# --subnet是子网掩码
# --driver是驱动模式,默认是bridge
# --gateway是网关
[root@VM-4-17-centos tomcat]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
# 查看
[root@VM-4-17-centos tomcat]# docker network ls
NETWORK ID NAME DRIVER SCOPE
a78167e0dd78 bridge bridge local
5780db889845 host host local
b97d4c33f32a mynet bridge local
b2642377e6c3 none null local
# docker network inspect mynet查看具体信息
不适用–link启动tomcat
#启动两个tomcat容器
[root@VM-4-17-centos tomcat]# docker run -d -P --name tomcat01 --net mynet diytomcat
[root@VM-4-17-centos tomcat]# docker run -d -P --name tomcat02 --net mynet diytomcat
#再次查看网络信息
启动完之后再尝试ping连接
#通过ip
[root@VM-4-17-centos tomcat]# docker exec -it tomcat01 ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.107 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.079 ms
64 bytes from 192.168.0.3: icmp_seq=3 ttl=64 time=0.080 ms
64 bytes from 192.168.0.3: icmp_seq=4 ttl=64 time=0.078 ms
#通过名称
[root@VM-4-17-centos tomcat]# docker exec -it tomcat01 ping tomcat02
PING tomcat02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.069 ms
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.078 ms
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.082 ms
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.078 ms
通过自定义网络docker帮我们维护好了对应的关系,这样做有一个好处就是不同的集群使用不同的网络,保证集群的安全。
# 通过docker默认网卡启动两个tomcat容器
[root@VM-4-17-centos tomcat]# docker run -d -P --name tomcatd01 tomcat
[root@VM-4-17-centos tomcat]# docker run -d -P --name tomcatd02 tomcat
如何将tomcatd01和tomcat01连通起来?
# 使用docker network connect
[root@VM-4-17-centos tomcat]# docker network connect --help
Usage: docker network connect [OPTIONS] NETWORK CONTAINER
Connect a container to a network
Options:
--alias strings Add network-scoped alias for the container
--driver-opt strings driver options for the network
--ip string IPv4 address (e.g., "172.30.100.104")
--ip6 string IPv6 address (e.g., "2001:db8::33")
--link list Add link to another container
--link-local-ip strings Add a link-local address for the container
打通tomcatd01 --> mynet
# 建立连接
[root@VM-4-17-centos tomcat]# docker network connect mynet tomcatd01
# 查看mynet信息
[root@VM-4-17-centos tomcat]# docker network inspect mynet
连通的最终效果就是将tomcatd01放到了mynet网络下,这就是所谓的一个容器两个ip。
尝试ping连接tomcat01
[root@VM-4-17-centos tomcat]# docker exec -it tomcatd01 ping tomcat01
PING tomcat01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.095 ms
64 bytes from tomcat01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.077 ms
64 bytes from tomcat01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.077 ms
64 bytes from tomcat01.mynet (192.168.0.2): icmp_seq=4 ttl=64 time=0.077 ms
64 time=0.077 ms
64 bytes from tomcat01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.077 ms
64 bytes from tomcat01.mynet (192.168.0.2): icmp_seq=4 ttl=64 time=0.077 ms
假如我们需要跨网络操作,就需要使用docker connect连通,如上操作即可!