Docker 網路-container 模式
容器與主機、容器與容器之間是互相隔離的。同時,我們可以通過配置 docker 網路,為容器建立完全獨立的網路名稱空間,或者使容器共享主機或者其他容器的網路名稱空間,以應對不同場景的需要。
這裡有4 種常用的單宿主機網路模式:
- bridge 模式;
- host 模式;
- container 模式;
- none 模式。
本節將介紹網路模式中的 container 模式:
1. container 模式
與 host 模式類似,container 模式可以使一個容器共享另一個已存在容器的網路,此時這兩個容器共同使用同一網絡卡、主機名、IP 地址,容器間通訊可直接通過本地迴環 lo 介面通訊。
新執行一個 busybox 的容器 b1,設定它共享已存在的容器 b0 的網路:
docker run -d -t --network container:b0 --name b1 busybox
Tips:埠轉發設定以已存在的容器為準,出於安全和許可權控制的角度,container 模式下執行的容器設定埠轉發不生效。
檢視 b0,b1 的網路配置,驗證兩者的網路配置是否相同:
docker exec b0 ifconfig
docker exec b1 ifconfig
此時的網路拓撲圖如下:
不再使用的容器記得刪除掉,釋放資源和空間
docker rm -f b0 b1
nginx 映象自帶的網路命令非常少,檢視網路不方便,而 busybox 的網路命令比較齊全,使用 container 模式,可以快速解決這個問題。
我們新執行一個名為 n0 的 nginx 容器,再將它的網路共享給 busybox 容器 n0-net:
docker run -d -t --name n0 nginx
docker run -d -t --network container:n0 --name n0-net busybox
使用 n0-net 容器,執行 docker exec n0-net ip a
進行網路狀態檢視自身網路資訊,也就是 nginx 的網路資訊
執行如下命令,通過 localhost 訪問 n0 的 web 服務,說明通過 container 模式下,共享的網路中的容器能夠使用 lo 訪問其他容器的服務。
docker exec n0-net telnet localhost 80
# 在互動中輸入
# GET /
#
不再使用的容器記得刪除掉,釋放資源和空間:
docker rm -f n0 n0-net
2. 小結
在 container 模式下的容器,會使用其他容器的網路名稱空間,其網路隔離性會處於 bridge 橋接模式與 host 模式之間:當容器共享其他容器的網路名稱空間,則在容器之間不存在網路隔離;而它們又與宿主機以及其他不在此共享中的容器存在網路隔離。