Docker網(wǎng)絡進行容器通信與隔離之道的實踐指南
一、Docker網(wǎng)絡概念
1.1 Docker為什么需要網(wǎng)絡
- 實現(xiàn)容器間通信:這是最核心的原因?,F(xiàn)代應用,尤其是微服務架構,是由多個獨立的服務組成的(例如:Web前端、用戶認證服務、訂單服務、數(shù)據(jù)庫等)。每個服務通常運行在各自的容器中。
- 實現(xiàn)外部網(wǎng)絡訪問容器內(nèi)的服務:一個Web服務器容器(如Nginx、Tomcat)之所以有用,是因為外部用戶(通過瀏覽器)或其他系統(tǒng)能夠訪問它提供的服務(如網(wǎng)站或API)。
- 允許容器訪問外部網(wǎng)絡:容器內(nèi)的應用經(jīng)常需要從互聯(lián)網(wǎng)獲取資源或數(shù)據(jù)。
- 連接容器與宿主機:有時容器需要與宿主機上的服務或文件系統(tǒng)進行交互。
1.2 常見網(wǎng)絡類型
- Bridge網(wǎng)絡(橋接網(wǎng)絡):是 Docker 的默認網(wǎng)絡模式,它會在宿主機內(nèi)部創(chuàng)建一個私有虛擬網(wǎng)絡,容器像連接到同一個虛擬交換機一樣被分配獨立IP,并通過NAT與外部通信,是實現(xiàn)單主機上多容器間通信最常用且隔離性良好的方式。
- Host(宿主機網(wǎng)絡):讓容器直接共享宿主機的網(wǎng)絡命名空間,容器本身沒有獨立IP,直接使用主機網(wǎng)卡和端口,消除了NAT開銷從而提供最佳網(wǎng)絡性能,但代價是犧牲了網(wǎng)絡隔離性并可能引發(fā)端口沖突。
- Container(容器網(wǎng)絡):這個模式指定新創(chuàng)建的容器和引進存在的一個容器共享一個網(wǎng)絡 ,而不是和宿主機共享。新創(chuàng)建的容器不會創(chuàng)建自己的網(wǎng)卡,配置自己的 ip,而是和一個指定的容器共享 ip,端口等,兩個容器除了網(wǎng)絡方面,其他的如文件系統(tǒng)、進程列表等還是隔離的。兩個容器的進程可以通過 lo 網(wǎng)卡設備通信。
- None(無網(wǎng)絡):模式為容器提供了一個完全無網(wǎng)絡的環(huán)境,內(nèi)部僅存在回環(huán)接口,使其與外界徹底隔離,適用于追求絕對安全或只需執(zhí)行離線計算的特殊任務。
- Overlay(疊加網(wǎng)絡):是用于 Docker 集群的高級模式,它能在多個物理主機之上構建一個統(tǒng)一的虛擬網(wǎng)絡,使不同機器上的容器能像在同一局域網(wǎng)內(nèi)一樣直接通信,是 Swarm 或 Kubernetes 等編排工具的基礎。
二、網(wǎng)絡命令
docker network create
功能:創(chuàng)建自定義網(wǎng)絡
語法:
docker network create [OPTIONS] NETWORK
關鍵參數(shù):
d, --driver:網(wǎng)絡驅(qū)動--gateway:網(wǎng)關地址--subnet:表示網(wǎng)段的CIDR格式的子網(wǎng)--ipv6:啟用ipv6
示例:

docker network inspect
功能:查看網(wǎng)絡詳情
語法:
docker network inspect [OPTIONS] NETWORK [NETWORK...]
關鍵參數(shù):
-f, --format: 指定格式
示例:

docker network connect
功能:用于將容器連接到網(wǎng)絡,可以按名稱或 ID 連接容器。連接后,容器可以與同一網(wǎng)絡中的其他容器通信。
語法:
docker network connect [OPTIONS] NETWORK CONTAINER
關鍵參數(shù):
--ip: 指定 IP 地址--ip6: 指定 IPv6 地址
示例:

docker network disconnect
功能:斷開網(wǎng)絡
語法:
docker network disconnect [OPTIONS] NETWORK CONTAINER
關鍵參數(shù):
-f:強制斷開
示例:docker network disconnect web1 mybox1

docker network prune
功能:刪除不使用的網(wǎng)絡
語法:
docker network prune [OPTIONS]
關鍵參數(shù):
-f, --force:不提示
示例:

docker network rm
功能:刪除 1 個或者多個網(wǎng)絡
語法:
docker network rm NETWORK [NETWORK...]
關鍵參數(shù):
-f: 強制刪除
示例:

docker network ls
功能:列出網(wǎng)絡
語法:
docker network ls [OPTIONS]
別名:docker network list
關鍵參數(shù):
-f, --filter: 指定過濾條件--format: 指定格式--no-trunc: 不截斷-q,--quiet:僅僅顯示id
示例:

