源本科技 | 码上会

Docker 网络详解

2025/12/24
35
0


学习目标

通过本课件,你将掌握:

  1. Docker 网络的基本原理与核心组件

  2. 五种主要网络驱动(bridge、host、none、overlay、macvlan)的用途与区别

  3. 常用 docker network 命令的使用方法

  4. 如何创建自定义网络并管理容器连接

  5. 容器间通信与外部访问的最佳实践


什么是 Docker 网络?

Docker 网络是 Docker 提供的一套容器通信系统,它使得:

  • 容器之间可以互相通信;

  • 容器可以与 Docker 主机交互;

  • 容器可以访问外部网络(如互联网);

  • 外部用户可以通过端口映射访问容器服务。

关键理念“隔离但可连通” —— 每个容器拥有独立网络栈,同时可通过网络策略实现安全互联。


Docker 网络技术(Linux)

Docker 并非从零构建网络,而是巧妙利用了 Linux 内核的三大核心功能:

技术

作用

说明

Network Namespaces
(网络命名空间)

实现网络隔离

每个容器拥有独立的 IP、网卡、路由表,彼此不可见

veth pairs
(虚拟以太网设备对)

连接容器与主机

一端在容器内(如 eth0),另一端在主机上,像一根“虚拟网线”

iptables

端口转发与 NAT

当使用 -p 8080:80 时,Docker 自动添加 iptables 规则实现流量转发


Docker 网络驱动详解

Docker 通过网络驱动(Network Drivers) 支持不同场景的组网需求。以下是五种核心驱动:

bridge(默认驱动)

  • 用途:单主机多容器通信

  • 特点

    • 创建私有内部网络(默认名为 bridge

    • 同一 bridge 网络中的容器可通过容器名或 IP 直接通信

    • 对外访问需显式端口映射-p host_port:container_port

  • 最佳实践不要使用默认 bridge 网络!应创建用户自定义 bridge 网络以支持 DNS 解析和更佳隔离。

创建自定义 bridge 网络:

docker network create --driver bridge my_bridge

host(主机模式)

  • 用途:高性能场景(如监控、代理)

  • 特点

    • 容器共享主机网络命名空间

    • 容器监听的端口直接暴露在主机上(无需 -p

    • 无网络隔离,安全性较低

  • 适用场景:网络性能敏感、无需隔离的应用

docker run --network host nginx
# 此时访问 http://localhost 即可访问 Nginx

none(无网络)

  • 用途:完全隔离的批处理任务

  • 特点

    • 容器有网络栈,但未连接任何网络

    • 无法与外界通信(包括其他容器)

  • 典型用例:离线数据处理、安全沙箱

docker run --network none alpine ip addr  # 只能看到 lo 接口

overlay(覆盖网络)

  • 用途跨主机容器通信(Docker Swarm 必备)

  • 特点

    • 在多个 Docker 主机间创建虚拟分布式网络

    • 容器无论在哪台主机,都能通过服务名直接通信

    • 自动加密(可选)、负载均衡

  • 前提:需启用 Docker Swarm 模式

docker swarm init
docker network create --driver overlay my_overlay

macvlan(MAC 地址虚拟化)

  • 用途:让容器“伪装”成物理设备

  • 特点

    • 为容器分配真实 MAC 地址

    • 容器直接接入物理网络,拥有独立 IP

    • 兼容传统网络设备(如交换机、防火墙)

  • 限制:需要物理网络支持混杂模式(promiscuous mode)

docker network create -d macvlan \
  --subnet=192.168.1.0/24 \
  --gateway=192.168.1.1 \
  -o parent=eth0 my_macvlan

Docker 网络核心命令

1. 查看所有网络

docker network ls

输出示例:

NETWORK ID     NAME        DRIVER    SCOPE
abc123         bridge      bridge    local
def456         host        host      local
ghi789         none        null      local

2. 创建自定义网络

# 创建 bridge 网络
docker network create --driver bridge my_app_net

# 创建 overlay 网络(需 Swarm)
docker network create --driver overlay prod_net

3. 启动容器并加入网络

# 启动时指定网络
docker run -d --name web --network my_app_net nginx

# 将运行中的容器加入网络
docker network connect my_app_net db_container

4. 查看网络详情(含连接容器)

docker network inspect my_app_net

关键信息:

  • Containers:列出所有连接的容器及其 IP

  • Options:网络配置参数

  • Driver:使用的驱动类型

5. 断开容器与网络

docker network disconnect my_app_net web

6. 删除网络

# 删除空闲网络
docker network rm my_app_net

# 删除所有未使用的网络(谨慎!)
docker network prune

注意:只有当没有容器连接时,才能删除网络。


容器通信实战示例

场景:Web 应用 + 数据库

# 1. 创建专用网络
docker network create app_net

# 2. 启动数据库(加入网络)
docker run -d --name mysql_db --network app_net \
  -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0

# 3. 启动 Web 应用(加入同一网络)
docker run -d --name web_app --network app_net \
  -p 8080:80 nginx

# 4. 在 web_app 中可直接通过容器名访问数据库
#    如:mysql -h mysql_db -u root -p

优势:无需暴露数据库端口到主机,仅限内部通信,更安全!


常见问题

Q1:为什么推荐使用自定义 bridge 而非默认 bridge?

  • 默认 bridge 不支持容器名解析(只能用 IP)

  • 自定义 bridge 支持自动 DNS(通过容器名通信)

  • 更好的网络隔离与管理能力

Q2:如何让容器访问主机服务?

  • 在 Linux 上,使用特殊 DNS 名 host.docker.internal(Docker 20.10+)

  • 或通过主机真实 IP(不推荐,可移植性差)

最佳实践

  1. 始终为应用创建专属网络

  2. 避免使用 --link(已废弃),改用自定义网络;

  3. 生产环境慎用 host 模式,除非明确需要;

  4. 跨主机通信优先选择 overlay(Swarm)或 CNI 插件(Kubernetes)

  5. 定期清理未使用网络docker network prune


Docker 网络驱动对比

驱动

适用场景

网络隔离

跨主机

性能

安全性

bridge

单机多容器

⭐⭐

⭐⭐⭐

host

高性能服务

✅(直接)

⭐⭐⭐

none

离线任务

✅(完全隔离)

⭐⭐⭐⭐

overlay

Swarm 集群

⭐⭐

⭐⭐⭐

macvlan

物理网络集成

⭐⭐⭐

⭐⭐

黄金法则“单机用 bridge,集群用 overlay,极致性能用 host,完全隔离用 none。”


思考题

  1. 如果两个容器不在同一个自定义 bridge 网络中,它们能否通信?如何实现?

  2. host 网络模式下,多个容器监听同一端口会发生什么?

  3. 为什么 macvlan 需要物理网络支持混杂模式?这会带来什么安全风险?


📘 延伸阅读