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 nginxhost 模式
原理
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容器无法访问外网
- 检查宿主机网络是否正常
- 确认 NAT 转发已开启:
cat /proc/sys/net/ipv4/ip_forward
# 返回 1 表示正常- 检查防火墙是否放行 Docker 流量
自定义网络容器通信
同一自定义网络中的容器可通过容器名互相访问:
docker run -d --name web --network my-net nginx
docker run -it --network my-net busybox ping webbridge 网络与自定义网络的差异
| 特性 | 默认 bridge | 自定义 bridge |
|---|---|---|
| 容器名解析 | ❌ 不支持 | ✅ 支持 |
| 网络隔离 | ❌ 所有容器互通 | ✅ 可隔离 |
| 自定义网段 | ❌ 固定 172.17.0.0/16 | ✅ 可自定义 |
| 容器热加入 | ❌ 需重启 | ✅ docker network connect |
容器 IP 冲突
使用自定义网络并指定固定 IP 时,确保 IP 未被其他容器占用:
docker network inspect my-bridge-network | grep -E "IPv4Address|Container"