本文主要介绍了Docker容器的单机网络架构与集群网络架构,辅以演示,并简单介绍了网络管理中的命令。
前文:
docker网络原理介绍
与ovs类似,docker容器采用veth-pair + linux bridge (虚拟交换机)的通信方式
以Bridge类型举例
容器外的if20连接了容器cm01的if21网卡
容器外的if22连接了容器cm02的if22网卡
数字不固定,一般宿主机是偶数,容器内是奇数
容器内的ip地址通过vRouter的NAT转换成宿主机地址
#二层mac表寻址
docker run -dit --name cm01 alpine
docker run -dit --name cm02 alpine
#互ping后
brctl showmacs docker0
port no mac addr is local? ageing timer
1 02:42:ac:11:00:02 no 0.14
2 02:42:ac:11:00:03 no 0.14
2 36:5c:3a:ff:64:14 yes 0.00
2 36:5c:3a:ff:64:14 yes 0.00
1 ae:84:17:1c:93:6c yes 0.00
1 ae:84:17:1c:93:6c yes 0.00
docker网络类型介绍
docker默认创建了三种网络类型
docker network ls
NETWORK ID NAME DRIVER SCOPE
a21005000639 bridge bridge local
e6a21ab3e3b4 host host local
6725e5c3cb83 none null local
docker network inspect a21005000639 #查看网络类型详细信息
docker共有5种网络类型,各有特点
1、none 只有loopback,容器内部无网卡
2、host 容器使用宿主机网络,类似于VMwareworkstation的桥接网络
------直接共享宿主机的网络状态
------不同容器之间需要使用不同的IP地址
------直接访问,效率更高
3、bridge (容器默认使用并连接到docker0网桥) 最常用的方式
------通过NAT进行访问,外部访问即指定端口号
------二层通过linux Bridge mac表进行交换
------三层通过iptables和路由表进行转发
------经过NAT装换,效率相对较低
4、container 共享容器命名空间
------主机和主机共享命名空间
------不同容器之间可以使用相同的IP地址
------k8s打包pod时使用
5、vxlan cluster 集群网络
------用于集群内容器实现大二层通信
------通过安装etcd实现
Bridge网络
创建新的网桥br1
docker network create
-d #指定网络类型
--gateway #指定网关
--subnet #指定子网
docker network create -d bridge br1 #添加了类型为Bridge的网桥
docker network rm br1 #删除网桥
#如果指定子网创建
docker network create -d bridge --subnet 192.168.1.0/24 -- gateway 192.168.1.1 br1
通过查看docker network ls和brctl show,可以发现都多了一个网桥br1
没有指定子网的情况下,子网会顺延创建,默认的docker0使用的是172.17网段,br1使用172.18网段
创建新的容器并指定网络docker run -itd --name cm04 --network br1 alpine
docker exec -it cm04 ash
ip a
能看到新的容器已经获得了地址
新的br上增加了一个interface
查看iptables
将容器切换网桥
docker network disconnect bridge cm01 #断开连接
docker network connect br1 cm01 #重新连接
docker network inspect br1 #查看br1状态,可以看到有两个容器获得了地址
自定义网桥的域名访问
在用户自定义的网络类型中,自带了域名解析功能,可以使用域名直接进行访问
host网络
复制宿主机网络状态,与宿主机共用同一个网络命名空间
docker run -itd --name cm05 --network host alpine
docker exec -it cm05 ash
ip a #看到了所有网络的网卡
none网络
docker run -itd --name cm08 --network none alpine
docker exec -ti cm08 ash
ip a
container网络
复制另外容器的网络状态,与另外容器共用同一个网络命名空间
docker run -itd --name cm06 --network container:cm01 alpine
docker exec -it cm06 ash
ip a #与cm01使用的网络一样
vxlan cluster网络
#docker版本为Docker 20.10.6,如果不是这个版本可能会报错
集群场景下,两个宿主机要跨网段进行大二层交换,需要安装etcd分布式数据库,构建etcd集群,用以同步网络信息
集群场景下,两个宿主机要跨网段进行大二层交换,需要安装etcd分布式数据库,构建etcd存储,用以同步网络信息
注意:docker版本为Docker 20.10.6,如果不是这个版本可能会报错
#下载etcd
wget https://github.com/coreos/etcd/releases/download/v3.0.12/etcd-v3.0.12-linux-amd64.tar.gz
#如果报错也可以用迅雷下载后传到宿主机中
我将其放在了根目录下
tar -zxvf etcd-v3.0.12-linux-amd64.tar.gz
#创建etcd集群,宿主机1
cd /etcd-v3.0.12-linux-amd64/
nohup ./etcd --name docker-node1 --initial-advertise-peer-urls \
http://192.168.8.150:2380 \
--listen-peer-urls http://192.168.8.150:2380 \
--advertise-client-urls http://192.168.8.150:2379 \
--listen-client-urls http://192.168.8.150:2379,http://127.0.0.1:2379 \
--initial-cluster-token etcd-cluster \
--initial-cluster docker-node1=http://192.168.8.150:2380,docker-node2=http://192.168.8.148:2380 \
--initial-cluster-state new&
#创建etcd集群,宿主机2
cd /etcd-v3.0.12-linux-amd64/
nohup ./etcd --name docker-node2 --initial-advertise-peer-urls \
http://192.168.8.148:2380 \
--listen-peer-urls http://192.168.8.148:2380 \
--advertise-client-urls http://192.168.8.148:2379 \
--listen-client-urls http://192.168.8.148:2379,http://127.0.0.1:2379 \
--initial-cluster-token etcd-cluster \
--initial-cluster docker-node1=http://192.168.8.150:2380,docker-node2=http://192.168.8.148:2380 \
--initial-cluster-state new&
创建完之后再单开一个terminal
#验证
ps -ef | grep etcd
#root 2655 2428 9 03:37 pts/1 00:00:00 ./etcd --name docker-node2 --initial-advertise-peer-urls http://192.168.8.148:2380 --listen-peer-urls http://192.168.8.148:2380 --advertise-client-urls http://192.168.8.148:2379 --listen-client-urls http://192.168.8.148:2379,http://127.0.0.1:2379 --initial-cluster-token etcd-cluster --initial-cluster docker-node1=http://192.168.8.150:2380,docker-node2=http://192.168.8.148:2380 --initial-cluster-state new
#检查健康状态
cd /etcd-v3.0.12-linux-amd64/
./etcdctl cluster-health
#member 55bbbb082228277b is healthy: got healthy result from http://192.168.8.150:2379
#member fd79a45b0c14607d is healthy: got healthy result from http://192.168.8.148:2379
#cluster is healthy
#docker关联etcd
#宿主机1
systemctl stop docker.service
systemctl stop docker.socket
/usr/bin/dockerd -H tcp://0.0.0.0:2375 \
-H unix://var/run/docker.sock \
--cluster-store=etcd://192.168.8.150:2379 \
--cluster-advertise=192.168.8.150:2375&
#宿主机2
systemctl stop docker.service
systemctl stop docker.socket
/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock \
--cluster-store=etcd://192.168.8.148:2379 \
--cluster-advertise=192.168.8.148:2375&
#集群主机中创建network
#在宿主机1创建与查看
docker network create -d overlay etcd_network
docker network ls
#NETWORK ID NAME DRIVER SCOPE
#80e52b011080 bridge bridge local
#47b97959e9a3 etcd_network overlay global
#736b5705ffbf host host local
#cc7dfdbc929a none null local
docker inspect etcd_network
在宿主机2查看与宿主机1一致
docker network ls
#NETWORK ID NAME DRIVER SCOPE
#80e52b011080 bridge bridge local
#47b97959e9a3 etcd_network overlay global
#736b5705ffbf host host local
#cc7dfdbc929a none null local