通过本课件,你将掌握:
Docker 网络的基本原理与核心组件;
五种主要网络驱动(bridge、host、none、overlay、macvlan)的用途与区别;
常用 docker network 命令的使用方法;
如何创建自定义网络并管理容器连接;
容器间通信与外部访问的最佳实践。

Docker 网络是 Docker 提供的一套容器通信系统,它使得:
容器之间可以互相通信;
容器可以与 Docker 主机交互;
容器可以访问外部网络(如互联网);
外部用户可以通过端口映射访问容器服务。
关键理念:“隔离但可连通” —— 每个容器拥有独立网络栈,同时可通过网络策略实现安全互联。

Docker 并非从零构建网络,而是巧妙利用了 Linux 内核的三大核心功能:
Docker 通过网络驱动(Network Drivers) 支持不同场景的组网需求。以下是五种核心驱动:

用途:单主机多容器通信
特点:
创建私有内部网络(默认名为 bridge)
同一 bridge 网络中的容器可通过容器名或 IP 直接通信
对外访问需显式端口映射(-p host_port:container_port)
最佳实践:不要使用默认 bridge 网络!应创建用户自定义 bridge 网络以支持 DNS 解析和更佳隔离。
创建自定义 bridge 网络:
docker network create --driver bridge my_bridge用途:高性能场景(如监控、代理)
特点:
容器共享主机网络命名空间
容器监听的端口直接暴露在主机上(无需 -p)
无网络隔离,安全性较低
适用场景:网络性能敏感、无需隔离的应用
docker run --network host nginx
# 此时访问 http://localhost 即可访问 Nginx用途:完全隔离的批处理任务
特点:
容器有网络栈,但未连接任何网络
无法与外界通信(包括其他容器)
典型用例:离线数据处理、安全沙箱
docker run --network none alpine ip addr # 只能看到 lo 接口用途:跨主机容器通信(Docker Swarm 必备)
特点:
在多个 Docker 主机间创建虚拟分布式网络
容器无论在哪台主机,都能通过服务名直接通信
自动加密(可选)、负载均衡
前提:需启用 Docker Swarm 模式
docker swarm init
docker network create --driver overlay my_overlay用途:让容器“伪装”成物理设备
特点:
为容器分配真实 MAC 地址
容器直接接入物理网络,拥有独立 IP
兼容传统网络设备(如交换机、防火墙)
限制:需要物理网络支持混杂模式(promiscuous mode)
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 my_macvlandocker network ls输出示例:
NETWORK ID NAME DRIVER SCOPE
abc123 bridge bridge local
def456 host host local
ghi789 none null local# 创建 bridge 网络
docker network create --driver bridge my_app_net
# 创建 overlay 网络(需 Swarm)
docker network create --driver overlay prod_net# 启动时指定网络
docker run -d --name web --network my_app_net nginx
# 将运行中的容器加入网络
docker network connect my_app_net db_containerdocker network inspect my_app_net关键信息:
Containers:列出所有连接的容器及其 IP
Options:网络配置参数
Driver:使用的驱动类型
docker network disconnect my_app_net web# 删除空闲网络
docker network rm my_app_net
# 删除所有未使用的网络(谨慎!)
docker network prune注意:只有当没有容器连接时,才能删除网络。
# 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(不推荐,可移植性差)
始终为应用创建专属网络;
避免使用 --link(已废弃),改用自定义网络;
生产环境慎用 host 模式,除非明确需要;
跨主机通信优先选择 overlay(Swarm)或 CNI 插件(Kubernetes);
定期清理未使用网络:docker network prune
黄金法则:“单机用 bridge,集群用 overlay,极致性能用 host,完全隔离用 none。”
如果两个容器不在同一个自定义 bridge 网络中,它们能否通信?如何实现?
在 host 网络模式下,多个容器监听同一端口会发生什么?
为什么 macvlan 需要物理网络支持混杂模式?这会带来什么安全风险?
📘 延伸阅读: