Docker网络架构介绍

本文主要介绍了Docker容器的单机网络架构与集群网络架构,辅以演示,并简单介绍了网络管理中的命令。

前文:

Docker的安装与简单操作命令-CSDN博客

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
相关推荐
明 庭4 小时前
Ubuntu下通过Docker部署NGINX服务器
服务器·ubuntu·docker
dessler5 小时前
Docker-run命令详细讲解
linux·运维·后端·docker
陌北v16 小时前
Docker Compose 配置指南
运维·docker·容器·docker-compose
阿里嘎多学长7 小时前
docker怎么部署高斯数据库
运维·数据库·docker·容器
明 庭7 小时前
Ubuntu下通过Docker部署Caddy服务器
服务器·ubuntu·docker
G_whang9 小时前
windos 安装docker
运维·docker·容器
Mitch3119 小时前
【漏洞复现】CVE-2021-45788 SQL Injection
sql·web安全·docker·prometheus·metersphere
运维小文9 小时前
K8S中的PV、PVC介绍和使用
docker·云原生·容器·kubernetes·存储
CYX_cheng10 小时前
Docker挂载
docker
奉孝13 小时前
docker基础
后端·docker