【架构实战】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统一管理网络配置

个人观点,仅供参考

相关推荐
xier_ran8 小时前
【infra之路】阶段二 · 模块一:GPU 架构与显存层级
人工智能·架构
阿狸猿8 小时前
论事件驱动架构在软件开发中的应用
架构
24zhgjx-fuhao8 小时前
虚链路的配置
开发语言·网络·php
步十人8 小时前
【Redis】网络高并发模型
网络·数据库·redis
cxr8288 小时前
高分子复合材料 AI 逆向设计合——核心生成引擎与物理约束架构
人工智能·架构·材料逆向合成
香气袭人知骤暖8 小时前
人大金仓(KingbaseES)Docker 容器自动备份方案
运维·docker·容器
2401_892423369 小时前
OSPF实验
网络
koo3649 小时前
周报5.31
网络
それども9 小时前
怎么理解TCP的状态
java·网络·网络协议·tcp/ip·dubbo
大熊程序猿9 小时前
MarkItDown Docker安装
运维·docker·容器