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
相关推荐
ChinaRainbowSea33 分钟前
7. RabbitMQ 消息队列——延时队列(Spring Boot + 安装message_exchange“延迟插件“ 的详细配置说明)的详细讲解
java·spring boot·docker·rabbitmq·java-rabbitmq
love530love1 小时前
记一次不太顺利的Docker重装
运维·docker·容器
从零开始学习人工智能6 小时前
Docker 镜像导出与导入:export/import vs save/load
运维·docker·容器
跳跳的向阳花14 小时前
08、Docker学习,常用安装:ClickHouse
学习·clickhouse·docker
码哝小鱼16 小时前
docker stack常用命令
docker·容器·eureka
NorthCastle19 小时前
Centos7 上 卸载 docker
运维·docker·容器
kfepiza19 小时前
docker mysql 笔记250406
docker·容器
kfepiza19 小时前
`docker run --restart no,always,on-failure,unless-stopped` 笔记250406
docker·容器
写代码的小王吧1 天前
【网络安全】安全的网络设计
网络·网络协议·tcp/ip·安全·web安全·网络安全·docker
美码师1 天前
【保姆级教程】windows 安装 docker 全流程
docker·ai工具