9.7 容器網路高階屬性

本節聚焦 Docker 自身可見的高階網路能力:Overlay 網路、服務發現和 DNS 解析。更偏 Kubernetes 編排網路的概念,如 CNI 和 NetworkPolicy,不在本章展開。

9.7.1 Overlay 網路原理與設定

Overlay 網路在現有網路基礎上建立虛擬網路,允許容器跨宿主機通訊。它是 Swarm 場景下的核心網絡驅動之一。

Overlay 網路工作原理

Overlay 網路透過隧道封裝技術(通常是 VXLAN)將容器網路流量封裝在宿主機物理網路的 UDP 資料套件中傳輸。Docker overlay 網路預設使用 4789/udp 作為資料通道連接埠,同時 Swarm 控制面與節點通訊還需要相應開放 2377/tcp7946/tcp7946/udp

容器 A (192.168.0.2)
veth 對
br-net (網橋)
Docker 引擎 (VXLAN 封裝)
物理網路 (172.16.0.0/24)
Docker 引擎 (VXLAN 解封裝)
br-net (網橋)
veth 對
容器 B (192.168.0.3,不同宿主機)

建立和使用 Overlay 網路

Overlay 網路依賴 Swarm。若要讓獨立容器加入 overlay 網路,需要把網路建立為 attachable

# 初始化 Swarm
docker swarm init

# 建立 attachable overlay 網路
docker network create --driver overlay \
  --attachable \
  --subnet 192.168.0.0/24 \
  --opt com.docker.network.driver.mtu=1450 \
  my-overlay-net

# 驗證網路建立
docker network ls
docker network inspect my-overlay-net

# 在 Swarm 服務中使用 overlay 網路
docker service create --name web \
  --network my-overlay-net \
  --replicas 3 \
  nginx  # 確保與環境相容的 Nginx 版本

# 單機環境下也可以讓普通容器加入 attachable overlay 網路
docker run -d --name container1 --network my-overlay-net busybox sleep 1d
docker run -d --name container2 --network my-overlay-net busybox sleep 1d

# 測試跨容器通訊
docker exec container1 ping -c 1 container2

Overlay 網路效能最佳化

# 調整 MTU(Maximum Transmission Unit)避免分片
# VXLAN 開銷 50 位元組,物理 MTU 1500 時建議設定為 1450
docker network create --driver overlay \
  --attachable \
  --opt com.docker.network.driver.mtu=1450 \
  optimized-overlay

# 啟用 IP 地址管理(IPAM)自定義
docker network create --driver overlay \
  --attachable \
  --subnet 10.0.9.0/24 \
  --aux-address "my-router=10.0.9.2" \
  my-custom-overlay

9.7.2 容器 DNS 解析機制

Docker 內建 DNS 伺服器,但 DNS 解析涉及多個層面的設定。

DNS 解析流程

容器應用 (dig www.example.com)
容器內 /etc/resolv.conf (127.0.0.11:53)
Docker 內嵌 DNS 伺服器 (127.0.0.11)
使用者自定義 DNS 或宿主機 /etc/resolv.conf
外部 DNS 伺服器 (8.8.8.8 等)
DNS 回應 → 容器快取 → 應用

設定容器 DNS

在執行時指定 DNS:

# 單個容器
docker run -d \
  --dns 8.8.8.8 \
  --dns 1.1.1.1 \
  --dns-search example.com \
  nginx  # 確保與環境相容的 Nginx 版本

# DNS 選項
docker run -d \
  --dns-option ndots:2 \
  --dns-option timeout:1 \
  --dns-option attempts:3 \
  nginx  # 確保與環境相容的 Nginx 版本

# 檢視容器 DNS 設定
docker exec <container_id> cat /etc/resolv.conf

Docker Compose DNS 設定:

services:
  web:
    image: nginx
    dns:
      - 8.8.8.8
      - 1.1.1.1
    dns_search:
      - example.com
      - local

  db:
    image: postgres
    networks:
      - backend
    hostname: postgres-db

networks:
  backend:
    driver: bridge

# 容器內 /etc/resolv.conf 將被自動設定
# search example.com local
# nameserver 8.8.8.8
# nameserver 1.1.1.1

Docker 守護程序級別設定:

{
  "dns": ["8.8.8.8", "1.1.1.1"],
  "dns-search": ["example.com"]
}

自定義服務發現

使用 Docker 內建 DNS 的服務發現:

# 建立自定義網路
docker network create mynet

# 執行服務
docker run -d --name web --network mynet nginx  # 確保與環境相容的 Nginx 版本
docker run -d --name db --network mynet postgres  # 確保與環境相容的 PostgreSQL 版本

# 在其他容器中透過服務名訪問
docker run -it --network mynet busybox sh

# ping web  # 自動解析到 web 容器 IP
# ping db   # 自動解析到 db 容器 IP

Compose 服務名自動發現:

services:
  frontend:
    image: nginx
    depends_on:
      - backend
    environment:
      BACKEND_URL: http://backend:8080

  backend:
    image: myapp
    depends_on:
      - database

  database:
    image: postgres
    environment:
      POSTGRES_DB: mydb

# frontend 容器可以直接訪問 http://backend:8080
# backend 容器可以直接訪問 postgres://database:5432

9.7.3 本章邊界

Docker 的網路章節重點討論 bridge、host、none、overlay 和 DNS 等能力。CNI、NetworkPolicy、Calico、Cilium 這類概念屬於 Kubernetes 編排網路的範疇,後續在 Kubernetes 章節中再展開會更清晰。

第 81 页,共 196 页
使用 mdPress 构建