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

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

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

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

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

docker network rm
功能:刪除 1 個(gè)或者多個(gè)網(wǎng)絡(luò)
語(yǔ)法:
docker network rm NETWORK [NETWORK...]
關(guān)鍵參數(shù):
-f: 強(qiáng)制刪除
示例:

docker network ls
功能:列出網(wǎng)絡(luò)
語(yǔ)法:
docker network ls [OPTIONS]
別名:docker network list
關(guān)鍵參數(shù):
-f, --filter: 指定過(guò)濾條件--format: 指定格式--no-trunc: 不截?cái)?/li>-q,--quiet:僅僅顯示id
示例:

三、網(wǎng)絡(luò)模式的設(shè)置
docker Bridge網(wǎng)絡(luò)
bridge網(wǎng)絡(luò)結(jié)構(gòu):
+---------------+
| 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)建容器時(shí)沒有使用--network參數(shù)指定網(wǎng)絡(luò)時(shí),默認(rèn)連接到docker模式。
注意:docker 自定義橋接網(wǎng)絡(luò)支持通過(guò)Docker DNS服務(wù)進(jìn)行域名解析,也就是我們可以直接通過(guò)使用容器名進(jìn)行通信,因?yàn)?code>DNS服務(wù)可以解析容器名到IP地址的映射,但是默認(rèn)的Bridge網(wǎng)絡(luò)時(shí)不支持DNS的。
案例:讓兩個(gè)容器連接到同一個(gè)自定義網(wǎng)絡(luò)進(jìn)行通信
1.創(chuàng)建自定義網(wǎng)絡(luò)web1
docker network create web1
2.創(chuàng)建并啟動(dòng)兩個(gè)busybox容器,并且將容器連接到網(wǎng)絡(luò)web1
docker run -itd --name=box1 --network web1 busyboxdocker run -itd --name=box2 --network web1 busybox
3.進(jìn)入box1容器檢驗(yàn)是否能與box2通信
docker exec -it box1 shping box2exit
4.進(jìn)入box2容器檢驗(yàn)是否能與box1通信
docker exec -it box2 shping box1exit
5.創(chuàng)建一個(gè)容器box3使用默認(rèn)的bridge
docker run -itd --name=box33 --name=box3 busybox
6.驗(yàn)證是否能進(jìn)行DNS域名解析和是否能與使用自定義網(wǎng)絡(luò)的容器通信
docker exec -it box3 shping box1
效果如下:


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



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


3.3 none網(wǎng)絡(luò)
none網(wǎng)絡(luò)就是指沒有網(wǎng)絡(luò),處于這個(gè)模式下的容器除了lo(本地環(huán)回),沒有任何虛擬網(wǎng)卡。
示例:
創(chuàng)建并啟動(dòng)容器,網(wǎng)絡(luò)設(shè)置為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)絡(luò)進(jìn)行容器通信與隔離之道的實(shí)踐指南的詳細(xì)內(nèi)容,更多關(guān)于Docker網(wǎng)絡(luò)容器通信的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Docker API 未授權(quán)訪問(wèn)漏洞問(wèn)題解析
這篇文章主要介紹了Docker API 未授權(quán)訪問(wèn)漏洞問(wèn)題解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03
在docker容器中調(diào)用和執(zhí)行宿主機(jī)的docker操作
這篇文章主要介紹了在docker容器中調(diào)用和執(zhí)行宿主機(jī)的docker操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11
Docker安裝Nginx問(wèn)題及錯(cuò)誤分析
這篇文章主要介紹了Docker安裝Nginx的問(wèn)題及錯(cuò)誤分析正確的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
Docker調(diào)度器Kubernetes使用過(guò)程
Docker和Kubernetes在使用方式上有相似性,初次接觸這兩個(gè)技術(shù)的同學(xué)常常會(huì)搞混,但實(shí)際上它們并不是解決同一個(gè)問(wèn)題的技術(shù),也沒有辦法用其中一個(gè)替代另一個(gè)。通俗一點(diǎn)來(lái)說(shuō),Docker解決的是容器技術(shù)直接相關(guān)的問(wèn)題,而Kubernetes更多地關(guān)注在集群上調(diào)度和部署容器應(yīng)用2022-12-12
Docker啟動(dòng)安裝nacos的實(shí)現(xiàn)示例
本文主要介紹了Docker啟動(dòng)安裝nacos的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09
Docker內(nèi)置網(wǎng)絡(luò)模式分析
這篇文章主要為大家介紹了Docker內(nèi)置網(wǎng)絡(luò)模式分析及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
通過(guò)docker 部署minio的方法(端口號(hào)為9105)
通過(guò)Docker部署MinIO對(duì)象存儲(chǔ)服務(wù),并指定API端口為9105,下面給大家分享實(shí)現(xiàn)步驟,感興趣的朋友一起看看吧2024-12-12

