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中的所有网络接口都是虚拟的,虚拟的转发效率高

  • 容器删除,对应的网桥对就没了

    docker网络0 docker网络0

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速学 编排集群和常见命令总结

Docker Swarm集群的管理和编排

Docker compose v3版本构建跨主机容器编排构建wordpress集群

Docker compose v3版本构建跨主机容器编排构建wordpress集群

docker学习6-docker-compose容器集群编排

docker swarm 集群服务编排部署指南(docker stack)