Docker网络模式深度解析:bridge、overlay与macvlan


文档摘要

Docker网络模式深度解析 Docker提供多种网络模式,满足不同场景的容器通信需求。 网络模式概览 五种网络模式 bridge:默认模式,容器通过虚拟网桥通信 host:容器使用宿主机网络栈 none:无网络配置 overlay:跨主机容器网络 macvlan:容器直接连接物理网络 Bridge网络 工作原理 自定义Bridge网络 容器间通信 端口映射 Bridge网络配置 Overlay网络 跨主机通信 Overlay网络用于Swarm集群,实现跨主机容器通信。 Overlay网络原理 Overlay网络使用VXLAN技术封装网络包: 加密Overlay网络 Macvlan网络 基本概念 Macvlan为容器分配独立的MAC地址,直接连接物理网络。

Docker网络模式深度解析

Docker提供多种网络模式,满足不同场景的容器通信需求。

网络模式概览

五种网络模式

  1. bridge:默认模式,容器通过虚拟网桥通信
  2. host:容器使用宿主机网络栈
  3. none:无网络配置
  4. overlay:跨主机容器网络
  5. macvlan:容器直接连接物理网络
# 查看网络模式 docker network ls # 创建自定义网络 docker network create --driver bridge my-network # 容器指定网络 docker run --network=bridge nginx

Bridge网络

工作原理

┌─────────────┐ │ Container │ │ eth0:172.17.0.2 │ └──────┬──────┘ │ ┌──────▼──────┐ │ docker0 │ │ 172.17.0.1 │ └──────┬──────┘ │ ┌──────▼──────┐ │ Host eth0 │ │ 192.168.1.100 │ └─────────────┘

自定义Bridge网络

# 创建自定义bridge网络 docker network create \ --driver bridge \ --subnet=172.20.0.0/16 \ --ip-range=172.20.10.0/24 \ --gateway=172.20.10.1 \ my-bridge # 容器连接到自定义网络 docker run --network=my-bridge nginx # 容器连接多个网络 docker run --network=bridge --network=my-bridge nginx

容器间通信

# 启动两个容器 docker run -d --name db --network=my-bridge postgres docker run -d --name app --network=my-bridge node:app # 容器通过DNS互相访问 # app容器可以通过db主机名访问数据库

端口映射

# 映射单个端口 docker run -p 8080:80 nginx # 映射多个端口 docker run -p 80:80 -p 443:443 nginx # 映射到随机端口 docker run -p 80 nginx # 映射到特定接口 docker run -p 127.0.0.1:8080:80 nginx

Bridge网络配置

# 查看bridge网络详情 docker network inspect bridge # 容器IP地址 docker inspect --format='{{.NetworkSettings.IPAddress}}' container_name # 容器DNS配置 docker run --dns=8.8.8.8 --dns=8.8.4.4 nginx

Overlay网络

跨主机通信

Overlay网络用于Swarm集群,实现跨主机容器通信。

# 初始化Swarm docker swarm init # 创建overlay网络 docker network create \ --driver overlay \ --subnet=10.0.0.0/24 \ my-overlay # 服务使用overlay网络 docker service create \ --name web \ --network my-overlay \ nginx

Overlay网络原理

Overlay网络使用VXLAN技术封装网络包:

Container (192.168.1.2) ↓ VXLAN封装 (UDP 4789) ↓ Host eth0 (10.0.0.1) ↓ 物理网络 ↓ 目标Host eth0 (10.0.0.2) ↓ VXLAN解封装 ↓ 目标Container (192.168.1.3)

加密Overlay网络

# 创建加密overlay网络 docker network create \ --driver overlay \ --opt encrypted \ my-secure-overlay

Macvlan网络

基本概念

Macvlan为容器分配独立的MAC地址,直接连接物理网络。

# 创建macvlan网络 docker network create \ --driver macvlan \ --subnet=192.168.1.0/24 \ --gateway=192.168.1.1 \ -o parent=eth0 \ my-macvlan # 使用macvlan网络 docker run --network=my-macvlan nginx

Macvlan模式

Bridge模式:容器与宿主机在同一子网

docker network create \ --driver macvlan \ --mode bridge \ --subnet=192.168.1.0/24 \ --gateway=192.168.1.1 \ -o parent=eth0 \ macvlan_bridge

Private模式:容器间无法直接通信

docker network create \ --driver macvlan \ --mode private \ --subnet=192.168.1.0/24 \ -o parent=eth0 \ macvlan_private

IPVlan

Ipvlan共享MAC地址,只分配IP:

# 创建ipvlan网络 docker network create \ --driver ipvlan \ --mode l2 \ --subnet=192.168.1.0/24 \ -o parent=eth0 \ my-ipvlan # L3模式(路由) docker network create \ --driver ipvlan \ --mode l3 \ --subnet=192.168.1.0/24 \ -o parent=eth0 \ ipvlan_l3

Host网络

直接使用宿主机网络

# 使用host网络 docker run --network=host nginx # 容器直接绑定宿主机端口 docker run --network=host -p 80:80 nginx

Host网络特点

  • 容器与宿主机共享网络栈
  • 无端口映射,直接绑定
  • 性能最优,隔离性差
# 查看容器网络配置 docker inspect --format='{{.HostConfig.NetworkMode}}' container_name

None网络

禁用网络

# 创建无网络容器 docker run --network=none alpine sleep 100 # 查看网络接口 docker exec container_name ip addr

使用场景

  • 高安全要求
  • 离线处理任务
  • 自定义网络配置

网络高级配置

DNS配置

# 自定义DNS docker run --dns=8.8.8.8 --dns=8.8.4.4 nginx # DNS搜索域 docker run --dns-search=example.com nginx # 覆盖DNS配置 docker run --dns-opt=timeout:2 nginx

主机名和别名

# 设置容器主机名 docker run --hostname=myhost nginx # 添加网络别名 docker run --network=my-bridge --network-alias=web nginx # /etc/hosts配置 docker run --add-host=database:192.168.1.100 nginx

网络性能优化

# 禁用网络性能加速 docker run --network=bridge --sysctl net.ipv4.conf.all.src_valid_mark=1 nginx # 修改MTU docker network create \ --driver bridge \ --opt com.docker.network.driver.mtu=1450 \ my-network

网络故障排查

常用诊断命令

# 查看容器网络 docker inspect container_name # 测试容器连通性 docker exec container_name ping google.com # 查看网络流量 docker exec container_name tcpdump -i eth0 # 检查DNS解析 docker exec container_name nslookup google.com

网络问题排查

# 容器无法访问外部 docker exec container_name ip route docker exec container_name iptables -L # 容器间无法通信 docker network inspect my-network docker exec container_name cat /etc/hosts # 端口映射问题 docker port container_name docker logs container_name

Docker网络模式各有特点。Bridge适合开发,Overlay适合集群,Macvlan适合需要独立IP的场景。根据需求选择合适的网络模式。


发布者: 作者: 转发
评论区 (0)
U