docker4-docker网络,容器编排,集群部署
Posted tensor_zhang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker4-docker网络,容器编排,集群部署相关的知识,希望对你有一定的参考价值。
1,docker网络
1.1,docker0
有三个网络环境,那么docker是如何处理容器网络访问的?
1.2,测试
docker run -d -p 80:8080 --name tomcat01 tomcat
docker exec -it tomcat01 ip addr
本地可以ping通容器内部
1.3,原理
-
只要安装了docker,就会有一个docker的ip-docker0(这里是172.17.0.1),这里的ip分配用的是桥接模式、veth-pair技术
- veth-pair:一对虚拟设备接口,成对出现,一端连着协议,一端彼此相连;veth-pair充当一个桥梁,连接各种虚拟网络设备。
- openstac,docker容器之间的连接,OVS的连接,都是使用veth-pair技术。
-
每启动一个docker容器,docker都会给容器分配一个ip(为tomcat分配172.17.0.2)
-
借助于宿主机,容器之间也可相互通信
容器和宿主机通信
容器之间通信
1.4,结论
-
容器和宿主机是可以通信的
-
容器和容器之间也是可以通信的,但使用docker0必须写明ip
-
所用容器默认启动不指定网络的情况下,都是docker0进行路由的,docker会给容器分配一个默认的可用ip
-
docker使用的是linux的桥接,docker0是所有容器的网桥
-
docker中的所有网络接口都是虚拟的,虚拟的转发效率高
-
容器删除,对应的网桥对就没了
2,link连接
2.1,测试及原理
是否可以使用容器名实现容器之间的通信?
docker exec -it tomcat01 ping tomcat02
发现不行
ping: tomcat02: Name or service not known
使用--link实现容器之间的连接
docker run -d -P --name tomcat03 --link tomcat02 tomcat
再使用容器名进行通信
[root@VM-0-11-centos ~]# docker exec -it tomcat03 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.114 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.029 ms
[root@VM-0-11-centos ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known
显示网络配置,发现03中将02直接写入了网络配置
[root@VM-0-11-centos ~]# docker exec -it tomcat03 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 tomcat02 3ba10f8d5d4e
172.17.0.4 40fb066c620a
[root@VM-0-11-centos ~]# 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 3ba10f8d5d4e
--link就相当于在容器的网络配置中增加了目标容器的映射
2.2,步骤总结
-
使用--link连接
docker run -d -P --name tomcat03 --link tomcat02 tomcat
-
容器之间通信
[root@VM-0-11-centos ~]# docker exec -it tomcat03 ping tomcat02
3,自定义网络
3.1,网络模式
- bridge:桥接(docker默认,自己创建网络也使用该模式)
- none:不配置网络
- host:和宿主机共享网络
- container:容器网络连通(局限性大)
3.2,自定义网络测试
首先要明白,以下两种启动方式是相同的(启动时--net不写网络默认使用bridge模式):
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat
docker0的特点:默认、通过容器名不能相互访问,--link可以打通连接,但是--link使用比较麻烦,因此我们可以自定义网络。
[root@VM-0-11-centos ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
8a3cfa860aaed386afc07a3b02f77edaec61a24a6095c7b6c165f1fa54bd7594
[root@VM-0-11-centos ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
bc749755ff23 bridge bridge local
cc6fb605cde8 host host local
8a3cfa860aae mynet bridge local
00b2ae19fb37 none null local
[root@VM-0-11-centos ~]# docker network inspect mynet
使用自己创建的网络启动容器,通过容器名直接可以进行通信
[root@VM-0-11-centos ~]# docker run -d -p 80:8080 --name tomcat01 --net mynet tomcat
[root@VM-0-11-centos ~]# docker run -d -P --name tomcat02 --net mynet tomcat
[root@VM-0-11-centos ~]# 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.053 ms
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.034 ms
[root@VM-0-11-centos ~]# docker exec -it tomcat02 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.082 ms
64 bytes from tomcat01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.049 ms
3.3,自定义网络连通测试
使用默认模式再打开一个容器
[root@VM-0-11-centos ~]# docker run -d -P --name tomcat03 tomcat
023cff8d34af26a5db70af374b89b5c6baf1171c28f8ded417c8941f9ae597ed
尝试通信,发现不同网段的容器无法通信
[root@VM-0-11-centos ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known
[root@VM-0-11-centos ~]# docker exec -it tomcat02 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.034 ms
将tomcat03和mynet连通,就可以实现01,02,03之间的通信了
[root@VM-0-11-centos ~]# docker network connect --help
Usage: docker network connect [OPTIONS] NETWORK CONTAINER
[root@VM-0-11-centos ~]# docker network connect mynet tomcat03
[root@VM-0-11-centos ~]# docker exec -it tomcat03 ping tomcat03
PING tomcat03 (192.168.0.4) 56(84) bytes of data.
64 bytes from 023cff8d34af (192.168.0.4): icmp_seq=1 ttl=64 time=0.014 ms
查看mynet网络的具体信息,发现tomcat03已经加入到了mynet中(tomcat03也在docker01中/一个容器两个ip,docker01在docker network ls中显示为 bc749755ff23 bridge bridge local)
[root@VM-0-11-centos ~]# docker network inspect mynet
"Containers": {
"023cff8d34af26a5db70af374b89b5c6baf1171c28f8ded417c8941f9ae597ed": {
"Name": "tomcat03",
"EndpointID": "c57d075ff87400bf48d62e0c79dacf3fbf01417c678a62283ba62a370c815922",
"MacAddress": "02:42:c0:a8:00:04",
"IPv4Address": "192.168.0.4/16",
"IPv6Address": ""
},
"585ecd5171e7722401708234aa7a110773d4f852e2992d6dcc22084c282f12ff": {
"Name": "tomcat01",
"EndpointID": "8a13b027417aa67db6b8a7bb58d12c003c3cb5138bc9fcd9718542fc53626bd0",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"8456029b09de3306abfe6b61a1d7ca001a01c9d5da58f2d7f836db66d5c206bc": {
"Name": "tomcat02",
"EndpointID": "85765f60d452116017ef69038e98b2e9f85d286b1a70b7e558c48e96e9a407cc",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
}
联通后的模型
3.4,步骤总结
-
自定义网络(根据不同类别的容器可以创建不同的网络,不同网络是相互隔离的;自定义网络相比与docker0的最大优势是连接自定义网络的容器可以使用容器名相互通信)
[root@VM-0-11-centos ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
-
使用自定义网络启动容器,就可以实现容器之间的相互通信(同一网络下)
[root@VM-0-11-centos ~]# docker run -d -p 80:8080 --name tomcat01 --net mynet tomcat [root@VM-0-11-centos ~]# docker run -d -P --name tomcat02 --net mynet tomcat [root@VM-0-11-centos ~]# docker exec -it tomcat01 ping tomcat02
-
网络连通,实现不同网络之间容器的相互通信
[root@VM-0-11-centos ~]# docker network connect --help Usage: docker network connect [OPTIONS] NETWORK CONTAINER [root@VM-0-11-centos ~]# docker network connect mynet tomcat03
以上是关于docker4-docker网络,容器编排,集群部署的主要内容,如果未能解决你的问题,请参考以下文章
Docker compose v3版本构建跨主机容器编排构建wordpress集群
Docker compose v3版本构建跨主机容器编排构建wordpress集群