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% 的折扣。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。