学习路径
网络是容器化应用的核心概念。它让所有容器、主机系统和外部服务之间能够无缝通信。Docker 内置的网络功能对于有效隔离服务、保障数据流安全以及编排可扩展的微服务架构至关重要。
在这一语境中,最强大的工具之一是 docker network create 命令,它允许 DevOps 工程师和开发者根据应用需求定义定制网络。
因此,今天我将一步步带您高效创建和管理这些 Docker 网络。
如果您是 Docker 新手,务必查看我们的技能路径利用 Docker 和 Kubernetes 实现容器化与虚拟化,获取上手机会。
什么是 Docker 网络?
构建现代应用通常涉及在各自独立、隔离的容器中运行多个服务。Docker 网络提供了一种灵活而强大的方式,将这些容器彼此相连,并与外部系统连接,您可以选择合适的网络模型,而不受底层基础设施的限制。
本节将为您提供关于 Docker 网络这一关键组件的基础知识,以及如何评估哪种网络配置适合您的应用需求。但在开始之前,如果您完全不熟悉 Docker,我强烈建议先查看 Docker 入门,为深入学习 Docker 网络打下坚实基础。
网络驱动:Docker 网络的基础
Docker 采用网络驱动来指定容器如何连接与通信。每种驱动决定其处理容器网络的方式。因此,Docker 的主要网络驱动在性能、隔离和复杂性方面各不相同。
核心 Docker 网络驱动概览
以下是 Docker 支持的主要内置驱动:
- Bridge(桥接):独立容器的默认驱动。它在主机上创建一个隔离的内部网络,允许容器使用 IP 或容器名相互通信。非常适合单机上的开发与测试。
- Host(主机):通过共享主机的网络栈来移除隔离。容器直接使用主机的 IP 和端口。适用于高性能应用或需要与主机级服务兼容的场景。
- None(无):禁用容器的所有网络功能。仅提供回环接口。适用于不需要外部连接或要求严格安全隔离的容器。
- Overlay(覆盖):允许不同 Docker 主机上的容器通信。常用于 Docker Swarm 和多主机部署。它创建一个分布式网络,抽象底层物理基础设施。
- Macvlan:为每个容器分配唯一的 MAC 地址,使其在网络上表现为物理设备。适用于需要直接访问物理网络的遗留应用。
- IPvlan:与 macvlan 类似,但在 IP 层路由流量而非使用 MAC 地址。在高密度环境中提供更佳性能与控制力。
每种驱动都会影响容器之间、与主机以及与外部网络的交互方式。
想了解这些网络类型如何协同工作?我们的 Docker 进阶课程以实用细节讲解 Docker 网络、卷与 Compose。理解这些差异是设计安全高效架构的关键。
我应该使用哪种网络类型?
选择合适的网络驱动取决于您的应用架构与运维目标:
- Bridge:推荐用于大多数本地开发场景和单机上的简单多容器应用。兼顾隔离与易用性。
- Host:当容器需要直接绑定到主机网络时最佳,例如在标准端口(如 80 或 443)暴露服务。注意安全性与端口冲突风险。
- None:适用于沙箱化工作负载或不应具有任何网络访问的安全关键任务。常见于自动化流程或测试。
- Overlay:在像 Docker Swarm 或 Kubernetes 这样的集群环境中必不可少,容器跨多主机运行。支持水平扩展和服务发现。
- Macvlan:当容器必须在局域网中表现为物理设备时更合适。用于如网络嗅探、遗留系统集成或绕过 Docker 网络栈的场景。
- IPvlan:在具有严格网络要求的环境(如电信或金融系统)中,比 macvlan 提供更细粒度控制与更好性能。
选择网络驱动时需考虑主机拓扑、安全需求和扩展策略。
仍在为工作负载选择网络而犹豫?了解在真实部署中 Docker 与 Kubernetes 的对比,请参阅Kubernetes 与 Docker指南。
创建自定义 Docker 网络
自定义 Docker 网络允许您控制容器之间以及与外部系统的内部通信方式,这能帮助更好地隔离服务、提供可预测的 IP,或按性能与安全需求设计架构。
本节将从基础到高级功能,带您完成创建自定义 Docker 网络的流程,包括命令与自定义 IP 配置。
基础命令结构
要创建自定义网络,请使用 docker network create 命令。您可以定义网络驱动、子网以及其他选项,以更好地控制容器通信。
下面是使用默认 bridge 驱动的简单示例:
$ docker network create demo-network -d bridge
该命令创建一个名为 demo-network 的桥接网络。Docker 会返回一个唯一的网络 ID 作为确认。此时网络已存在,但尚未连接任何容器。
您可以使用以下命令查看现有网络:
$ docker network ls
要将容器连接到新网络,使用 --network 标志:
$ docker run -it --rm --name container1 --network demo-network busybox:latest
将已有容器添加到网络:
$ docker network connect demo-network container2
移除它:
$ docker network disconnect demo-network container2
最后,当网络不再需要时可以将其删除:
$ docker network rm demo-network
清理所有未使用的网络:
$ docker network prune
高级 IP 地址管理
在处理更大型系统或特定网络策略时,Docker 允许您在自定义网络内手动管理 IP 地址范围。
您可以使用 --subnet 和 --gateway 标志来定义子网和网关:
$ docker network create \
--driver bridge \
--subnet 192.168.100.0/24 \
--gateway 192.168.100.1 \
custom-network
如需更精细的控制,可使用:
--ip-range:指定一个容器动态分配的 IP 池,与整个子网范围分离。--aux-address:在子网内预留特定 IP 地址,用于外部系统或文档说明。
例如:
$ docker network create \
--driver bridge \
--subnet 192.168.200.0/24 \
--ip-range 192.168.200.128/25 \
--aux-address reserved=192.168.200.254 \
advanced-network
该设置:
- 将动态容器 IP 限定在子网的上半段。
- 通过预留 IP 避免冲突。
- 在复杂环境中确保一致的网络行为。
如果您需要更多引导示例,可在10 个 Docker 项目创意:从入门到高级中探索进阶搭建策略。
Swarm 模式网络
Docker Swarm 模式支持在一组 Docker 主机的集群上编排部署服务。该编排的关键部分是网络,确保在不同节点上运行的服务能够无缝且安全地相互通信。
支持 Swarm 的网络架构
Docker Swarm 是 Docker 的原生集群解决方案,可将一组 Docker 主机变成一个虚拟引擎。它使您能够以分布式服务的形式部署和管理容器。其主要优势之一是多主机网络能力,使不同机器上的服务通信如同在同一主机上。
Swarm 网络支持两种主要类型的流量:
- 控制平面流量——Docker 节点之间加密的管理通信。
- 数据平面流量——容器间通信和对外部服务的访问。
Swarm 使用覆盖网络支持跨节点的服务通信,并使用路由网格(routing mesh)将外部流量负载均衡到服务副本。
创建 Swarm 网络
为支持服务发现与安全的多主机通信,Docker Swarm 使用作用域为 swarm 的覆盖网络。这些网络可在创建服务时自动生成,也可以手动创建。
以下是创建一个 Swarm 作用域覆盖网络的方法:
$ docker network create \
--driver overlay \
--scope swarm \
my-overlay
该网络不受单一主机限制;任何参与 Swarm 的节点都可以将容器连接到它。您可以使用以下命令进行检查:
$ docker network inspect my-overlay
自定义覆盖网络
覆盖网络支持高级配置,例如:
$ docker network create \
--driver overlay \
--subnet 10.0.9.0/24 \
--gateway 10.0.9.99 \
--opt encrypted \
my-secure-overlay
--subnet和--gateway定义网络拓扑。--opt encrypted为容器流量启用 IPSEC 加密。--scope swarm在 Swarm 模式下使用 overlay 驱动时会自动应用。
理解 --scope 和 --attachable 标志
--scope swarm:表示网络在整个 Swarm 的所有节点上可用。仅 Swarm 服务(非独立容器)可以使用此网络,除非指定--attachable。--attachable:允许独立容器加入 Swarm 作用域网络。适用于调试或临时容器访问。
例如:
$ docker network create \
--driver overlay \
--attachable \
my-dev-overlay
这使您在服务之外,还可以将常规容器附加到 Swarm 网络。
网络配置与验证
您需要确保 Docker 网络配置正确,才能在容器间正常通信、提供必要的安全性并保障服务性能。Docker 提供了多种工具和命令来审查、排障和验证您的网络配置。
网络配置核验
要查看任意 Docker 网络的配置详情,使用 docker network inspect 命令。您将获得详细的 JSON 输出,其中包括:
- 网络驱动(
bridge、overlay等) - 子网与网关配置
- 作用域(
local、swarm) - 已连接的容器及其 IP 地址
- 内部或外部访问属性
- 驱动特定选项(例如覆盖网络的 VXLAN ID)
例如,您可以这样做:
$ docker network inspect my-network
留意以下关键字段:
- "Driver":确保创建了预期的网络类型。
- "IPAM":确认 IP 地址管理设置,包括自定义子网或网关。
- "Containers":显示已连接的容器及其分配的 IP。
- "Options":显示加密(encrypted: true)或 MTU 大小等高级配置。
验证技巧
要确认网络按预期工作:
- 首先验证 IPAM 配置。检查 Docker network inspect 输出中的 "IPAM" 部分。确保子网与网关符合预期设置。配置错误的子网会导致连通性问题或 IP 冲突。
- 然后检查 VXLAN 标识符(仅限覆盖网络)。覆盖网络使用 VXLAN 将容器流量封装以跨多主机传输。检查 "Options" 部分是否包含如下键:
"com.docker.network.driver.overlay.vxlanid_list": "4097"
这表明 VXLAN 隧道处于活动且配置正确。若缺失或不正确,服务可能无法跨节点互通。
- 最后测试容器间连通性。在一个容器中尝试通过容器名或 IP ping 另一个容器。这可确认 DNS 解析与内部路由正常:
$ docker exec -it container1 ping container2
检查 DNS 行为
连接到用户自定义网络的容器会使用 Docker 的内嵌 DNS 服务器。要确认,请在容器内检查 /etc/resolv.conf,并测试服务名解析。
验证网关路由
对于连接多个网络的容器,Docker 会基于最高的 gw-priority 选择默认网关。为确保正确路由,可在创建容器时指定优先级:
$ docker run --network name=public,gw-priority=1 --network private mycontainer
使用日志与诊断工具
监控容器日志以发现连通性错误,并在容器内使用 curl、dig 和 ip a 等工具进行底层调试。
总之,验证 Docker 网络配置有助于确保容器间的无缝通信,并最大限度降低多服务应用中意外故障的风险。
这也引出了下面的内容。
安全与性能优化
真实的容器网络不仅仅是开启通信方式。很多情况下,它需要在提供必要隔离的同时确保性能最大化。在保障架构安全并提供服务时,分段与吞吐量优化将助您实现目标。
网络分段策略
网络分段是容器化应用的一项基础实践与安全方法。通过将容器分配到不同的 Docker 网络,您可以分离横切关注点,例如前端、后端与数据库的服务分段。这有助于主动降低暴露风险并防范潜在攻击。
您可以利用用户自定义网络来管理通信边界。不同网络中的容器彼此不可通信,除非您显式将它们连接起来。例如,如果将数据库容器放在仅内部可达的网络上,面向公众的服务将无法直接访问它。
内置防火墙规则与控制
默认情况下,Docker 会通过 iptables 规则限制容器与外部世界之间的通信端点。
扩展这类分段的方法包括:
- 在默认桥接网络上禁用容器间通信:
{
"icc": false
}
- 将其添加到 Docker 守护进程的
daemon.json中,以防止容器在不处于同一用户自定义网络时相互通信。 - 限制能力与权限,使用
--cap-drop、--read-only和--no-new-privileges等标志。 - 在 Swarm 模式中使用覆盖网络,为跨多主机的服务通信提供加密与作用域控制。
性能优化技巧
通过优化,您可以用多种方式提升 Docker 的网络性能。
提升网络吞吐
选择正确的网络驱动会直接影响性能。例如:
- 当低延迟、高吞吐量通信至关重要且不优先考虑网络隔离时,使用 host 驱动。
- 在本地隔离环境中优先使用 bridge。
- 当容器需要在网络上表现为物理设备时部署 macvlan。
避免让默认 bridge 网络超负荷,为重载服务或逻辑分组创建独立网络。
使用 iperf3 与指标进行性能剖析
要衡量网络性能,可使用 iperf3 等剖析工具:
# 在 container1 中启动服务器
docker run -it --rm --name server --network my-net networkstatic/iperf3 -s
# 在 container2 中运行客户端
docker run -it --rm --network my-net networkstatic/iperf3 -c server
您还可以使用以下方式监控网络统计:
docker stats——实时 CPU、内存与网络 I/O。- Prometheus + cAdvisor——用于时序指标与长期监控。
- 在容器内通过自定义脚本或代理导出
/proc/net/dev指标。
定期剖析有助于及早发现瓶颈,并为容器放置、驱动选择或主机网络升级等决策提供依据。
网络问题排查
即便遵循最佳实践,网络问题仍可能出现。快速诊断与解决对维持服务可用性至关重要。本节提供识别并修复常见 Docker 网络问题的工具与技巧。
诊断网络问题
精简容器可能缺少 ping、dig 或 netstat 等工具,增加排障难度。无需修改容器本身,可启动一个新容器共享其网络命名空间:
docker run -it --network container:my-container alpine
然后安装网络工具:
apk add --no-cache iproute2 bind-tools net-tools
或者使用 nicolaka/netshoot,这是一款内置诊断工具的专用镜像:
docker run -it --rm --network container:my-container nicolaka/netshoot
像 ip、nslookup、netstat 与 traceroute 等工具有助于识别路由或 DNS 问题。
解决连通性问题
一些常见原因及其解决方法:
- DNS 解析失败:确保容器位于用户自定义网络上,以使用 Docker 的内嵌 DNS。检查 /etc/resolv.conf,并使用 dig 或 nslookup 测试名称解析。
- MTU 不匹配:不同网络或主机间的容器可能因 MTU 不一致导致丢包。如果使用隧道,请在覆盖网络中降低 MTU:
docker network create --driver overlay --opt com.docker.network.driver.mtu=1200 my-overlay
子网冲突
避免 Docker 网络之间或与主机物理网络存在重叠子网。使用 --subnet 定义不冲突的范围。
主机防火墙阻塞端口
确保必需的 Docker 端口已开放:
- 2377(Swarm 管理)
- 7946 TCP/UDP(容器发现)
- 4789 UDP(覆盖数据)
有效的排障既需要诊断工具,也需要对容器与其网络交互方式的扎实理解。具备正确的工具与方法,大多数问题都能在数分钟内定位并解决。
结论
Docker 网络是容器化架构的基石,无论在单机还是分布式集群中运行服务,都能实现安全、高效和可扩展的通信。
借助对多种网络驱动的内置支持、可定制的 IP 管理以及原生于 Swarm 的覆盖网络,Docker 使开发者与 DevOps 团队能够在复杂环境中隔离工作负载、控制数据流并优化性能。
这并非“一刀切”的方案,但若合理使用,它为构建现代微服务、自动化流水线与安全的分布式系统提供了强大能力。
想继续提升您的 Docker 与容器化技能吗?
以下是值得强烈推荐的资源,助您继续学习之旅:
- Docker 入门:从容器与镜像管理基础开始。
- Docker 进阶:深入学习网络、卷,以及使用 Docker Compose 的多容器编排。
- Kubernetes 入门:学习如何使用 Kubernetes 大规模部署与管理容器。
- Docker Compose 与 Kubernetes:详细对比:理解差异,并决定哪种编排工具适合您的需求。
- 10 个 Docker 项目创意:从入门到高级:通过真实项目灵感来应用您的技能。
Docker 创建网络常见问答
Docker 的 network create 命令用于做什么?
用于定义和配置自定义 Docker 网络,使容器能够安全高效地通信。
Docker 网络驱动的主要类型有哪些?
主要驱动包括 bridge、host、none、overlay、macvlan 和 ipvlan,每种在隔离与连通性方面有所不同。
何时应在 Docker 中使用覆盖(overlay)网络?
覆盖网络非常适合多主机通信,尤其在 Docker Swarm 或 Kubernetes 环境中。
如何验证 Docker 网络是否配置正确?
使用 Docker network inspect,检查 IPAM 与 VXLAN 设置,并用 ping 或 DNS 工具测试容器连通性。
哪些工具有助于诊断 Docker 网络问题?
nicolaka/netshoot、dig、nslookup、iperf3 以及容器日志等工具可用于调试如 DNS 失败或 MTU 不匹配等常见问题。
Josep 是一名专注于欧洲项目的自由职业数据科学家,擅长数据存储、处理、高级分析,以及具有影响力的数据叙事。
作为一名教育者,他在纳瓦拉大学硕士项目教授大数据课程,并在 Medium、KDNuggets 和 DataCamp 等平台发表文章分享见解。Josep 还在其通讯 Databites(databites.tech)撰写有关数据与技术的内容。
他拥有加泰罗尼亚理工大学工程物理学学士学位,以及庞培法布拉大学智能交互系统硕士学位。
