本文主要介紹了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 timer1 02:42:ac:11:00:02 no 0.142 02:42:ac:11:00:03 no 0.142 36:5c:3a:ff:64:14 yes 0.002 36:5c:3a:ff:64:14 yes 0.001 ae:84:17:1c:93:6c yes 0.001 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 aship 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