云计算百科
云计算领域专业知识百科平台

Docker 网络模型深度解析:原生模式、自定义网络与容器通信

Docker 网络模型深度解析:原生模式、自定义网络与容器通信

Docker 网络是容器化应用的核心基础设施,它实现了容器与容器、容器与宿主机、容器与外部网络的互联互通。理解 Docker 网络模型,是构建复杂分布式容器应用的前提。本文将从 Docker 原生网络模式、自定义网络创建与接入、容器间通信与 DNS 解析 三个维度,全面拆解 Docker 网络的工作原理与实战操作。

一、Docker 网络核心原理概述

Docker 采用桥接驱动作为默认网络方案,其底层依赖 Linux 内核的 Network Namespace(网络命名空间)技术,实现容器网络的隔离与互通。

  • Network Namespace:每个容器拥有独立的网络命名空间,包含专属的网卡、IP 地址、路由表、防火墙规则,与宿主机及其他容器的网络环境完全隔离。
  • Docker 网络驱动:Docker 通过驱动机制实现不同的网络模式,核心驱动包括 bridge、host、container、none,同时支持第三方驱动(如 overlay 用于跨主机通信)。
  • 网络命名空间通信:容器与宿主机、容器与容器之间的通信,通过 veth 虚拟网卡对 实现 —— 一端挂载在容器的网络命名空间,另一端挂载在宿主机的网桥或网卡上。

二、Docker 原生网络模式详解

Docker 默认提供 4 种原生网络模式,分别适用于不同的业务场景。我们可以通过 docker network ls 命令查看宿主机上的默认网络:

docker network ls
# 输出示例
NETWORK ID NAME DRIVER SCOPE
abc123456789 bridge bridge local
def098765432 host host local
ghi112233445 none null local

2.1 bridge 模式:默认桥接网络(最常用)

bridge 是 Docker 的默认网络模式,当容器启动时未指定网络模式,会自动连接到 docker0 网桥。

