Docker 网络详解与实战配置

Docker 网络是实现容器间通信、容器与外部网络交互的核心组件。Docker 内置多种网络模式,满足不同场景下的隔离、通信需求。本文将系统讲解 Docker 网络类型、自定义网络配置、容器通信原理及外部访问方案,结合实战操作帮助理解网络机制。

一、Docker 网络核心概念

1.1 网络的作用

Docker 网络的核心目标是解决 “容器如何通信” 问题,具体包括:

  • 容器与容器之间的相互访问(如 Web 容器访问数据库容器);
  • 容器与宿主机之间的访问(如宿主机访问容器内服务);
  • 容器与外部网络(如互联网)的访问(如容器内下载依赖、访问外部 API)。

1.2 网络模式分类

Docker 默认提供 3 种核心网络模式,可通过 --network 参数指定容器使用的网络,也可自定义网络满足特定需求。

网络模式

名称

核心特点

适用场景

none

无网络模式

仅保留 lo(本地回环)网卡,无其他网络接口

安全性要求极高的场景(如容器仅处理内部逻辑,无需对外通信)

host

主机网络模式

共享宿主机的网络栈(IP、端口、路由等),容器无独立 IP

网络性能要求高的场景(如高性能服务),但需避免端口冲突

bridge

桥接网络模式

容器通过 docker0 网桥与宿主机通信,拥有独立 IP

默认模式,适用于大多数场景(如多容器协作、对外提供服务)

二、Docker 默认网络模式实战

2.1 none 模式(无网络)

2.1.1 特性说明
  • 容器启动后仅能访问自身(lo 网卡),无法与宿主机、其他容器或外部网络通信;
  • 无任何网络配置,安全性最高,但灵活性最差。
2.1.2 操作示例
# 启动 none 模式的容器(使用 busybox 镜像,轻量且含基础命令)

docker run -it --rm --network=none busybox:latest

# 查看容器网络(仅 lo 网卡)

/ # ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

valid_lft forever preferred_lft forever

2.2 host 模式(主机共享网络)

2.2.1 特性说明
  • 容器直接使用宿主机的 IP 地址和端口,无需端口映射;
  • 容器内的端口占用会与宿主机冲突(如宿主机已用 80 端口,容器无法再绑定 80 端口);
  • 网络性能最优(无网桥转发开销),但隔离性差。
2.2.2 操作示例
  1. 启动 host 模式容器
    # 启动 Nginx 容器,使用 host 网络(共享宿主机 80 端口)
    
    docker run -d --rm --network=host --name nginx-host nginx:latest

  2. 验证访问
    • 宿主机或外部机器直接访问宿主机 IP(无需指定端口),即可访问容器内的 Nginx 服务:
curl http://宿主机IP # 直接返回 Nginx 默认页面

    3.注意端口冲突

    • 若宿主机已启动 Nginx(占用 80 端口),再启动上述命令会报错:bind: address already in use,需先停止宿主机 Nginx 或修改容器服务端口。

2.3 bridge 模式(默认桥接网络)

2.3.1 特性说明
  • Docker 启动时自动创建 docker0 网桥(默认 IP 段:172.17.0.0/16);
  • 容器通过 docker0 网桥与宿主机通信,对外访问需通过宿主机 NAT 转发。
2.3.2 操作示例
  1. 查看默认 bridge 网络
    # 查看 Docker 所有网络(默认包含 bridge、host、none)
    
    docker network ls
    
    # 查看 bridge 网络详情(含 IP 段、关联容器等)
    
    docker network inspect bridge

  2. 启动 bridge 模式容器
    # 启动两个 busybox 容器(默认 --network=bridge,可省略)
    
    docker run -itd --name box1 busybox:latest
    
    docker run -itd --name box2 busybox:latest

  3. 容器间通信(基于 IP)
    • 查看 box1 的 IP:
docker inspect -f '{{.NetworkSettings.IPAddress}}' box1

# 输出示例:172.17.0.2
    • 进入 box2 ping box1 的 IP:
docker exec -it box2 sh

