文章目錄
- 🐳 Docker 入門教程(九):容器網絡與通信機制
- 一、Docker 網絡模型
- 二、Docker 的四種網絡類型
- 三、容器間通信機制
- 四、相關指令
🐳 Docker 入門教程(九):容器網絡與通信機制
一、Docker 網絡模型
Docker 網絡建立在 Linux 的標準網絡堆棧之上。
你可以把 Docker 的默認網絡結構理解為這樣:
[容器A] -- vethA --┐│[docker0] -- [eth0/eth1] -- 外網│
[容器B] -- vethB --┘
- 每個容器都有自己的虛擬網卡(veth)
- 它連到一個橋接設備(如 docker0)
- Docker 使用 NAT 和 iptables 把容器網絡流量轉發出去
二、Docker 的四種網絡類型
1. bridge
(默認網絡)
docker run -it ubuntu
- 容器會被接入
docker0
網橋 - 它會獲得一個私有 IP,如
172.17.0.2
- 容器與容器通信需要通過 IP 地址
- 不支持容器名通信(除非用 extra hosts)
原理:
veth pair
虛擬網卡連接容器與宿主的 docker0 網橋- iptables + NAT 轉發出網流量
2. host
網絡(共享主機)
docker run --network host nginx
- 容器直接用宿主的網絡協議棧
- 沒有獨立 IP,容器中的
localhost
就是宿主 - 所有端口直接暴露在宿主上
- 性能高(少一層 NAT)
- 安全性低,容易沖突
3. none
網絡(禁用)
docker run --network none alpine
- 容器沒有任何網絡接口(除了
lo
) - 它無法 ping、curl、connect 到任何外部主機
- 完全隔離
用于:
- 極端安全場景(如跑本地算法模型)
- 自己配置網絡(如 macvlan)
4. 自定義 bridge 網絡(推薦)
docker network create mynet
- 容器獲得獨立私有 IP(如 172.18.x.x)
- 自動啟用 Docker 內建 DNS 服務器
- 可以通過容器名通信
- 網絡隔離,跨網絡無法互通(unless connect)
這是生產中建議的做法。
三、容器間通信機制
默認網絡:不能用容器名通信
docker run -dit --name a1 busybox
docker run -dit --name a2 busybox
docker exec -it a1 ping a2 # 無法解析
因為默認網絡沒有 DNS 解析;只能用 IP 訪問,但 IP 每次變化
自定義網絡下:支持 DNS 容器名通信
docker network create mynet
docker run -dit --name a1 --network mynet busybox
docker run -dit --name a2 --network mynet busybox
docker exec -it a1 ping a2 # 成功
Docker 會在該網絡中啟用 DNS 服務,自動解析容器名;每個容器注冊自己的名字
四、相關指令
docker network ls
列出所有網絡,包括系統默認和自定義的:
docker network ls
輸出示例:
NETWORK ID NAME DRIVER SCOPE
d72e7e0a6f8b bridge bridge local
d8c7d1ed43e7 host host local
192e5ee1525d none null local
ac28c2fbad1f mynet bridge local
docker network inspect <網絡名>
查看網絡的詳細信息,包括:
- 連接了哪些容器
- 分配了哪些 IP
- DNS 名稱等
docker network inspect mynet
docker network create [參數] <網絡名>
創建一個自定義網絡(推薦):
docker network create mynet
也可以加參數:
docker network create \--driver bridge \--subnet 192.168.100.0/24 \--gateway 192.168.100.1 \mynet
Docker 默認使用 bridge
驅動,你也可以用 overlay
(Swarm)或 macvlan
(高級網絡映射)
docker network rm <網絡名>
刪除網絡(網絡中不能有容器,否則會失敗):
docker network rm mynet
docker network connect
將某個容器連接到另一個網絡:
docker network connect mynet mycontainer
- 容器可以連接多個網絡
- 可用于跨網段打通通信
docker network disconnect
將容器從某網絡斷開:
docker network disconnect mynet mycontainer
如果容器只連接了一個網絡,斷開后它將失去網絡功能。
調試
docker exec
進入容器內測試連接
docker exec -it myapp ping otherapp
docker exec -it myapp nslookup otherapp
docker exec -it myapp curl http://otherapp:5000
docker inspect <容器名>
查看網絡配置
docker inspect myapp
重點字段:
"Networks": {"mynet": {"IPAddress": "172.18.0.2",...}
}