工作原理
  • Docker 启动时,会在宿主机上创建一个名为 docker0 的虚拟网桥,默认分配 172.17.0.1/16 网段的 IP 地址。
  • 容器启动时,会创建一对 veth 虚拟网卡:一端命名为 eth0 并分配给容器(IP 来自 docker0 网段),另一端挂载到 docker0 网桥上。
  • 容器通过 docker0 网桥实现与宿主机、其他容器的通信,同时通过宿主机的 NAT 规则访问外部网络。
  • 实战操作

    # 启动 Nginx 容器,默认使用 bridge 模式
    docker run -d –name nginx-bridge nginx:1.25

    # 查看容器的网络信息
    docker inspect nginx-bridge | grep -i ipaddress
    # 输出示例:"IPAddress": "172.17.0.2"

    # 宿主机 ping 容器(可通)
    ping 172.17.0.2

    # 容器 ping 宿主机(需 ping 宿主机的 docker0 地址 172.17.0.1)
    docker exec nginx-bridge ping 172.17.0.1

    适用场景
    • 单机环境下的多容器通信(如 Web 容器 + 数据库容器)。
    • 不需要暴露大量端口到外部的服务。
    优缺点
    优点缺点
    网络隔离性好,容器间互不干扰 容器与外部通信需通过 NAT 转发,存在性能损耗
    配置简单,无需手动干预 跨主机容器通信复杂,需依赖第三方工具

    2.2 host 模式:共享宿主机网络

    host 模式下,容器不创建独立的网络命名空间,直接共享宿主机的网络栈(网卡、IP 地址、端口)。

    工作原理
    • 容器启动后,不会分配独立的 IP 地址,其网络配置与宿主机完全一致。
    • 容器内的服务直接使用宿主机的端口,无需进行端口映射(-p 参数失效)。
    实战操作

    # 启动 Nginx 容器,使用 host 模式
    docker run -d –name nginx-host –network host nginx:1.25

    # 容器内的 Nginx 直接监听宿主机的 80 端口,访问宿主机 IP 即可
    curl http://宿主机IP

    适用场景
    • 对网络性能要求极高的应用(如高并发服务),避免 NAT 转发的性能损耗。
    • 需占用宿主机大量端口的服务,简化端口映射配置。
    优缺点
    优点缺点
    网络性能最优,无额外转发开销 容器与宿主机共享端口,容易出现端口冲突
    配置简单,无需端口映射 网络隔离性差,容器可直接访问宿主机的所有网络资源

    2.3 container 模式:共享其他容器的网络

    container 模式下,新创建的容器共享另一个已存在容器的网络命名空间,两个容器拥有相同的 IP 地址和端口配置。

    工作原理
    • 两个容器共享同一个 Network Namespace,共用一张 eth0 网卡,IP 地址相同。
    • 容器之间的通信可通过 localhost 直接完成,无需经过网桥转发。
    • 被共享的容器称为 “父容器”,若父容器停止,子容器的网络会失效。
    实战操作

    # 1. 启动父容器(Nginx)
    docker run -d –name parent-nginx nginx:1.25

    # 2. 启动子容器(Alpine),共享父容器的网络
    docker run -it –name child-alpine –network container:parent-nginx alpine:3.18

    # 3. 在子容器中访问父容器的 Nginx 服务(通过 localhost:80)
    wget -qO- localhost

    适用场景
    • 容器间需要极致高效通信的场景(如日志收集容器与应用容器)。
    • 需共享网络配置的辅助容器(如监控容器、调试容器)。
    优缺点
    优点缺点
    容器间通信延迟极低,无需网络转发 子容器依赖父容器,父容器停止则子容器网络失效
    节省网络资源,无需额外分配 IP 两个容器共享端口,不能同时监听相同端口

    2.4 none 模式:无网络模式

    none 模式下,Docker 只为容器创建独立的 Network Namespace,但不配置任何网络参数(无网卡、无 IP 地址、无路由)。

    工作原理
    • 容器启动后,默认只有一个 lo(回环)网卡,无法与外部通信。
    • 需手动为容器配置网卡、IP 地址和路由规则,才能实现网络互通。
    实战操作

    # 启动容器,使用 none 模式
    docker run -it –name nginx-none –network none nginx:1.25

    # 查看容器网卡(只有 lo 回环网卡)
    docker exec nginx-none ip addr

    适用场景
    • 不需要网络的离线应用(如数据计算、文件处理容器)。
    • 需要完全自定义网络配置的场景(如手动配置 VLAN、VPN)。
    优缺点
    优点缺点
    网络隔离性最高,完全与外部隔离 配置复杂,需手动管理网络参数
    避免网络攻击和干扰 默认无法与外部通信,灵活性低

    2.5 原生网络模式对比总结

    网络模式网络隔离性IP 分配容器间通信外部网络访问适用场景
    bridge 由 docker0 分配 通过 docker0 网桥互通 需端口映射(-p) 单机多容器常规应用
    host 共享宿主机 IP 与宿主机进程共享网络 直接使用宿主机端口 高性能、高并发服务
    container 中(与父容器共享) 共享父容器 IP 通过 localhost 互通 依赖父容器的网络配置 容器间极致通信、辅助容器
    none 极高 无(需手动配置) 仅回环网卡 默认不可访问 离线应用、自定义网络

    三、自定义网络创建与容器接入

    Docker 原生的 bridge 网络虽然方便,但存在DNS 解析不支持容器名、网络配置不可定制等问题。通过创建自定义网络,可以解决这些痛点,同时实现更灵活的网络管理。

    3.1 自定义网络的核心优势

  • 内置 DNS 解析:支持通过容器名或服务名通信,无需依赖 IP 地址。
  • 自定义网段和网关:可指定 IP 网段、网关地址,避免与宿主机或其他网络冲突。
  • 更好的隔离性:不同自定义网络之间的容器默认无法通信,实现业务网络隔离。
  • 支持多种驱动:除 bridge 驱动外,还支持 overlay(跨主机)、macvlan(虚拟网卡)等驱动。
  • 3.2 自定义 bridge 网络实战

    1. 创建自定义 bridge 网络

    使用 docker network create 命令创建,支持指定网段、网关、子网掩码等参数。

    # 创建名为 my-bridge 的自定义网络,指定网段 192.168.100.0/24,网关 192.168.100.1
    docker network create \\
    –driver bridge \\
    –subnet 192.168.100.0/24 \\
    –gateway 192.168.100.1 \\
    my-bridge

    2. 查看自定义网络信息

    docker network inspect my-bridge

    输出中会包含网络的驱动类型、网段、网关,以及已接入的容器列表。

    3. 容器接入自定义网络

    有两种方式让容器接入自定义网络:

    • 启动容器时指定网络 # 启动 nginx1 容器,接入 my-bridge 网络
      docker run -d –name nginx1 –network my-bridge nginx:1.25

      # 启动 nginx2 容器,接入 my-bridge 网络
      docker run -d –name nginx2 –network my-bridge nginx:1.25

    • 运行中容器接入网络 # 启动一个未指定网络的容器
      docker run -d –name nginx3 nginx:1.25

      # 将 nginx3 接入 my-bridge 网络
      docker network connect my-bridge nginx3

    4. 容器退出自定义网络

    # 将 nginx3 退出 my-bridge 网络
    docker network disconnect my-bridge nginx3

    3.3 自定义网络的高级配置

    1. 为容器分配固定 IP

    默认情况下,容器的 IP 由 Docker 自动分配,重启容器后可能变化。通过自定义网络,可指定容器的固定 IP。

    docker run -d \\
    –name nginx-fixed-ip \\
    –network my-bridge \\
    –ip 192.168.100.10 \\
    nginx:1.25

    2. 容器接入多个网络

    一个容器可以同时接入多个网络,实现跨网络通信。

    # 容器 nginx1 已接入 my-bridge 网络,再接入默认 bridge 网络
    docker network connect bridge nginx1

    # 查看容器的网络信息(会显示两个网卡)
    docker inspect nginx1 | grep -A 10 "Networks"

    四、容器间通信与 DNS 解析

    容器间通信是分布式应用的核心需求,Docker 提供了 IP 通信、容器名 DNS 通信、服务发现 三种方式,其中 DNS 通信是最推荐的方式。

    4.1 方式一:基于 IP 地址通信(不推荐)

    在 bridge 模式下,容器可通过彼此的 IP 地址通信,但存在明显缺陷:

    • IP 地址由 Docker 自动分配,容器重启后可能变化。
    • 大规模容器环境下,管理 IP 地址成本极高。

    实战示例

    # 查看 nginx1 的 IP 地址
    docker inspect nginx1 | grep -i ipaddress
    # 输出:"IPAddress": "192.168.100.2"

    # 在 nginx2 中 ping nginx1 的 IP
    docker exec nginx2 ping 192.168.100.2

    4.2 方式二:基于容器名的 DNS 解析(推荐)

    自定义网络内置 DNS 服务器,容器接入自定义网络后,可直接通过容器名通信,无需关注 IP 地址。

    核心原理
    • Docker 在自定义网络中内置了 DNS 服务(默认监听 127.0.0.11)。
    • 容器启动时,Docker 会将容器名和 IP 地址的映射关系写入 DNS 服务器。
    • 容器内的 DNS 配置指向 127.0.0.11,访问容器名时会自动解析为对应 IP。
    实战示例

    # 在 nginx2 容器中,通过容器名 ping nginx1(可通)
    docker exec nginx2 ping nginx1

    # 在 nginx2 中访问 nginx1 的 Web 服务
    docker exec nginx2 curl http://nginx1

    注意:原生的 bridge 网络不支持容器名 DNS 解析,只有自定义网络才支持。

    4.3 方式三:基于 Docker Compose 的服务发现(大规模场景)

    在多容器应用(如 Web + 数据库 + 缓存)中,使用 Docker Compose 可以实现更强大的服务发现 —— 通过 services 定义的服务名,容器间可直接通信。

    实战示例(docker-compose.yml)

    version: '3.8'
    services:
    web:
    image: nginx:1.25
    networks:
    – my-compose-network
    db:
    image: mysql:8.0
    environment:
    – MYSQL_ROOT_PASSWORD=123456
    networks:
    – my-compose-network

    networks:
    my-compose-network:
    driver: bridge
    ipam:
    config:
    – subnet: 192.168.200.0/24

    启动服务后,web 容器可直接通过 db 访问数据库服务:

    # 进入 web 容器,访问 db 服务的 3306 端口
    docker exec -it 容器名 curl db:3306

    4.4 容器与外部网络通信

    容器访问外部网络(如互联网),依赖宿主机的 NAT 转发 和 iptables 规则,Docker 会自动配置相关规则,无需手动干预。

    关键配置
    • 宿主机需开启 ip_forward 内核参数(Docker 启动时会自动开启): sysctl net.ipv4.ip_forward
      # 输出:net.ipv4.ip_forward = 1
    • Docker 会在宿主机的 iptables 中添加 POSTROUTING 链规则,实现容器的 NAT 转发。

    五、Docker 网络运维最佳实践

  • 优先使用自定义网络:替代原生 bridge 网络,利用 DNS 解析简化容器通信。
  • 按业务划分网络:不同业务的容器接入不同的自定义网络,实现网络隔离。
  • 避免使用 host 模式:除非有极致性能需求,否则 host 模式会破坏容器隔离性。
  • 固定容器 IP 按需使用:仅在需要稳定 IP 的场景下使用,大规模场景推荐 DNS 解析。
  • 监控容器网络状态:使用 docker stats 查看容器网络流量,使用 tcpdump 排查网络问题。 # 在容器内抓包
    docker exec -it nginx1 tcpdump -i eth0 port 80
  • 赞(0)
    未经允许不得转载:网硕互联帮助中心 » Docker 网络模型深度解析:原生模式、自定义网络与容器通信
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!