【架构实战】Docker容器网络模型详解

一、Docker网络概述

Docker容器网络是云原生架构的基础:

网络模型:

  • Bridge(桥接模式)
  • Host(主机模式)
  • Overlay(覆盖网络)
  • Macvlan
  • None

二、Bridge网络

1. 原理

复制代码
┌─────────────┐     ┌─────────────┐
│  Container  │     │  Container  │
│  nginx:80   │     │  mysql:3306 │
└──────┬──────┘     └──────┬──────┘
       │                   │
       │ 172.17.0.2        │ 172.17.0.3
       │                   │
┌──────┴──────────────────┴──────┐
│        docker0 bridge         │
│         172.17.0.1            │
└──────────────┬────────────────┘
               │
        ┌──────┴──────┐
        │   Host NIC   │
        │ 192.168.1.100│
        └─────────────┘

2. 使用

bash 复制代码
# 创建网络
docker network create my-bridge

# 运行容器指定网络
docker run -d --name web --network my-bridge nginx

# 查看网络
docker network inspect my-bridge

# 容器间通信
docker exec -it web ping mysql

3. 端口映射

bash 复制代码
# 映射端口
docker run -d -p 8080:80 nginx

# 随机端口
docker run -d -P nginx

# 指定IP和端口
docker run -d -p 127.0.0.1:8080:80 nginx

三、Host网络

1. 原理

容器直接使用主机网络栈:

bash 复制代码
# 使用host网络
docker run -d --network host nginx

2. 适用场景

  • 性能敏感场景
  • 需要使用主机端口
  • 网络调试

四、Overlay网络

1. 原理

跨主机容器通信:

复制代码
┌─────────────────┐     ┌─────────────────┐
│    Host A       │     │    Host B       │
│  ┌───────────┐  │     │  ┌───────────┐  │
│  │ Container │  │     │  │ Container │  │
│  │172.18.0.2 │  │     │  │172.18.0.3 │  │
│  └─────┬─────┘  │     │  └─────┬─────┘  │
│        │        │     │        │        │
│  ┌─────┴─────┐  │     │  ┌─────┴─────┐  │
│  │  overlay  │  │◄────┼─►│  overlay  │  │
│  └───────────┘  │     │  └───────────┘  │
└─────────────────┘     └─────────────────┘

2. 创建Overlay网络

bash 复制代码
# 初始化Swarm
docker swarm init

# 创建overlay网络
docker network create -d overlay my-overlay

# 运行服务
docker service create --network my-overlay nginx

五、Macvlan网络

1. 原理

容器直接获取物理网络MAC地址:

bash 复制代码
# 创建macvlan网络
docker network create -d macvlan \
  --subnet=192.168.1.0/24 \
  --gateway=192.168.1.1 \
  -o parent=eth0 my-macvlan

# 运行容器
docker run -d --network my-macvlan nginx

2. 适用场景

  • 需直接暴露容器IP
  • 旧应用迁移
  • 网络隔离

六、网络隔离

1. 网络隔离

bash 复制代码
# 创建隔离网络
docker network create --internal backend

# 只有内部网络的容器
docker run -d --network backend mysql

2. DNS管理

yaml 复制代码
# docker-compose.yml
services:
  web:
    image: nginx
    networks:
      - frontend
  db:
    image: mysql
    networks:
      - backend

networks:
  frontend:
  backend:

七、常用命令

bash 复制代码
# 列出网络
docker network ls

# 查看网络详情
docker network inspect bridge

# 删除未使用的网络
docker network prune

# 连接容器到网络
docker network connect my-network container

# 断开容器网络
docker network disconnect my-network container

八、总结

Docker网络模型选择:

  • Bridge:默认模式,适合单主机
  • Host:高性能,直接使用主机网络
  • Overlay:跨主机通信,Swarm/K8s
  • Macvlan:需要独立IP

最佳实践:

  1. 生产环境使用自定义网络
  2. 合理规划网络段
  3. 做好网络隔离

3. 网络别名

bash 复制代码
# Docker Compose网络
version: '3'
services:
  web:
    image: nginx
    networks:
      - frontend
      - backend
  db:
    image: mysql
    networks:
      - backend

networks:
  frontend:
  backend:
    internal: true  # 完全隔离

九、Docker Compose网络

1. 网络配置

yaml 复制代码
# docker-compose.yml
version: '3.8'
services:
  app:
    build: .
    networks:
      - app-network
  db:
    image: mysql
    networks:
      - app-network

networks:
  app-network:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/16

2. 外部网络

yaml 复制代码
# 连接外部网络
networks:
  existing-network:
    external: true

十、总结

Docker网络模型选择要点:

  • Bridge:默认模式,适合单主机多容器
  • Host:高性能,直接使用主机网络
  • Overlay:跨主机通信,适用于Swarm/K8s
  • Macvlan:需要为容器分配独立IP

最佳实践:

  1. 生产环境使用自定义网络
  2. 合理规划网络段,避免冲突
  3. 做好网络隔离,敏感服务使用internal网络
  4. 使用Docker Compose统一管理网络配置

个人观点,仅供参考

相关推荐
Kiyra几秒前
限流不是加个计数器就行:用 Lua 脚本实现多维度原子限流
开发语言·人工智能·网络协议·职场和发展·架构·lua·ai-native
SamDeepThinking11 分钟前
千万级用户购物车系统的架构设计
java·后端·架构
前端不太难14 分钟前
鸿蒙 App 的 Task + State 双核心架构
架构·状态模式·harmonyos
十年编程老舅16 分钟前
深度长文|Linux 图形与显示架构
linux·运维·后端·架构·内核·linux内核·通信机制
染予35 分钟前
共阵面系统学习
网络·学习
heimeiyingwang41 分钟前
【架构实战】服务注册与发现Nacos:微服务时代的“电话总机“
网络·架构
薛定猫AI42 分钟前
【深度解析】Gemma Chat:基于 MLX 的 Mac 离线 Coding Agent 架构与实战
macos·架构
星梦清河44 分钟前
微服务-Elasticsearch01
elasticsearch·微服务·架构
Cat_Rocky1 小时前
K8s RBAC认证 简单讲
java·docker·kubernetes
wufeng无峰1 小时前
docker国内镜像源
运维·docker·容器·镜像