跳转到内容

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 标记,请自行核实服务条款、价格和可用性,并遵守当地法律法规。