跳轉到內容

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

Docker 網絡配置

💡 Docker 網絡基礎:Docker 提供了強大的網絡功能,允許容器之間、容器與主機之間以及容器與外部網絡之間進行通信。理解 Docker 網絡是構建複雜容器化應用的關鍵。

本文將帶你從 0 到 1 掌握:

  • ✅ Docker 默認網絡類型詳解
  • ✅ 自定義網絡創建與配置
  • ✅ 容器間通信方式
  • ✅ 端口映射與網絡訪問
  • ✅ 跨主機網絡方案
  • ✅ 網絡故障排查技巧

一、Docker 網絡基礎

1.1 Docker 網絡類型概述

Docker 支持多種網絡驅動,每種驅動適用於不同的場景:

網絡類型驅動名稱用途隔離性跨主機
Bridgebridge單主機容器間通信
Hosthost共享主機網絡棧
Nonenone完全隔離最高
Overlayoverlay跨主機容器通信
Macvlanmacvlan直接接入物理網絡
IPvlanipvlan靈活的 L2/L3 網絡

1.2 查看網絡信息

bash
# 列出所有網絡
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 網絡。

bash
# 查看默認 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 網絡時,容器共享主機的網絡棧,不進行網絡隔離。

bash
# 使用 host 網絡
docker run -d --name my-app --network host nginx

# 容器內監聽的端口直接綁定到主機端口
curl http://localhost:80

Host 網絡特點:

  • 容器共享主機 IP 和端口空間
  • 性能最好(無需網絡轉換)
  • 安全性較低(端口衝突風險)
  • 適用於需要高性能網絡的場景

2.3 None 網絡

None 網絡完全隔離容器,不提供網絡連接。

bash
# 使用 none 網絡
docker run -d --name isolated-app --network none nginx

# 查看網絡配置(只有 loopback)
docker inspect isolated-app | grep -A 10 "Networks"

None 網絡特點:

  • 只有 loopback 接口
  • 完全隔離,無法訪問外部
  • 適用於安全性要求極高的場景
  • 需要手動配置網絡

三、自定義網絡創建

3.1 創建自定義 Bridge 網絡

bash
# 創建自定義 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-network

3.2 連接容器到自定義網絡

bash
# 創建容器時連接到自定義網絡
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 \
  nginx

3.3 網絡別名與 DNS 解析

bash
# 創建帶別名的網絡
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 \
  nginx

3.4 網絡隔離與安全性

bash
# 創建隔離網絡(--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 基本端口映射

bash
# 將容器端口映射到主機端口
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 端口映射

yaml
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 同一網絡內通信

bash
# 創建自定義網絡
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 db

5.2 不同網絡間通信

bash
# 創建兩個隔離網絡
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 nginx
bash
# 舊版 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 集群中的跨主機通信。

bash
# 初始化 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 \
  nginx

6.2 Macvlan 網絡

Macvlan 允許容器直接連接到物理網絡,獲得獨立的 MAC 地址。

bash
# 創建 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 \
  nginx

6.3 IPvlan 網絡

IPvlan 提供更靈活的 L2/L3 網絡配置。

bash
# 創建 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 網絡規劃原則

bash
# 按環境隔離網絡
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-network

7.2 Docker Compose 網絡配置

yaml
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 安全配置

bash
# 創建內部網絡(禁止外部訪問)
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 常用排查命令

bash
# 查看網絡列表
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.conf

8.2 常見問題與解決方案

問題 1:容器無法訪問外部網絡

bash
# 檢查容器的 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:容器間無法通信

bash
# 確保容器在同一網絡
docker inspect container1 | grep Networks
docker inspect container2 | grep Networks

# 將容器連接到同一網絡
docker network connect my-network container1
docker network connect my-network container2

問題 3:端口映射不生效

bash
# 檢查端口是否被佔用
netstat -tlnp | grep 8080

# 檢查容器是否正常運行
docker ps -a

# 檢查端口映射配置
docker inspect container | grep -A 10 "Ports"

問題 4:網絡衝突

bash
# 檢查現有網絡配置
docker network inspect bridge | grep Subnet

# 創建自定義網絡時指定不同子網
docker network create \
  --driver bridge \
  --subnet 192.168.200.0/24 \
  my-network

8.3 使用 tcpdump 抓包

bash
# 在容器內安裝 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零網絡開銷
跨主機通信OverlaySwarm 原生支持
物理網絡接入Macvlan直接訪問物理網絡

9.2 調整 MTU 大小

bash
# 查看當前 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 docker

9.3 禁用不必要的網絡功能

bash
# 禁用 IPv6(如果不需要)
echo '{
  "ipv6": false
}' > /etc/docker/daemon.json

# 使用 --no-dns 禁用 DNS(特殊場景)
docker run -d \
  --name app \
  --network none \
  --no-dns \
  my-app

結語

Docker 網絡是容器化應用的核心基礎設施,正確配置網絡對於應用的安全性、性能和可擴展性至關重要。通過本文的學習,你已經掌握了:

  1. 網絡類型:Bridge、Host、None、Overlay、Macvlan、IPvlan
  2. 自定義網絡:創建、配置、隔離
  3. 容器通信:同一網絡、跨網絡、DNS 解析
  4. 端口映射:基本映射、高級配置
  5. 跨主機網絡:Overlay、Macvlan、IPvlan
  6. 故障排查:常用命令、常見問題解決方案

推薦閱讀:


🚀 提示: 在生產環境中,建議使用自定義網絡進行服務隔離,避免使用默認的 bridge 網絡。同時,根據實際需求選擇合適的網絡驅動,平衡性能和安全性。


延伸阅读

免责声明

本文仅供技术交流和学习参考。涉及第三方服务的链接可能包含 sponsored 标记,请自行核实服务条款、价格和可用性,并遵守当地法律法规。

最後更新於: