内容
活动
关注

七、Docker核心技术:深入理解网络模式 (Bridge, Host, None, Container)

简介: 容器不仅仅是孤立的运行环境,它们需要相互通信,也需要与外部世界进行交互。理解 Docker 的不同网络模式,是构建和部署复杂多容器应用的关键。本节将深入探讨 Docker 原生提供的四种网络模式以及强烈推荐使用的自定义网络。要让它们通信,需要将其中一个容器也连接到另一个网络上。默认 bridge 网络不支持容器名DNS解析,只能通过IP地址通信。容器没有自己的独立IP地址,它共享宿主机的IP。网络模式启动一个容器后,如何查看该容器的IP地址?时,该容器默认会连接到哪个网络?模式运行,并且其内部的应用监听。

容器不仅仅是孤立的运行环境,它们需要相互通信,也需要与外部世界进行交互。Docker 通过强大而灵活的网络子系统来实现这一点。理解 Docker 的不同网络模式,是构建和部署复杂多容器应用的关键。本节将深入探讨 Docker 原生提供的四种网络模式以及强烈推荐使用的自定义网络

思维导图

image.png

image.png

一、Bridge 模式 - 默认的网络

bridge 模式是 Docker 默认使用的网络模式。当你运行一个容器不指定 --network 参数时,它就工作在这个模式下。

工作原理:
Docker 在宿主机上 默认创建一个名为 docker0虚拟网桥,==用来让主机和容器在同一子网内通过 IP 直接通信==。每个容器都会 被分配一个 独立的网络命名空间和一个连接到 docker0私有IP地址

Bridge 模式特性
| 特性 | 说明 |
| :--- | :--- |
| 网络隔离 | 默认提供良好的网络隔离,每个容器有自己的网络栈。 |
| 容器间通信 | 连接到 同一网桥的容器,可以通过 彼此的私有IP地址通信。 |
| 外部访问 | 必须使用 -p-P 进行 端口映射,才能从外部访问容器服务。 |



代码示例:
bash # 1. 启动三个 Nginx 容器,分别映射到宿主机的不同端口 docker run -d --name nginx1 -p 8081:80 nginx docker run -d --name nginx2 -p 8082:80 nginx docker run -d --name nginx3 -p 8083:80 nginx # 2. 查看容器的私有 IP docker inspect nginx1 | grep "IPAddress" docker inspect nginx2 | grep "IPAddress" docker inspect nginx3 | grep "IPAddress" # 3. 在宿主机上查看 docker0 网桥和 veth 接口 ip addr show docker0 ip link show | grep veth # 4. 查看 veth 和 docker0 的桥接关系 brctl show docker0 # 5. 测试同一子网直连通信 # 从宿主机 ping 容器 ping -c 2 172.17.0.2 # 假设 nginx1 ping -c 2 172.17.0.3 # 假设 nginx2 # 容器之间互 ping docker exec -it nginx2 ping -c 2 172.17.0.2 docker exec -it nginx3 ping -c 2 172.17.0.3 # 6. 测试端口映射访问 curl http://localhost:8081 curl http://localhost:8082 curl http://localhost:8083


## 二、Host 模式 - 共享宿主机网络
host 模式下,容器 不再拥有自己 独立的网络命名空间,而是 直接共享宿主机的 网络栈

Host 模式特性总结
| 特性 | 说明 |
| :--- | :--- |
| 网络共享 | 容器 直接使用宿主机的IP地址和网络配置。 |
| 性能 | 网络性能最高,因为没有NAT转换的开销。 |
| 端口 | 无需端口映射 ( -p 无效)。容器监听的端口 直接暴露在宿主机上。 |
| 缺点 | 牺牲了网络隔离性,容易发生 端口冲突。 |





代码示例:
bash # 使用 host 模式启动一个 Nginx 容器 docker run -d --name nginx-host --network host nginx # 在宿主机上直接访问 localhost:80 curl http://localhost


## 三、None 模式 - 完全隔离
none 模式为容器 创建一个独立的 网络命名空间,但 不为其进行任何 网络配置

None 模式特性总结
| 特性| 说明 |
| :--- | :--- |
| 网络配置 | 容器内 仅有一个 lo (loopback) 回环网卡。 |
| 隔离性 | 完全的网络隔离,无法与外部、宿主机或其他容器通信。 |
| 适用场景 | 完全不需要网络连接的任务,如 批量计算高安全需求的任务。 |



代码示例:
bash # 使用 none 模式启动一个 tomcat 容器 docker run -d -p 8085:8080 --name my_tomcat02 --network none tomcat # 在宿主机查看容器网络配置 docker inspect my_tomcat02 | tail -20

## 四、Container 模式 - 共享网络
container 模式允许一个 新创建的容器共享 另一个已存在容器的 网络命名空间

Container 模式特性总结
| 特性 | 说明 |
| :--- | :--- |
| 网络共享 | 新容器 与目标容器共享同一个IP、端口、路由等。 |
| 通信 | 两个容器之间可以通过 localhost 直接通信。 |
| 适用场景 | “边车 (Sidecar)”模式,如 主应用网络监控日志收集容器的组合。 |




代码示例:
bash # 1. 先启动一个主容器 (目标容器) docker run -d --name main-app nginx # 2. 启动一个边车容器,共享 main-app 的网络 docker run -it --name sidecar --network container:main-app busybox # 3. 在 sidecar 容器的 shell 内部,通过 localhost 访问 main-app 的 Nginx 服务 wget -qO- http://localhost


## 五、自定义网络 - 最佳实践
生产环境多容器应用中, 强烈推荐创建和使用 自定义的 bridge 网络

自定义网络核心优势
| 优势 | 说明 |
| :--- | :--- |
| 自动DNS解析 | 最大的优点。容器间可以通过 容器名称直接通信,无需关心IP地址。 |
| 更佳网络隔离 | 不同自定义网络之间默认是 隔离的,提供了更安全的环境。 |



常用网络管理命令
| 命令 | 作用 |
| :--- | :--- |
| docker network create <name> | 创建一个自定义网络。 |
| docker network ls | 列出所有网络。 |
| docker network inspect <name> | 查看网络详情,包括连接的容器。 |
| docker network connect <net> <cont> | 将 已运行的容器连接到网络。 |
| docker network disconnect <net> <cont> | 断开容器与网络的连接。 |
| docker network rm <name> | 删除一个自定义网络。 |

代码示例 (容器名通信):
bash # 1. 创建自定义网络 docker network create my-app-network # 2. 再创建一个测试网络 docker network create test # 3. 查看当前所有网络 docker network ls # 4. 查看 bridge 网络详情 docker network inspect bridge # 5. 将容器 my-nginx 连接到 test 网络 docker network connect test my-nginx # 6. 查看 my-nginx 的网络配置(此时有 bridge 和 test 两个网络) docker inspect my-nginx # 7. 将 my-nginx 从 test 网络移除 docker network disconnect test my-nginx # 8. 再次查看 my-nginx 的网络配置(只剩下 bridge) docker inspect my-nginx


---

## 练习题

题目一:默认网络模式
当你执行 docker run nginx 时,该容器默认会连接到哪个网络?

题目二:Bridge 模式通信
你有两个以默认 bridge 模式运行的容器 container-acontainer-b。如何在 container-a 中访问 container-b

题目三:Host 模式特性
使用 host 网络模式启动一个容器后,如何查看该容器的IP地址?

题目四:Host 模式端口
如果一个容器以 host 模式运行,并且其内部的应用监听 8080 端口,你需要使用 docker run 的哪个参数来暴露这个端口给宿主机?

题目五:None 模式应用
描述一个适合使用 none 网络模式的具体场景。

题目六:Container 模式核心
container 模式下,两个容器共享了什么?它们之间最简单的通信方式是什么?

题目七:自定义网络优势
相比默认的 bridge 网络,创建自定义 bridge 网络的两个主要优势是什么?

题目八:自定义网络创建
写出一条命令,创建一个名为 backend-net 的自定义 bridge 网络。

题目九:连接到自定义网络
如何启动一个新的 redis 容器,命名为 cache,并将其直接连接到 backend-net 网络?

题目十:容器名解析
假设 cache 容器和一个名为 api-server 的应用容器都连接到了 backend-net。在 api-server 容器内部,应该使用哪个主机名来连接 cache 容器?

题目十一:动态连接网络
一个名为 legacy-app 的容器已经在默认的 bridge 网络中运行。如何将其也连接到 backend-net 网络,使其可以与 cacheapi-server 通信?

题目十二:网络隔离
你有两个自定义网络 frontend-netbackend-net。一个名为 webapp 的容器只连接到 frontend-net,一个名为 database 的容器只连接到 backend-netwebapp 容器是否能直接通过容器名访问 database 容器?

题目十三:查看网络中的容器
如何查看 backend-net 网络中当前连接了哪些容器?

题目十四:网络模式选择
你需要部署一个对网络延迟极其敏感性能要求极高的应用,并且可以接受较低的安全隔离性。你应该优先考虑哪种网络模式?

题目十五:断开网络连接
写出一条命令,将 legacy-app 容器从 backend-net 网络中断开连接。

答案与解析

答案一:
默认的 bridge 网络

答案二:
首先使用 docker inspect container-b 查找其私有IP地址,然后在 container-a 内部使用该IP地址进行访问 (例如 ping <ip_address_of_b>)。

解析: 默认 bridge 网络不支持容器名DNS解析,只能通过IP地址通信

答案三:

容器没有自己的独立IP地址,它共享宿主机的IP。你可以通过在宿主机上执行 ip aifconfig 来查看。

答案四:

不需要任何参数。

答案五:

一个执行密码破解或科学计算的容器。这类任务只需要CPU和内存资源,完全不需要网络连接,使用 none 模式可以最大化安全隔离。

答案六:

它们共享同一个网络命名空间 (IP地址、端口、路由表等)。最简单的通信方式是通过 localhost

答案七:

1.自动DNS解析:可以通过容器名直接通信。2. 更好的网络隔离:不同自定义网络之间默认是隔离的。

答案八:

docker network create backend-net 

答案九:

docker run -d --name cache --network backend-net redis 

答案十:

应该使用主机名 cache

答案十一:

docker network connect backend-net legacy-app 

解析: docker network connect 允许将一个正在运行的容器连接到一个或多个网络。

答案十二:

不可以

解析: 容器默认只能与连接在相同网络中的其他容器通信。要让它们通信,需要将其中一个容器也连接到另一个网络上。

答案十三:

docker network inspect backend-net 

答案十四:
应优先考虑 host 模式。

解析: host 模式消除了网络地址转换 (NAT) 的开销,提供了最佳的网络性能,代价是牺牲了隔离性。

答案十五:

docker network disconnect backend-net legacy-app 
目录
相关文章
|
2天前
|
存储 关系型数据库 MySQL
五、Docker 核心技术:容器数据持久化之数据卷
别把重要数据直接放进Docker容器里,因为容器就像一辆“临租车”,车一还(容器被删除),落在里面的东西就全没了。正确的做法是使用数据卷 (Volume),它好比一个属于你自己的、可插拔的“移动硬盘”。你可以把这个“硬盘”(具名数据卷)挂载到任何一辆“临租车”(容器)上使用。这样一来,就算车换了,你的数据也安然无恙,完美解决了数据库等应用的数据持久化问题。
66 32
五、Docker 核心技术:容器数据持久化之数据卷
|
25天前
|
JavaScript Java 关系型数据库
基于springboot的文山西文旅网站
本项目基于Spring Boot、Java、Vue和MySQL技术,设计并实现一个山西文旅管理系统,旨在推动文旅管理的信息化与自动化。系统以实用、易用为核心,提升管理效率,降低人力成本,适应现代文旅发展需求,具有良好的可扩展性与稳定性。
|
29天前
|
人工智能 安全 API
近期 AI 领域的新发布所带来的启示
2024 年以来,AI 基础设施的快速发展过程中,PaaS 层的 AI 网关是变化最明显的基建之一。从传统网关的静态规则和简单路由开始,网关的作用被不断拉伸。用户通过使用网关来实现多模型的流量调度、智能路由、Agent 和 MCP 服务管理、AI 治理等,试图让系统更灵活、更可控、更可用。国庆期间 AI 界发布/升级了一些产品,我们在此做一个简报,从中窥探下对 AI 网关演进新方向的启示。
278 27
|
24天前
|
Dubbo Java 应用服务中间件
Apache ShenYu 架构学习指南
Apache ShenYu 是一款高性能、插件化的微服务API网关,基于Spring WebFlux + Reactor 构建,支持多协议、动态配置与实时数据同步。本指南以通俗类比和实战路径,带你深入理解其架构设计、核心流程与源码实现,助力快速掌握并参与贡献。
192 12
|
29天前
|
人工智能 安全 Java
分布式 Multi Agent 安全高可用探索与实践
在人工智能加速发展的今天,AI Agent 正在成为推动“人工智能+”战略落地的核心引擎。无论是技术趋势还是政策导向,都预示着一场深刻的变革正在发生。如果你也在探索 Agent 的应用场景,欢迎关注 AgentScope 项目,或尝试使用阿里云 MSE + Higress + Nacos 构建属于你的 AI 原生应用。一起,走进智能体的新世界。
349 36
|
13天前
|
人工智能 开发框架 安全
浅谈 Agent 开发工具链演进历程
模型带来了意识和自主性,但在输出结果的确定性和一致性上降低了。无论是基础大模型厂商,还是提供开发工具链和运行保障的厂家,本质都是希望提升输出的可靠性,只是不同的团队基因和行业判断,提供了不同的实现路径。本文按四个阶段,通过串联一些知名的开发工具,来回顾 Agent 开发工具链的演进历程。
210 35
|
26天前
|
JavaScript 前端开发 Java
基于springboot的医院陪诊预约挂号系统
医院陪诊预约平台顺应老龄化社会需求,利用B/S架构与Spring、Vue、MySQL等技术,构建高效、便捷的线上陪诊服务系统,提升患者就医体验,优化医疗资源配置,推动医疗服务智能化发展。
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
构建AI智能体:十二、给词语绘制地图:Embedding如何构建机器的认知空间
Embedding是一种将词语、图像等信息转化为低维稠密向量的技术,使计算机能捕捉语义关系。不同于传统One-Hot编码,Embedding通过空间距离表达语义相似性,如“国王-男人+女人≈王后”,广泛应用于NLP、推荐系统与大模型中,是AI理解世界的基石。
197 13
|
9天前
|
人工智能 文字识别 并行计算
为什么别人用 DevPod 秒启 DeepSeek-OCR,你还在装环境?
DevPod 60秒极速启动,一键运行DeepSeek OCR大模型。告别环境配置难题,云端开箱即用,支持GPU加速、VSCode/Jupyter交互开发,重塑AI原生高效工作流。
204 20
下一篇