Docker 網絡配置與自定義網絡實戰 2026

💡 Docker 網絡基礎:Docker 提供了強大的網絡功能,允許容器之間、容器與主機之間以及容器與外部網絡之間進行通信。理解 Docker 網絡是構建複雜容器化應用的關鍵。
本文將帶你從 0 到 1 掌握:
- ✅ Docker 默認網絡類型詳解
- ✅ 自定義網絡創建與配置
- ✅ 容器間通信方式
- ✅ 端口映射與網絡訪問
- ✅ 跨主機網絡方案
- ✅ 網絡故障排查技巧
一、Docker 網絡基礎
1.1 Docker 網絡類型概述
Docker 支持多種網絡驅動,每種驅動適用於不同的場景:
| 網絡類型 | 驅動名稱 | 用途 | 隔離性 | 跨主機 |
|---|---|---|---|---|
| Bridge | bridge | 單主機容器間通信 | 高 | ❌ |
| Host | host | 共享主機網絡棧 | 無 | ❌ |
| None | none | 完全隔離 | 最高 | ❌ |
| Overlay | overlay | 跨主機容器通信 | 高 | ✅ |
| Macvlan | macvlan | 直接接入物理網絡 | 中 | ✅ |
| IPvlan | ipvlan | 靈活的 L2/L3 網絡 | 中 | ✅ |
1.2 查看網絡信息
# 列出所有網絡
docker network ls
# 查看網絡詳情
docker network inspect bridge
# 查看容器的網絡配置
docker inspect <container-name> | grep -A 20 "Networks"
# 查看容器的 IP 地址
docker inspect <container-name> --format '{{ .NetworkSettings.IPAddress }}'1.3 Docker 網絡架構
┌─────────────────────────────────────────────────────────────┐
│ Docker Host │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Container │ │ Container │ │ Container │ │
│ │ App1 │ │ App2 │ │ App3 │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │
│ └───────────────────┼───────────────────┘ │
│ │ │
│ ┌────────▼────────┐ │
│ │ Bridge │ │
│ │ Network │ │
│ └────────┬────────┘ │
│ │ │
│ ┌────────▼────────┐ │
│ │ Docker0 │ │
│ │ Virtual │ │
│ │ Bridge │ │
│ └────────┬────────┘ │
│ │ │
│ ┌────────▼────────┐ │
│ │ Host Network │ │
│ │ (eth0/wlan0) │ │
│ └────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘二、默認網絡詳解
2.1 Bridge 網絡
Bridge 是 Docker 的默認網絡類型,容器啟動時默認連接到 bridge 網絡。
# 查看默認 bridge 網絡
docker network inspect bridge
# 創建容器時指定網絡
docker run -d --name my-app --network bridge nginx
# 容器間通過 IP 通信
docker exec -it container1 ping <container2-ip>Bridge 網絡特點:
- 每個容器獲得獨立的 IP 地址
- 容器間可以通過 IP 互相訪問
- 通過 NAT 方式訪問外部網絡
- 默認網絡名稱為
bridge
2.2 Host 網絡
使用 host 網絡時,容器共享主機的網絡棧,不進行網絡隔離。
# 使用 host 網絡
docker run -d --name my-app --network host nginx
# 容器內監聽的端口直接綁定到主機端口
curl http://localhost:80Host 網絡特點:
- 容器共享主機 IP 和端口空間
- 性能最好(無需網絡轉換)
- 安全性較低(端口衝突風險)
- 適用於需要高性能網絡的場景
2.3 None 網絡
None 網絡完全隔離容器,不提供網絡連接。
# 使用 none 網絡
docker run -d --name isolated-app --network none nginx
# 查看網絡配置(只有 loopback)
docker inspect isolated-app | grep -A 10 "Networks"None 網絡特點:
- 只有 loopback 接口
- 完全隔離,無法訪問外部
- 適用於安全性要求極高的場景
- 需要手動配置網絡
三、自定義網絡創建
3.1 創建自定義 Bridge 網絡
# 創建自定義 bridge 網絡
docker network create --driver bridge my-network
# 創建帶自定義子網的網絡
docker network create \
--driver bridge \
--subnet 192.168.100.0/24 \
--gateway 192.168.100.1 \
my-custom-network
# 創建帶 IPv6 支持的網絡
docker network create \
--driver bridge \
--ipv6 \
--subnet fd00:1::/64 \
my-ipv6-network
# 刪除網絡
docker network rm my-network3.2 連接容器到自定義網絡
# 創建容器時連接到自定義網絡
docker run -d --name app1 --network my-network nginx
# 將運行中的容器連接到網絡
docker network connect my-network existing-container
# 斷開容器與網絡的連接
docker network disconnect my-network existing-container
# 容器連接多個網絡
docker run -d --name multi-net-app \
--network bridge \
--network my-network \
nginx3.3 網絡別名與 DNS 解析
# 創建帶別名的網絡
docker network create --driver bridge my-network
# 容器加入網絡時設置別名
docker run -d --name app1 --network my-network --network-alias web nginx
docker run -d --name app2 --network my-network nginx
# 在 app2 中通過別名訪問 app1
docker exec -it app2 ping web
docker exec -it app2 curl http://web
# 自定義 DNS 配置
docker run -d \
--name app \
--network my-network \
--dns 8.8.8.8 \
--dns-search example.com \
nginx3.4 網絡隔離與安全性
# 創建隔離網絡(--internal 禁止外部訪問)
docker network create \
--driver bridge \
--internal \
isolated-network
# 創建帶防火牆規則的網絡
docker network create \
--driver bridge \
--ip-range 172.20.0.0/24 \
--subnet 172.20.0.0/16 \
secure-network
# 查看網絡的 IPAM 配置
docker network inspect secure-network | grep -A 10 "IPAM"四、端口映射
4.1 基本端口映射
# 將容器端口映射到主機端口
docker run -d --name web -p 8080:80 nginx
# 映射多個端口
docker run -d --name app \
-p 8080:80 \
-p 443:443 \
-p 3000:3000 \
nginx
# 指定綁定的主機地址
docker run -d --name web \
-p 127.0.0.1:8080:80 \
nginx
# 隨機端口映射
docker run -d --name web -p 80 nginx
docker port web # 查看映射的端口4.2 端口映射類型
| 選項 | 語法 | 說明 |
|---|---|---|
-p host:container | -p 8080:80 | 綁定指定主機端口 |
-p ip:host:container | -p 127.0.0.1:8080:80 | 綁定指定 IP 和端口 |
-p container | -p 80 | 隨機綁定主機端口 |
-P | -P | 映射所有暴露的端口 |
4.3 Docker Compose 端口映射
version: '3.8'
services:
web:
image: nginx
ports:
# 基本映射
- "8080:80"
# 指定綁定地址
- "127.0.0.1:8443:443"
# 隨機端口
- "3000"
# UDP 端口
- "53:53/udp"
networks:
- my-network
networks:
my-network:
driver: bridge五、容器間通信
5.1 同一網絡內通信
# 創建自定義網絡
docker network create app-network
# 創建服務容器
docker run -d --name db --network app-network \
-e MYSQL_ROOT_PASSWORD=secret \
mysql:8.0
# 創建應用容器,通過容器名訪問數據庫
docker run -d --name web --network app-network \
-e DATABASE_HOST=db \
my-app
# 驗證通信
docker exec -it web ping db
docker exec -it web nslookup db5.2 不同網絡間通信
# 創建兩個隔離網絡
docker network create frontend
docker network create backend
# 創建數據庫(後端網絡)
docker run -d --name db --network backend mysql:8.0
# 創建應用(連接兩個網絡)
docker run -d --name app \
--network frontend \
--network backend \
my-app
# 創建前端(前端網絡)
docker run -d --name web --network frontend nginx5.3 使用 Link(已廢棄,不推薦)
# 舊版 link 方式(不推薦使用)
docker run -d --name db mysql:8.0
docker run -d --name app --link db:database my-app
# 推薦使用自定義網絡替代
docker network create my-network
docker run -d --name db --network my-network mysql:8.0
docker run -d --name app --network my-network my-app六、跨主機網絡
6.1 Overlay 網絡
Overlay 網絡用於 Docker Swarm 集群中的跨主機通信。
# 初始化 Swarm 集群
docker swarm init
# 創建 overlay 網絡
docker network create \
--driver overlay \
--subnet 10.0.0.0/24 \
--attachable \
my-overlay-network
# 在不同節點上創建容器
docker service create \
--name web \
--network my-overlay-network \
--replicas 3 \
nginx6.2 Macvlan 網絡
Macvlan 允許容器直接連接到物理網絡,獲得獨立的 MAC 地址。
# 創建 macvlan 網絡
docker network create \
--driver macvlan \
--subnet 192.168.1.0/24 \
--gateway 192.168.1.1 \
--ip-range 192.168.1.100/28 \
--aux-address "host=192.168.1.10" \
-o parent=eth0 \
my-macvlan-network
# 創建使用 macvlan 的容器
docker run -d \
--name network-app \
--network my-macvlan-network \
--ip 192.168.1.101 \
nginx6.3 IPvlan 網絡
IPvlan 提供更靈活的 L2/L3 網絡配置。
# 創建 IPvlan L2 網絡
docker network create \
--driver ipvlan \
--subnet 192.168.2.0/24 \
--gateway 192.168.2.1 \
-o parent=eth0 \
-o ipvlan_mode=l2 \
my-ipvlan-l2
# 創建 IPvlan L3 網絡
docker network create \
--driver ipvlan \
--subnet 10.0.0.0/24 \
-o parent=eth0 \
-o ipvlan_mode=l3 \
my-ipvlan-l3七、網絡配置最佳實踐
7.1 網絡規劃原則
# 按環境隔離網絡
docker network create --driver bridge dev-network
docker network create --driver bridge prod-network
docker network create --driver bridge staging-network
# 按服務類型隔離
docker network create --driver bridge frontend-network
docker network create --driver bridge backend-network
docker network create --driver bridge database-network7.2 Docker Compose 網絡配置
version: '3.8'
services:
web:
image: nginx
networks:
- frontend
- backend
ports:
- "80:80"
api:
image: my-api
networks:
- backend
- database
db:
image: mysql:8.0
networks:
- database
volumes:
- db-data:/var/lib/mysql
networks:
frontend:
driver: bridge
name: frontend-network
backend:
driver: bridge
name: backend-network
database:
driver: bridge
name: database-network
internal: true # 禁止外部訪問
volumes:
db-data:7.3 安全配置
# 創建內部網絡(禁止外部訪問)
docker network create \
--driver bridge \
--internal \
secure-backend
# 限制容器網絡能力
docker run -d \
--name secure-app \
--network secure-backend \
--cap-drop NET_ADMIN \
--cap-drop NET_RAW \
my-app八、網絡故障排查
8.1 常用排查命令
# 查看網絡列表
docker network ls
# 查看網絡詳情
docker network inspect <network-name>
# 查看容器網絡配置
docker inspect <container-name> | jq '.NetworkSettings'
# 測試容器間連通性
docker exec -it container1 ping container2
docker exec -it container1 curl http://container2:80
# 查看端口映射
docker port <container-name>
# 查看 Docker 網絡日誌
docker logs <container-name> 2>&1 | grep -i network
# 檢查 DNS 解析
docker exec -it container1 nslookup google.com
docker exec -it container1 cat /etc/resolv.conf8.2 常見問題與解決方案
問題 1:容器無法訪問外部網絡
# 檢查容器的 DNS 配置
docker exec -it container cat /etc/resolv.conf
# 手動指定 DNS
docker run -d \
--name app \
--dns 8.8.8.8 \
--dns 1.1.1.1 \
nginx問題 2:容器間無法通信
# 確保容器在同一網絡
docker inspect container1 | grep Networks
docker inspect container2 | grep Networks
# 將容器連接到同一網絡
docker network connect my-network container1
docker network connect my-network container2問題 3:端口映射不生效
# 檢查端口是否被佔用
netstat -tlnp | grep 8080
# 檢查容器是否正常運行
docker ps -a
# 檢查端口映射配置
docker inspect container | grep -A 10 "Ports"問題 4:網絡衝突
# 檢查現有網絡配置
docker network inspect bridge | grep Subnet
# 創建自定義網絡時指定不同子網
docker network create \
--driver bridge \
--subnet 192.168.200.0/24 \
my-network8.3 使用 tcpdump 抓包
# 在容器內安裝 tcpdump
docker exec -it container apt-get update && apt-get install -y tcpdump
# 捕獲網絡流量
docker exec -it container tcpdump -i eth0 -w /tmp/capture.pcap
# 分析抓包文件
docker cp container:/tmp/capture.pcap .
tcpdump -r capture.pcap九、網絡性能優化
9.1 選擇合適的網絡驅動
| 場景 | 推薦驅動 | 原因 |
|---|---|---|
| 單主機多容器 | Bridge | 隔離性好,性能適中 |
| 高性能需求 | Host | 零網絡開銷 |
| 跨主機通信 | Overlay | Swarm 原生支持 |
| 物理網絡接入 | Macvlan | 直接訪問物理網絡 |
9.2 調整 MTU 大小
# 查看當前 MTU
ip link show docker0
# 創建網絡時指定 MTU
docker network create \
--driver bridge \
--mtu 1450 \
optimized-network
# 修改 Docker 默認 MTU(需要重啟)
echo '{
"mtu": 1450
}' > /etc/docker/daemon.json
systemctl restart docker9.3 禁用不必要的網絡功能
# 禁用 IPv6(如果不需要)
echo '{
"ipv6": false
}' > /etc/docker/daemon.json
# 使用 --no-dns 禁用 DNS(特殊場景)
docker run -d \
--name app \
--network none \
--no-dns \
my-app結語
Docker 網絡是容器化應用的核心基礎設施,正確配置網絡對於應用的安全性、性能和可擴展性至關重要。通過本文的學習,你已經掌握了:
- 網絡類型:Bridge、Host、None、Overlay、Macvlan、IPvlan
- 自定義網絡:創建、配置、隔離
- 容器通信:同一網絡、跨網絡、DNS 解析
- 端口映射:基本映射、高級配置
- 跨主機網絡:Overlay、Macvlan、IPvlan
- 故障排查:常用命令、常見問題解決方案
推薦閱讀:
🚀 提示: 在生產環境中,建議使用自定義網絡進行服務隔離,避免使用默認的 bridge 網絡。同時,根據實際需求選擇合適的網絡驅動,平衡性能和安全性。
延伸阅读
免责声明
本文仅供技术交流和学习参考。涉及第三方服务的链接可能包含 sponsored 标记,请自行核实服务条款、价格和可用性,并遵守当地法律法规。