/ # ping 172.17.0.2 # 可正常通信(bridge 模式下同一网络容器互通)

64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.123 ms

三、自定义网络(bridge 类型)

默认 bridge 网络功能简单(如不支持容器名通信),自定义 bridge 网络可扩展功能(如指定 IP 段、支持容器名解析),更适合生产环境。

3.1 自定义网络创建

3.1.1 核心参数说明
  • --driver bridge:指定网络类型为 bridge(默认,可省略);
  • --gateway:指定网络的网关(需在 --subnet 范围内,如 172.19.0.1);
  • 最后指定网络名称(如 testnetwork)。
3.1.2 操作示例
# 创建自定义 bridge 网络(IP 段 172.19.0.0/16,网关 172.19.0.1)

docker network create \

--driver bridge \

--subnet 172.19.0.0/16 \

--gateway 172.19.0.1 \

testnetwork

# 查看自定义网络(已新增 testnetwork)

docker network ls

3.2 容器指定自定义网络与固定 IP

3.2.1 特性说明
  • 自定义网络支持通过 --ip 参数为容器分配固定 IP(需在 --subnet 范围内);
  • 自定义网络内置 DNS 服务,支持容器通过 “容器名” 通信(无需记 IP)。
3.2.2 操作示例
  1. 启动容器并指定自定义网络与固定 IP
    # 启动 box3,使用 testnetwork 网络,固定 IP 172.19.0.100
    
    docker run -itd \
    
    --name box3 \
    
    --network=testnetwork \
    
    --ip 172.19.0.100 \
    
    busybox:latest

  2. 验证固定 IP
    docker inspect -f '{{.NetworkSettings.Networks.testnetwork.IPAddress}}' box3
    
    # 输出:172.19.0.100(与指定 IP 一致)

  3. 容器名通信(自定义网络特有)
    • 再启动一个容器 box4(使用 testnetwork 网络,不指定 IP):
docker run -itd --name box4 --network=testnetwork busybox:latest
    • 进入 box3,通过容器名 ping box4:
docker exec -it box3 sh

/ # ping box4 # 自定义网络支持容器名解析,无需 IP

64 bytes from box4.testnetwork (172.19.0.101): seq=0 ttl=64 time=0.089 ms

3.3 容器跨网络通信(多网络绑定)

默认情况下,不同网络的容器无法通信(如 bridge 网络的 box1 与 testnetwork 网络的 box3),可通过为容器 “绑定多个网络” 实现跨网络通信。

3.3.1 操作示例
  1. 为已启动的容器添加新网络
    # 为 box1(原 bridge 网络)添加 testnetwork 网络
    
    docker network connect testnetwork box1

  2. 验证跨网络通信
    • 进入 box3(testnetwork 网络),ping box1 的 testnetwork IP:
# 查看 box1 在 testnetwork 中的 IP

docker inspect -f '{{.NetworkSettings.Networks.testnetwork.IPAddress}}' box1

# 输出示例:172.19.0.102

# 进入 box3 ping 该 IP

docker exec -it box3 sh

/ # ping 172.19.0.102 # 可正常通信

四、Joined 容器(共享网络栈)

Joined 容器是一种特殊的网络模式,多个容器共享同一个网络栈(IP、端口、网卡),适用于 “多服务共享网络资源” 的场景(如日志收集、监控代理)。

4.1 特性说明

  • 所有 Joined 容器共享一个 “主容器” 的网络栈,拥有相同的 IP 和端口;
  • 容器间无需通信(共享网络栈,可直接通过 localhost 访问);
  • 需注意端口冲突(多个容器不能绑定同一端口)。

4.2 操作示例

  1. 启动主容器(作为网络栈模板)
    # 启动主容器 cy3,使用自定义网络 testnetwork
    
    docker run -itd --name cy3 --network=testnetwork busybox:latest

  2. 启动 Joined 容器(共享 cy3 网络栈)
    # --network=container:cy3 表示共享 cy3 的网络栈
    
    docker run -it --rm --name cy4 --network=container:cy3 busybox:latest

  3. 验证共享网络栈
    • 在 cy4 中查看 IP(与 cy3 一致):
