Docker 网络模式详解与配置
Docker 网络是容器化部署中的核心概念之一。正确理解和配置 Docker 网络,不仅关系到容器之间的通信效率,还直接影响应用的安全性和可靠性。本文将在搬瓦工 VPS 环境下详细讲解 Docker 的各种网络模式,以及如何根据实际需求进行配置。
一、Docker 网络基础
安装 Docker 后,系统会自动创建三个默认网络:
# 查看所有 Docker 网络
docker network ls
# 输出示例:
# NETWORK ID NAME DRIVER SCOPE
# a1b2c3d4e5f6 bridge bridge local
# g7h8i9j0k1l2 host host local
# m3n4o5p6q7r8 none null local
每种网络类型对应不同的使用场景,下面逐一介绍。
二、Bridge 网络(默认)
Bridge 是 Docker 的默认网络模式。当你创建容器而不指定网络时,容器会自动连接到默认的 bridge 网络。Docker 在主机上创建一个名为 docker0 的虚拟网桥,所有 bridge 模式的容器都连接到这个网桥上。
# 查看 bridge 网络详情
docker network inspect bridge
# 使用默认 bridge 网络启动容器
docker run -d --name web1 -p 8080:80 nginx
docker run -d --name web2 -p 8081:80 nginx
# 查看容器的 IP 地址
docker inspect web1 --format '{{.NetworkSettings.IPAddress}}'
默认 bridge 网络的特点:
- 同一网桥上的容器可以通过 IP 地址互相访问。
- 默认 bridge 网络不支持通过容器名称进行 DNS 解析。
- 容器通过端口映射(
-p)对外提供服务。 - 容器间通信经过 NAT 转换,有一定性能开销。
2.1 自定义 Bridge 网络(推荐)
自定义 bridge 网络比默认网络功能更强,强烈推荐使用:
# 创建自定义网络
docker network create --driver bridge my-network
# 指定子网和网关
docker network create \
--driver bridge \
--subnet 172.20.0.0/16 \
--gateway 172.20.0.1 \
my-custom-network
# 在自定义网络中启动容器
docker run -d --name app --network my-network myimage
docker run -d --name db --network my-network mysql:8.0
# 在自定义网络中,容器可以通过名称互相访问
# app 容器中可以直接使用 "db" 作为主机名连接数据库
自定义 bridge 网络的优势:
- 自动 DNS 解析:同一网络中的容器可以通过容器名互相访问。
- 更好的隔离:不同自定义网络中的容器默认无法通信。
- 动态连接:可以在容器运行时动态加入或移除网络。
三、Host 网络
Host 模式让容器直接使用主机的网络栈,没有网络隔离,也不需要端口映射:
# 使用 host 网络启动容器
docker run -d --name nginx-host --network host nginx
此时 Nginx 直接监听主机的 80 端口,无需 -p 映射。
适用场景:
- 需要极致网络性能的应用(消除 NAT 开销)。
- 需要访问主机上所有网络接口的应用。
- 网络密集型应用(如负载均衡器、代理服务器)。
注意事项:端口冲突需要自行管理,多个容器不能监听同一端口。
四、None 网络
None 模式完全禁用容器的网络功能:
docker run -d --name isolated --network none alpine sleep 3600
# 进入容器查看网络配置,只有 loopback 接口
docker exec isolated ip addr
适用于不需要网络的批处理任务或安全性要求极高的场景。
五、Macvlan 网络
Macvlan 让容器拥有独立的 MAC 地址,直接连接到物理网络,就像一台独立的主机:
# 创建 Macvlan 网络
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 \
my-macvlan
# 在 Macvlan 网络中启动容器
docker run -d --name server1 \
--network my-macvlan \
--ip 192.168.1.100 \
nginx
Macvlan 模式需要网络设备支持混杂模式,在搬瓦工 VPS 的 KVM 方案中通常可用。
六、Docker Compose 中的网络配置
Docker Compose 会自动为每个项目创建一个独立的 bridge 网络:
services:
web:
image: nginx
ports:
- "80:80"
networks:
- frontend
- backend
app:
image: myapp
networks:
- backend
db:
image: mysql:8.0
networks:
- backend
networks:
frontend:
driver: bridge
backend:
driver: bridge
ipam:
config:
- subnet: 172.28.0.0/16
这样 web 容器可以同时访问 frontend 和 backend 网络,而 db 容器只在 backend 网络中,无法从前端直接访问,实现了网络层面的安全隔离。
七、容器跨网络通信
# 将已运行的容器连接到额外的网络
docker network connect my-network container-name
# 从网络中断开容器
docker network disconnect my-network container-name
# 查看容器连接的所有网络
docker inspect container-name --format '{{json .NetworkSettings.Networks}}'
八、网络排错工具
# 查看容器的 IP 地址和端口
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container-name
# 在容器内测试网络连通性
docker exec container-name ping -c 3 target-container
# 查看 Docker 网桥信息
ip addr show docker0
brctl show
# 查看 iptables NAT 规则
iptables -t nat -L -n
# 使用 nicolaka/netshoot 专业网络调试容器
docker run --rm -it --network container:目标容器 nicolaka/netshoot
九、网络安全建议
- 最小权限原则:只将需要通信的容器放在同一网络中。
- 避免使用默认 bridge:总是创建自定义网络,获得更好的隔离和 DNS 支持。
- 限制端口暴露:只映射必要的端口,使用
127.0.0.1:port:port限制只在本地监听。 - 使用内部网络:对于不需要外网访问的服务,创建 internal 网络。
# 创建内部网络(容器无法访问外部网络)
docker network create --internal internal-network
总结
合理的 Docker 网络配置是容器化部署的基础。对于搬瓦工 VPS 上的典型场景,推荐使用自定义 bridge 网络来组织容器通信,用 host 网络来优化高性能应用。更多 Docker 基础知识请参考 Docker 安装教程,数据持久化请参考 数据卷管理教程。选购搬瓦工 VPS 请访问 bwh81.net,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的折扣。