Docker 容器网络配置详解:从入门到精通

前言

Docker 网络是容器化部署中最容易踩坑的部分。本文将系统讲解 Docker 网络模型,帮助你彻底理解容器间通信机制。

一、Docker 网络驱动类型

1. Bridge(桥接模式)- 默认

# 创建自定义 bridge 网络
docker network create --driver bridge mynet

# 启动容器并连接
docker run -d --name web --network mynet nginx
docker run -d --name db --network mynet mysql

特点:容器在同一网段,可通过容器名互访

2. Host(主机模式)

docker run -d --network host nginx

特点:容器共享主机网络栈,无网络隔离

适用:性能敏感、需要真实 IP 的场景

3. None(无网络)

docker run -d --network none alpine

特点:完全隔离,需手动配置网络

4. Overlay(覆盖网络)

docker network create --driver overlay swarm-net

特点:跨主机容器通信,用于 Swarm/K8s

5. Macvlan

docker network create -d macvlan \
  --subnet=192.168.1.0/24 \
  --gateway=192.168.1.1 \
  -o parent=eth0 macvlan-net

特点:容器获得独立 MAC 地址,像物理设备一样接入网络

二、容器间通信实战

场景 1:Web + 数据库

# 创建网络
docker network create app-net

# 启动数据库
docker run -d \
  --name mysql \
  --network app-net \
  -e MYSQL_ROOT_PASSWORD=secret \
  mysql:8

# 启动 Web 应用
docker run -d \
  --name webapp \
  --network app-net \
  -e DB_HOST=mysql \
  -p 8080:80 \
  myapp

Web 应用通过 mysql 主机名访问数据库

场景 2:多容器服务发现

# 使用 Docker Compose
version: "3.8"
services:
  web:
    image: nginx
    networks:
      - frontend
      - backend
  api:
    image: node:18
    networks:
      - backend
  db:
    image: postgres
    networks:
      - backend

networks:
  frontend:
  backend:
    internal: true  # 内部网络,外部不可访问

三、端口映射详解

基本映射

# 主机端口 8080 → 容器端口 80
docker run -p 8080:80 nginx

# 指定 IP
docker run -p 127.0.0.1:8080:80 nginx

# 端口范围
docker run -p 8080-8090:80-90 nginx

动态端口映射

# 主机随机端口 → 容器 80
docker run -P nginx

# 查看映射端口
docker port container_id

四、网络故障排查

1. 检查网络配置

# 查看所有网络
docker network ls

# 查看网络详情
docker network inspect mynet

# 查看容器网络信息
docker inspect --format="{{.NetworkSettings.Networks}}" container_id

2. 容器内网络诊断

# 进入容器
docker exec -it container_id sh

# 测试连通性
ping other_container
curl http://service:port

# 查看路由和 DNS
ip route
cat /etc/resolv.conf

3. 常见问题

  • DNS 解析失败:检查 /etc/resolv.conf,使用 –dns 指定
  • 端口冲突:检查主机端口占用 netstat -tulpn
  • 防火墙阻挡:检查 iptables/ufw 规则

五、性能优化建议

  • 使用 host 网络模式可获得最佳性能(但牺牲隔离)
  • 避免过多端口映射,使用反向代理统一入口
  • 生产环境使用内部网络隔离敏感服务
  • 考虑使用 CNI 插件(如 Calico、Flannel)获得更好性能

总结

理解 Docker 网络模型是容器化部署的基础。根据场景选择合适的网络驱动,合理设计网络拓扑,才能构建稳定高效的容器网络。

上一篇 AI 时代的个人数据管理策略