/ # ip a # 输出的 IP 与 cy3 完全相同(如 172.19.0.3)
    • 在 cy4 中 ping cy3 的容器名(直接解析为 localhost):
/ # ping cy3

PING cy3 (172.19.0.3): 56 data bytes # 与自身 IP 一致

64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.056 ms

五、容器网络通信原理

5.1 容器访问外部网络(NAT 转发)

容器默认可访问外部网络(如 ping 百度、下载依赖),核心依赖宿主机的 NAT 地址转换,流程如下:

  1. 容器(如 172.17.0.3)发送数据包到外部地址(如 www.baidu.com);
  2. 数据包到达宿主机 docker0 网桥,宿主机内核识别为 “外部访问请求”,触发 NAT 转换;
  3. NAT 将数据包的源 IP 从容器 IP(172.17.0.3)替换为宿主机网卡 IP(如 192.168.31.106
  4. 数据包通过宿主机网卡(如 ens36)发送到外部网络;
  5. 外部网络返回的数据包通过宿主机 NAT 反向转换(目标 IP 从宿主机 IP 替换为容器 IP),最终送达容器。
验证容器访问外部网络
# 进入容器,ping 百度(可正常通信)

docker exec -it box1 sh

/ # ping www.baidu.com

64 bytes from 110.242.68.66: seq=0 ttl=51 time=28.3 ms

5.2 外部访问容器(端口映射 /host 模式)

容器默认无法被外部网络直接访问(IP 为内网地址),需通过以下两种方式暴露服务:

5.2.1 方式 1:端口映射(bridge 模式)

通过 --publish(简写 -p)参数将容器端口映射到宿主机端口,外部访问宿主机端口即可间接访问容器。

操作示例

# 启动 Nginx 容器,将容器 80 端口映射到宿主机 8080 端口

docker run -d --rm --name nginx-bridge -p 8080:80 nginx:latest

# 外部访问(宿主机/其他机器)

curl http://宿主机IP:8080 # 返回 Nginx 默认页面

端口映射格式

  • 宿主机端口:容器端口(如 8080:80):宿主机 8080 端口对应容器 80 端口;
  • 宿主机IP:宿主机端口:容器端口(如 192.168.31.106:8080:80):指定宿主机特定 IP 绑定端口(默认绑定所有 IP)。
5.2.2 方式 2:host 模式(共享宿主机网络)

如 2.2 节所述,host 模式容器共享宿主机 IP 和端口,外部直接访问宿主机端口即可(无需映射),适合高性能场景。

六、网络管理常用命令

需求

命令

说明

查看所有网络

docker network ls

列出 Docker 所有网络(默认 + 自定义)

查看网络详情

docker network inspect 网络名

查看网络的 IP 段、网关、关联容器等

创建自定义网络

docker network create [参数] 网络名

支持 bridge、overlay 等类型(overlay 用于集群)

容器绑定网络

docker network connect 网络名 容器名

为已启动的容器添加新网络

容器解绑网络

docker network disconnect 网络名 容器名

移除容器的某个网络

删除网络

docker network rm 网络名

仅能删除无关联容器的网络

清理无用网络

docker network prune

删除所有未使用的网络(谨慎执行)

七、总结

Docker 网络通过不同模式满足多样化通信需求,核心要点如下:

  1. 默认模式:none 安全隔离、host 高性能、bridge 通用灵活;
  2. 自定义网络:推荐用于生产环境,支持固定 IP、容器名通信,功能更完善;
  3. 通信原理:容器访问外部依赖 NAT 转发,外部访问容器依赖端口映射或 host 模式;
  4. 最佳实践:多容器协作优先用自定义 bridge 网络(支持容器名通信),高性能服务用 host 模式,安全敏感场景用 none 模式。

掌握 Docker 网络是实现容器化应用部署的关键,后续结合 Docker Compose/Kubernetes 可进一步实现多容器网络编排与管理。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