學習Docker網絡前建議清空所有環境
docker rmi -f $(docker images -aq )
每啟動一個docker容器,docker就會給docker容器配置設定一個ip。
隻要安裝了docker,就會有一個網卡docker0 ( 橋接模式,使用的是evth-pair技術 )

跟這網絡工程師一起學Docker網絡😍
1️⃣什麼是Evth-pair
Evth-pair就是一對的虛拟裝置接口,他們都是成對出現的,一段連着協定,一段彼此相連.正因為這個特性,evth-pair 充當一個橋梁,連接配接各種虛拟網絡裝置。
OpenStac,Docker容器之間的連接配接, OVS的連接配接,都是使用 evth-pair 技術.
2️⃣容器與容器的連通
- linux與docker容器之間通過docker0是可以ping通的
- docker容器與容器之間是可以互相ping通的
分析:tomcat01和tomcat02公用一個路由器,所有的容器在不指定網絡的情況下,都用docker0,dockers預設給每個容器配置設定一個可用的IP位址。
3️⃣結論
- Docker使用的是Linux的橋接,主控端是一個Docker容器的網橋docker0
- Docker中所有的網絡接口都是虛拟,虛拟網卡轉發效率高
容器删除,對應的Evth-pair就會消失
docker exec -it tomect01 ip addr
删除tomec01
檢視Evth-pair消失
4️⃣概述
容器的接口與連接配接到Bridge上的veth接口,形成veth-pair,預設的Bridge網絡,網關預設是docker0。
預設的Bridge網絡,docker0的位址是172.17.0.1/24,而第一個接入的裝置,則IP位址為172.17.0.2/24…以此内推。
5️⃣檢視Bridge網絡的相關指令
1.ifconfig指令:
主控端上:
docker0接口資訊:可以了解為Bridge的SVI口。
ens和lo接口:可以了解為主控端的實體接口。
veth-pair接口:Bridge上連接配接容器的接口。
容器中:
通過
docker exec -it xxx(容器名稱)ifconfig
進行檢視:
可以看到容器的’實體接口’和回還口資訊。
2.檢視Bridge上接口資訊:
CentOS8為例,指令為bridge link,結果為如下:
可以看到,2個veth接口和docker0連接配接在這個Bridge上。
3.檢視容器與Bridge上的veth接口的對應關系:
方法1:使用腳本,檢視容器ID和veth的對應關系。具體方法請參考:
https://blog.csdn.net/tushanpeipei/article/details/116077454
,執行結果如下:
方案二:通過索引來對比:
4.docker inspect network指令:
指令如下:
其中,使用jq檢視IPAM.Config的資訊和此網絡的IP、網關資訊:
Containers的資訊為此網絡連接配接的容器資訊:
三、使用主機名進行通信
1.問題:
連接配接到預設的Bridge的容器,互相可以使用IP位址來通信,但是無法使用主機名來通信。
2.解決方案:
使用–link來通信。
3.注意點:
–link的原理其實就是在本地添加了對方主機名稱和IP位址的映射,但是對端并沒有,是以對端依舊無法通過本端的主機名與本端進行通信。容器内映射資訊如下:
6️⃣自定義bridge網絡
一、 自定義與預設的bridge的關系圖示:
二、指令:
1.建立bridge網絡:
docker network create -d bridge --subnet x.x.x.x/x(子網位址) --gateway x.x.x.x bridge-net1
,建立一個名為bridge-net1的網絡。
2.将容器連接配接到自定義bridge網絡:
容器RUN時連接配接:
docker run -it --name docker-net1 --network bridge-net1(網絡名稱) prin/centos-vim-ifconfig /bin/bash
docker run -it --name docker-net2 --network bridge-net1(網絡名稱) prin/centos-vim-ifconfig /bin/bash
容器已經RUN後連接配接:
docker network connect bridge-net1(網絡名稱) docker-net1(容器名稱)
3.檢視自定義網絡的相關資訊:
1.可以使用指令
docker inspect bridge-net1
檢視詳細資訊:
2.在主控端上使用ifconfig,可以看到産生了如下的接口:
其中br-xxxxx相當于預設bridge的docker0接口。veth接口則是bridge-net1上連接配接到容器的虛拟接口。
三、特點:
1.在自定義bridge上連接配接的容器,預設就可以用對方名稱進行通信:
2.不同bridge之間能夠互相通信的原因是使用了Docker Engine上的DNS Resolver,直接對IP位址進行解析:
3.不同bridge上的容器天生隔離:
4.同一個容器可以接入到多個bridge上,例如經典三件套:Nginx-django-psql
7️⃣Host網絡
一、概述:
Host網絡是預設存在的網絡,借用了主控端的網絡。
将容器連接配接到host網絡:
docker run -it --name centos_host --network=host prin/centos-vim-ifconfig /bin/bash
檢視接口資訊:
ifconfig:可以看到和主控端的一樣。
三、注意:
如果在host的容器和宿主上同時開放一個端口,會報錯。
None網絡:
一、概述:
none網絡是預設存在的網絡,預設隻有一個回環接口,無法與外界通信。
将容器設定為none網絡:
docker run -it --name centos_none --network=none prin/centos-vim-ifconfig /bin/bash
檢視容器接口資訊:
ifconfig:可以看到隻有lo接口。
8️⃣Vxlan網絡
一、目的:
連接配接不同主控端上的容器,建立叢集。
二、原理:
圖示:
在不同主控端的容器上建立eth1接口,在同一網段,建立overlay的隧道。同時eth0作為underlay的接口,保證底層能夠通信。
當Host1和Host2上容器通信時,首先進行overlay的封裝,然後再進行underlay的封裝,然後将資料發送到對端,對端再進行解封裝。
三、純手工方式:
注意:此方式不推薦,了解即可;後續筆記中記錄自動化的方式。
步驟:
1.準備兩個虛拟機
Docker_docker1(10.1.1.1),Docker_docker2(10.1.1.2)
,并修改主機名稱:
2.分别在兩台裝置上設定變量:
3.在兩台裝置上下載下傳并解壓分布式存儲檔案。資源可以在網上搜尋etcd-v(版本号) -linux-amd64進行下載下傳:
4.使用腳本在兩台裝置上激活服務:
Docker_docker1:
Docker_docker2:同理
5.在兩台裝置上分布檢視叢集狀況:
6.停止docker服務,并使用etcd叢集重新啟動docker:
7.在一台裝置上建立Overlay網絡,預設會同步到叢集中:
8.分布在主控端上建立容器,連接配接到overlay網絡中:
9.測試網絡通信狀況(在容器裡面互相ping對端名稱)和檢視網絡資訊(
dockek network ls/docker network inspect qyt_overlay
)。
9️⃣實體VLAN網絡(MAC VLAN)
一、概念:
在主控端上使用子接口的方式,将容器接入到vlan中,以保證通信,其應用場景少。
二、圖示:
同一個主控端中:類似于單臂路由。
不同主機中的容器通信:兩個實體主機連接配接到同一個VLAN,IP在同一網段進行通信。
📢歡迎點贊 👍 收藏 ⭐留言 📝 如有錯誤敬請指正!
📢未來很長,值得我們全力奔赴更美好的生活✨