12.Docker网络类型

Docker Network

OVS(OpenVSwitch):实现三层网络设备例如:Vlan、Vxlan、GRE(Generic Routing Encapsulation)、SDN(oftware Defined Network)

当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

img

Docker单机通信

容器名称互联

​ 即在同一个宿主机上的容器之间可以通过自定义的容器名称相互访问,比如一个业务前端静态页面使用nginx,动态页面使用的是tomcat,由于容器在启动的时候其内部ip地址是dhcp随机分配的,所以如果通过内部访问的话,自定义名称是相对比较固定的,因此比较适用于此场景。

#启动第一个容器
docker run -it -d --name tomcat-web1 -p 8801:8080 tomcat:app1
#启动第二个容器
docker run -it -d -p 80:80 --name nginx-web1 --link tomcat-web1 nginx:web1
#进入容器查看/etc/hosts
docker exec -it {DockerID} bash 
cat /etc/hosts

通过自定义容器别名互联

自定义的容器名称后期可能会发生变化,那么一旦名称发生变化,程序之间也要随之发生变化,如果程序通过容器名称进行调用,容器名称发生变化后肯定无法调用成功,每次都进行更换有比较麻烦,因此可以使用自定义别名的方式解决,即容器名称随意变更,不修改别名

#启动第三个容器
docker run -it -d -p 81:80 --name nginx-web2 --link tomcat-web1:java_server nginx:web1

创建自定义网络

None模式

使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。

Node模式示意图:

#docker run -it -d --network=none --name docker_non1 ubuntu-base:v3
#docker exec -it docker_non1 /bin/bash

#ifconfig –a
#route -n

Host模式

如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

Host模式如下图所示:

img

#docker run -it -d --network=host --name docker_host1 ubuntu-base:v3
#docker run -it -d --network=host --name docker_host2 ubuntu-base:v3

#docker exec -it docker_host1 /bin/bash
#docker exec -it docker_host1 /bin/bash

#ifconfig –a
#route –n

Bridge模式

未指定网络时、默认设置为bridge模式

从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。

bridge模式是docker的默认网络模式,不写--net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。

​ bridge模式如下图所示:

img

#docker run -it -d --network=bridge --name docker_bri1 ubuntu-base:v3
#docker run -it -d --network=bridge --name docker_bri2 ubuntu-base:v3

#brctl show
#docker exec -it docker_bri1 /bin/bash
#docker exec -it docker_bri1 /bin/bash

#ifconfig –a
#route –n

Container模式

这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

Container模式示意图:

img

#docker run -it -d --network=container:docker_bri1 --name docker_con1 ubuntu-base:v3

#docker exec -it docker_con1 /bin/bash
#docker exec -it docker_bri1 /bin/bash

#ifconfig –a
#route -n

Docker跨主机通信

跨主机互联简单实现

docker默认网段是127.0.0.x/24,而且每个宿主机相同,因此要做路由,前提是各个主机的网络不能一直

#避免影响,先删除之前容器
docker rm -f `docker ps -a -q`
#修改服务器,网段
dockerd --help | grep bip
vim /lib/systemd/system/docker.service
#server_A添加
--bip=10.10.0.1/24
systemctl daemon-reload 
systemctl restart docker
#server_B添加
--bip=10.10.1.1/24
systemctl daemon-reload 
systemctl restart docker
#A启动nginx容器 10.10.0.2/24
docker run -it -d nginx:v1
#B启动tomcat容器 10.10.1.2/24
docker run -it -d tomcat:v1
#添加路由
traceroute 10.10.1.2(10.10.1.2), 30 hops max, 60 byte packets
1  10.10.0.1 (10.10.0.1)   0.029ms   0.006 ms   0.003 ms
2  172.31.7.254 (172.31.7.254)    0.129ms   0.076 ms   0.043 ms
3  * * *
server_A(172.31.6.101)
	route add -net 10.10.1.0/24 gw 172.31.6.102
	iptables -A FORWARD -s 172.31.0.0/21 -j ACCEPT
server_B(172.31.6.102)
	route add -net 10.10.0.0/24 gw 172.31.6.101
	iptables -A FORWARD -s 172.31.0.0/21 -j ACCEPT

Pipework

Pipework是一个简单易用的Docker容器网络配置工具。由200多行shell脚本实现。通过使用ip、brctl、ovs-vsctl等命令来为Docker容器配置自定义的网桥、网卡、路由等。

  • 使用新建的bri0网桥代替缺省的docker0网桥
  • bri0网桥与缺省的docker0网桥的区别:bri0和主机eth0之间是veth pair

img

Flannel(Flannel + UDP 或者 Flannel + VxLAN)

使用Overlay Network叠加网络实现

Flannel实现的容器的跨主机通信通过如下过程实现:

  • 每个主机上安装并运行etcd和flannel;
  • 在etcd中规划配置所有主机的docker0子网范围;
  • 每个主机上的flanneld根据etcd中的配置,为本主机的docker0分配子网,保证所有主机上的docker0网段不重复,并将结果(即本主机上的docker0子网信息和本主机IP的对应关系)存入etcd库中,这样etcd库中就保存了所有主机上的docker子网信息和本主机IP的对应关系;
  • 当需要与其他主机上的容器进行通信时,查找etcd数据库,找到目的容器的子网所对应的outip(目的宿主机的IP);
  • 将原始数据包封装在VXLAN或UDP数据包中,IP层以outip为目的IP进行封装;
  • 由于目的IP是宿主机IP,因此路由是可达的;
  • VXLAN或UDP数据包到达目的宿主机解封装,解出原始数据包,最终到达目的容器。

Flannel模式如下图所示:

img

演示:

#/opt/bin/etcdctl get /coreos.com/network/config
#/opt/bin/etcdctl ls /coreos.com/network/subnets
#/opt/bin/etcdctl get /coreos.com/network/subnets/172.16.49.0-24
posted @ 2020-09-02 10:51  Gmiao  阅读(116)  评论(0编辑  收藏  举报