Docker网络

Docker网络

概述

Docker 网络是容器与外部(宿主机、其他容器、互联网)通信的基础。本文档详细介绍 Docker 的核心网络模式、自定义网络配置、端口映射及常见问题排查。

核心作用

  • 容器与容器之间的互联互通
  • 容器与宿主机之间的网络交互
  • 容器与外部网络的通信
  • 网络隔离与访问控制

核心概念

概念 说明
网络命名空间 Linux 内核提供的网络隔离技术,每个容器拥有独立网卡、IP、路由表
网桥(Bridge) 连接同一宿主机上多个容器的虚拟交换机
端口映射 宿主机端口映射到容器端口,实现外部访问
IP 地址分配 Docker 自动为容器分配 IP,也支持手动指定
网络驱动 不同驱动对应不同网络模式(bridge、host、overlay 等)

bridge 模式(默认模式)

原理

Docker 默认使用 bridge 模式,宿主机创建一个名为 docker0 的虚拟网桥,所有容器连接到该网桥。容器通过 veth pair 虚拟网卡连接 docker0,实现与其他容器和外部网络的通信。

容器 IP 默认从 172.17.0.0/16 网段分配,网关为 172.17.0.1

特点

  • 容器拥有独立网络命名空间
  • 同宿主机容器通过 docker0 直接通信
  • 访问外部网络需通过 NAT 转换
  • 外部访问需配置端口映射

使用方式

# 默认使用 bridge 模式
docker run -it --name test-container nginx

# 手动指定 bridge 模式
docker run -it --name test-container --network bridge nginx

host 模式

原理

host 模式下,容器共享宿主机的网络命名空间,无独立网卡和 IP,直接使用宿主机网络资源。

特点

  • 无独立 IP,共享宿主机网络
  • 网络性能最优(无 NAT 转换开销)
  • 端口冲突风险高
  • 无网络隔离

使用方式

docker run -it --name test-host-container --network host nginx

容器内 80 端口直接占用宿主机 80 端口。


none 模式

原理

容器拥有独立网络命名空间,但不配置任何网络资源(无网卡、无 IP),完全隔离。

特点

  • 网络隔离性最强
  • 适用于无需网络通信的场景(如离线数据处理)

使用方式

docker run -it --name test-none-container --network none nginx

自定义网络

创建自定义网络

# 基本创建(自动分配网段)
docker network create my-bridge-network

# 指定网段和网关
docker network create \
  --driver bridge \
  --subnet 172.20.0.0/16 \
  --gateway 172.20.0.1 \
  my-bridge-network

容器加入自定义网络

# 启动时加入
docker run -it --name test-container1 --network my-bridge-network nginx

# 运行中的容器加入
docker network connect my-bridge-network test-container2

分配固定 IP

docker run -it --name test-fixed-ip \
  --network my-bridge-network \
  --ip 172.20.0.10 \
  nginx

端口映射配置

# 基本端口映射(宿主机 8080 → 容器 80)
docker run -it -p 8080:80 --name test-port-container nginx

# 绑定指定宿主机 IP
docker run -it -p 192.168.1.100:8080:80 nginx

# 仅本地回环访问(127.0.0.1)
docker run -it -p 127.0.0.1:8080:80 nginx

# 映射 UDP 端口
docker run -it -p 53:53/udp nginx

# 映射多个端口
docker run -it -p 80:80 -p 443:443 nginx

容器 DNS 配置

# 启动时指定 DNS
docker run -it --name test-dns \
  --dns 8.8.8.8 \
  --dns 114.114.114.114 \
  nginx

# 查看容器 DNS 配置
docker exec test-dns cat /etc/resolv.conf

网络管理常用命令

操作 命令
查看所有网络 docker network ls
查看网络详情 docker network inspect <网络名>
创建网络 docker network create <网络名>
删除网络 docker network rm <网络名>
容器加入网络 docker network connect <网络名> <容器名>
容器退出网络 docker network disconnect <网络名> <容器名>
查看容器 IP docker inspect <容器名> | grep IPAddress

常见问题与注意事项

端口被占用

# 查看端口占用
netstat -tlnp | grep 8080

# 修改映射端口
docker run -p 8081:80 nginx

容器无法访问外网

  1. 检查宿主机网络是否正常
  2. 确认 NAT 转发已开启:
cat /proc/sys/net/ipv4/ip_forward
# 返回 1 表示正常
  1. 检查防火墙是否放行 Docker 流量

自定义网络容器通信

同一自定义网络中的容器可通过容器名互相访问:

docker run -d --name web --network my-net nginx
docker run -it --network my-net busybox ping web

bridge 网络与自定义网络的差异

特性 默认 bridge 自定义 bridge
容器名解析 ❌ 不支持 ✅ 支持
网络隔离 ❌ 所有容器互通 ✅ 可隔离
自定义网段 ❌ 固定 172.17.0.0/16 ✅ 可自定义
容器热加入 ❌ 需重启 docker network connect

容器 IP 冲突

使用自定义网络并指定固定 IP 时,确保 IP 未被其他容器占用:

docker network inspect my-bridge-network | grep -E "IPv4Address|Container"

参考链接