三、網(wǎng)絡模式的設置
docker Bridge網(wǎng)絡
bridge網(wǎng)絡結構:
+---------------+
| Internet |
+-------+-------+
|
+--------+---------+
| Host eth0 |
| 192.168.1.100/24 |
+--------+---------+
|
| (NAT)
+---------------------+------------------------+
| docker0 Bridge |
| 172.17.0.1/16 |
+--------+----------------------------+---------+
| |
| (veth pair) | (veth pair)
| |
+--------+----------+ +---------+---------+
| Container A | | Container B |
| | | |
| eth0: | | eth0: |
| 172.17.0.2/16 | | 172.17.0.3/16 |
+-------------------+ +-------------------+
在創(chuàng)建容器時沒有使用--network參數(shù)指定網(wǎng)絡時,默認連接到docker模式。
注意:docker 自定義橋接網(wǎng)絡支持通過Docker DNS服務進行域名解析,也就是我們可以直接通過使用容器名進行通信,因為DNS服務可以解析容器名到IP地址的映射,但是默認的Bridge網(wǎng)絡時不支持DNS的。
案例:讓兩個容器連接到同一個自定義網(wǎng)絡進行通信
1.創(chuàng)建自定義網(wǎng)絡web1
docker network create web1
2.創(chuàng)建并啟動兩個busybox容器,并且將容器連接到網(wǎng)絡web1
docker run -itd --name=box1 --network web1 busyboxdocker run -itd --name=box2 --network web1 busybox
3.進入box1容器檢驗是否能與box2通信
docker exec -it box1 shping box2exit
4.進入box2容器檢驗是否能與box1通信
docker exec -it box2 shping box1exit
5.創(chuàng)建一個容器box3使用默認的bridge
docker run -itd --name=box33 --name=box3 busybox
6.驗證是否能進行DNS域名解析和是否能與使用自定義網(wǎng)絡的容器通信
docker exec -it box3 shping box1
效果如下:


注意:容器啟動后,Docker 有時不會明確提示運行結果(成功 / 失敗),因此建議每次啟動容器后,通過docker ps或docker ps -a命令檢查容器狀態(tài)。
3.1 host網(wǎng)絡
host網(wǎng)絡結構:
+---------------+
| Internet |
+-------+-------+
|
+-------------------------------------------------+
| Docker Host |
| |
| +---------------------+ |
| | Host eth0 +------------------------+
| | 192.168.1.100/24 | |
| +---------------------+ |
| |
| +-------------------------------------------+ |
| | Container | |
| | | |
| | (直接使用宿主機的網(wǎng)絡棧) | |
| | (共享 eth0: 192.168.1.100/24) | |
| +-------------------------------------------+ |
+-------------------------------------------------+
示例:
運行容器使用host網(wǎng)絡
docker run -itd --name=box4 --network host busybox
檢查宿主機網(wǎng)絡配置信息和容器的網(wǎng)絡配置信息是否相同
ifconfigdocker exec -it box4 ifconfig
該模式的缺點:宿主機和容器的端口是共用的,無隔離,所以不能讓它們用相同的端口。
測試:
因為將宿主機nginx服務啟動(默認是80端口)
nginx
啟動一個nginx容器(默認使用的也是80端口)使用host網(wǎng)絡,看是否出現(xiàn)沖突
docker run -d --name=web1 --network host nginx:1.24.0
檢查該容器是否在正常運行
docker psdocker ps -a



3.2 container網(wǎng)絡
container網(wǎng)絡結構:
+---------------+
| Internet |
+-------+-------+
|
+--------+---------+
| Host eth0 |
| 192.168.1.100/24 |
+--------+---------+
|
+--------+---------+
| docker0 Bridge |
| 172.17.0.1/16 |
+--------+---------+
|
| (veth pair)
+-------------------+ +--+-------------------+
| Container A | | Container B |
| (網(wǎng)絡提供者) | | (共享網(wǎng)絡棧) |
| | | |
| eth0: | | |
| 172.17.0.2/16 +-------+ |
| | | 使用Container A的 |
+-------------------+ | 網(wǎng)絡命名空間 |
| eth0: 172.17.0.2/16|
+-------------------
該模式和host模式類似,只是對象換成了容器
示例:
啟動box5容器以container模式連接到box1
docker run -itd --name=box5 --network container:box1 busybox
檢查網(wǎng)絡聯(lián)通性
docker exec -it box5 ping www.baidu.comdocker exec -it box5 ifconfig
斷開box1的網(wǎng)絡,檢查box5網(wǎng)絡變化
docker network disconnect web1 box1docker exec -it box5 ping www.baidu.comdocker exec -it box5 ifconfig
啟動box1的網(wǎng)絡,檢查box5網(wǎng)絡變化
docker network connect web1 box1docker exec -it box5 ping www.baidu.comdocker exec -it box5 ifconfig


3.3 none網(wǎng)絡
none網(wǎng)絡就是指沒有網(wǎng)絡,處于這個模式下的容器除了lo(本地環(huán)回),沒有任何虛擬網(wǎng)卡。
示例:
創(chuàng)建并啟動容器,網(wǎng)絡設置為none模式
docker run -itd --name=box6 --network none busybox
嘗試ping百度
docker exec -it box6 ping www.baidu.com
查看ifconfig
docker exec -it box6 ifconfig
效果:

以上就是Docker網(wǎng)絡進行容器通信與隔離之道的實踐指南的詳細內(nèi)容,更多關于Docker網(wǎng)絡容器通信的資料請關注腳本之家其它相關文章!
相關文章
在docker容器中調(diào)用和執(zhí)行宿主機的docker操作
這篇文章主要介紹了在docker容器中調(diào)用和執(zhí)行宿主機的docker操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11

