当前位置: 首页 > news >正文

Docker 容器网络模式详解

Docker 容器网络模式详解

1.1 引言

1.1.1 Docker 网络简介

Docker 是一个开源的应用容器引擎,它允许开发者将应用和依赖打包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器采用沙箱机制,彼此隔离,不会相互干扰。Docker 网络是容器之间以及容器与宿主机之间通信的基础。

1.1.2 Docker 网络的技术基础

Docker 网络栈基于 Linux 的网络命名空间(Namespace)和虚拟网络接口(veth pairs)实现。通过 Docker 提供的几种网络模式,容器可以灵活选择与宿主机和其他容器的隔离或连接方式,从而满足不同的应用需求。

1.1.3 为什么需要不同的网络模式

不同的网络模式满足了多种网络需求。例如,某些应用需要高性能网络传输,而另一些则可能需要严格的网络隔离。Docker 提供了多种网络模式,包括 Bridge(桥接)、Host(主机)、None(无)、Container(容器)等模式,以适应这些需求。


2. Bridge(桥接)模式

2.1 原理与特性

Bridge 模式是最常用的 Docker 网络模式。每个 Docker 守护进程都会自动创建一个名为 docker0 的虚拟网桥,类似于物理交换机的工作方式,用于连接 Docker 容器和宿主机网络。

Docker 在每个容器启动时创建一对虚拟网络接口(veth pairs)类似于网线,一端连接到容器网络命名空间,另一端连接到 docker0,形成容器与宿主机之间的通信链路。此外,Docker 使用 iptables 创建 NAT 规则,让容器可以通过宿主机访问外部网络。

2.2 适用场景
  • 当需要容器间通信时
  • 当容器需要与宿主机或外部网络通信时
2.3 配置方法

使用默认的桥接网络时,可以直接省略 --network 参数:

docker run -d --name my_container nginx

使用自定义的桥接网络时:

docker network create my_bridge_network
docker run -d --name my_container --network my_bridge_network nginx
2.4 实战演练

假设我们有两个容器需要互相通信,可以按照以下步骤操作:

  1. 创建自定义桥接网络:docker network create my_bridge_network
  2. 启动两个容器并连接到该网络:
    docker run -d --name container1 --network my_bridge_network busybox sleep 1000
    docker run -d --name container2 --network my_bridge_network busybox sleep 1000
    
  3. 在一个容器中 ping 另一个容器的 IP 地址或容器名,验证通信。

3. Host(主机)模式

3.1 原理与特性

在 Host 模式下,容器直接使用宿主机的网络堆栈,意味着容器和宿主机共享相同的网络命名空间。容器不再有独立的 IP 地址,而是使用宿主机的 IP 地址和端口。Host 模式减少了网络隔离,但提高了性能。

3.2 适用场景
  • 高性能网络应用,例如低延迟实时应用
  • 应用需要直接访问宿主机网络接口
3.3 配置方法

在启动容器时添加 --network host 参数:

docker run -d --name my_container --network host nginx
3.4 实战演练

运行一个 Nginx 容器并使用 Host 网络模式:

  1. 启动容器:docker run -d --name my_container --network host nginx
  2. 通过宿主机的 IP 地址直接访问 Nginx 服务。

注意:Host 模式下端口冲突可能会导致启动失败,建议合理规划端口。


4. None(无)模式

4.1 原理与特性

None 模式下,容器没有网络功能,不会被分配任何网络接口,也无法与其他容器或宿主机通信。这种模式为需要完全网络隔离的应用提供了较高的安全性。

4.2 适用场景
  • 运行不需要网络连接的任务
  • 高度安全的环境,需要严格限制网络访问
4.3 配置方法

启动容器时添加 --network none 参数:

docker run -d --name my_container --network none busybox
4.4 实战演练

启动一个 BusyBox 容器并验证它没有网络连接:

docker exec -it my_container ping google.com

应提示网络不可达。


5. Container(容器)模式

5.1 原理与特性

Container 模式允许新创建的容器共享另一个已存在的容器的网络命名空间。这样两个容器可以像是同一台机器上的进程一样,共享网络接口、IP 地址和端口。

5.2 适用场景
  • 多个服务组件紧密协作,减少网络开销
  • 服务组件间通信需要最小的网络延迟
5.3 配置方法

在启动容器时,添加 --network container:<name|id> 参数,使其共享指定容器的网络:

docker run -d --name my_container --network container:existing_container busybox
5.4 实战演练

创建一个基础容器,然后启动一个新容器与之共享网络:

  1. 启动第一个容器:docker run -d --name existing_container nginx
  2. 启动第二个容器并共享第一个容器的网络:
    docker run -d --name my_container --network container:existing_container busybox
    
  3. 测试两个容器间的通信,验证网络共享效果。

6. 常见问题

6.1 无法访问容器
  • 原因:容器未正确启动、容器内的服务未监听网络、网络配置错误等。
  • 解决方法:检查容器日志、网络配置和防火墙规则。
6.2 端口冲突
  • 原因:尝试在同一端口上启动多个服务。
  • 解决方法:更改服务端口号或选择不同的网络模式。
6.3 DNS 解析问题
  • 原因:DNS 配置不正确导致容器无法解析域名。
  • 解决方法:在 /etc/docker/daemon.json 中设置 DNS,例如:
    {"dns": ["8.8.8.8", "8.8.4.4"]
    }
    
    然后重启 Docker 服务。
6.4 网络性能问题
  • 原因:网络延迟高或吞吐量低,可能因网络配置不当或宿主机网络拥塞导致。
  • 解决方法:优化网络配置,减少网络拥塞,或通过 docker statsiftop 等工具检查资源使用情况。
6.5 排查工具
  • 检查容器状态docker ps -a
  • 查看容器日志docker logs <container_name>
  • 网络配置检查docker inspect <container_name>
  • 测试连通性pingcurl 命令。

7. Docker 网络模式与 VMware 虚拟机网络模式的对比

Docker 容器和 VMware 虚拟机在网络模式上有一些相似性,但由于两者的虚拟化机制不同,网络模式的实现和功能侧重点也有所不同。以下是主要的网络模式对比:

7.1 Bridge 模式对比

虽然vmware也有一种网络模式叫bridge, 但是docker的bridge模式和vmware的NAT模式更像

模式Docker 的 Bridge 模式VMware 的 NAT 模式
实现方式使用 docker0 虚拟网桥连接容器和宿主机网络;每个容器分配独立 IP 地址,通过 NAT 转发流量。VMware 的 NAT 模式通过虚拟 NAT 网关和虚拟交换机连接 VM 和宿主机,所有 VM 通过共享宿主机 IP 访问外网。
适用场景容器间通信,容器访问外网,但宿主机与容器 IP 互不冲突。需要 VM 与宿主机隔离,但又要保证 VM 能访问外网。
隔离性中等,容器之间可见;宿主机与容器间有一定隔离。中等,虚拟机间的隔离性较高,但共享宿主机 IP 出外网。

总结:两者都使用 NAT 技术,但 Docker 的 Bridge 模式可以通过自定义网络来精细控制容器间隔离,适用于微服务环境下的容器化应用。VMware 的 NAT 模式则更适用于较传统的网络隔离场景。

7.2 Host 模式对比
模式Docker 的 Host 模式VMware 的 Bridged 模式
实现方式容器直接共享宿主机的网络命名空间,使用宿主机 IP。VM 通过虚拟交换机直接连接到宿主机的物理网络接口,获得局域网 IP 地址。
适用场景需要容器与宿主机密切交互的高性能应用场景。需要 VM 直接加入局域网,与其他局域网设备通信。
隔离性较低,容器和宿主机之间没有网络隔离。较高,VM 使用独立 IP 地址和 MAC 地址,在局域网中被视为独立设备。

总结:Docker Host 模式强调与宿主机的网络性能和通信共享,而 VMware 的 Bridged 模式允许 VM 直接加入物理网络,且拥有独立 IP 地址,在隔离性上更适合传统的独立主机需求。

7.3 None 模式对比
模式Docker 的 None 模式VMware 的 Host-Only 模式
实现方式禁用容器网络,容器完全隔离,无 IP 地址。VM 通过虚拟网络适配器与其他 VM 或宿主机通信,不能访问外网。
适用场景适用于无网络需求或安全要求极高的隔离场景。适用于需要 VM 间隔离和宿主机隔离的网络测试或开发环境。
隔离性完全隔离,没有网络连接。较高,仅限于 VM 间通信,无外网访问。

总结:Docker 的 None 模式完全切断网络连接,而 VMware 的 Host-Only 模式则允许 VM 和宿主机之间的有限通信,适用于不同的测试和隔离需求。


7.4 总结
网络需求Docker 网络模式VMware 虚拟机网络模式
容器/虚拟机间通信Bridge 模式,灵活隔离控制Host-Only 模式,适合隔离
与宿主机共享网络Host 模式,性能最高NAT 或 Bridged 模式
完全隔离None 模式Host-Only 模式
高性能与外网访问Host 模式Bridged 模式

Docker 和 VMware 的网络模式虽然在功能上存在部分重叠,但二者的技术实现和应用场景有所不同。Docker 更强调轻量级隔离和高效网络性能,适合动态扩展的微服务环境;而 VMware 提供更接近物理机的网络隔离,适合需要独立主机的虚拟化环境。根据应用场景和网络需求选择合适的模式,能够充分发挥容器和虚拟机的优势。


8. 参考资料

  • Docker 官方文档
  • Docker 网络指南
  • Docker Overlay network driver

相关文章:

Docker 容器网络模式详解

Docker 容器网络模式详解 1.1 引言 1.1.1 Docker 网络简介 Docker 是一个开源的应用容器引擎&#xff0c;它允许开发者将应用和依赖打包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器采用沙箱机制&#xff0c;彼此…...

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)4.11

目录 第四门课 卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;第四周 特殊应用&#xff1a;人脸识别和神经风格转换&#xff08;Special applications: Face recognition &Neural style transfer&#xff09;4.11 一维到三维推广&#xff08;1D and 3…...

小游戏开发,出现了降本增效的技术?

中国经济下行大周期下&#xff0c;要说受影响程度较小的&#xff0c;非游戏行业莫属了。 小游戏的快速增长主要得益于其便捷的使用方式和轻量化的特点。小游戏通常无需下载&#xff0c;即点即玩&#xff0c;适合在碎片时间内进行娱乐&#xff0c;这种特性吸引了大量用户。此外…...

(4)Java 编程基础概览:Java中的输入输出操作与代码注释详解

目录 1. 控制台输出操作2. 控制台输入操作代码解释:3. 代码注释3.1 单行注释3.2 多行注释3.3 文档注释3.4 注释的重要性3.5 注意事项在Java编程语言中,输入与输出(I/O)操作扮演着举足轻重的角色。它们允许程序与外界环境进行数据的交互,无论是从用户处获取信息,还是向用户…...

Git使用指南

目录 工作机制基本框架:流程图 基本命令分支操作远程仓库本地仓库关联远程仓库 参考 工作机制 基本框架: Workspace&#xff1a;开发者工作区&#xff0c;也就是你当前写代码的目录&#xff0c;它一般保持的是最新仓库代码。Index / Stage&#xff1a;暂存区&#xff0c;最早…...

【linux】再谈网络基础(一)

1. 再谈 "协议" 协议是一种 "约定"&#xff0c;在读写数据时, 都是按 "字符串" 的方式来发送接收的. 但是这里我们会遇到一些问题&#xff1a; 如何确保从网上读取的数据是否是完整的&#xff0c;区分缓冲区中的由不同客户端发来的数据 2. 网…...

Unknown at rule @tailwindscss(unknownAtRules)

一、前言 整合 tailwindcss 后&#xff0c;发现指令提示警告 Unknown at rule tailwindscss(unknownAtRules)&#xff0c;其实是 vscode 无法识别 tailwindscss 指令&#xff0c;不影响使用&#xff0c;但是对于我这种有编程洁癖的人来说&#xff0c;有点膈应。 二、解决方案…...

IDEA - 快速去除 mapper.xml 黄色警告线和背景色----简化版

1.打开设置 2.去掉黄色警告线设置 3.去掉背景色设置 4.示范图...

高级 SQL 技巧详解

文章目录 高级 SQL 技巧详解一、引言二、窗口函数1、窗口函数的使用1.1、RANK() 函数示例1.2、常用窗口函数 三、公共表表达式&#xff08;CTE&#xff09;2、CTE 的使用2.1、CTE 示例 四、索引优化3、索引的创建与优化3.1、创建索引3.2、索引类型与注意事项 五、事务管理4、事…...

移除元素(java)

给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k&#xff0c;要通过此题&#xff0c;您需要执行以下操作&#xff1a; 更改…...

【Linux】shell脚本:检测文件是否存在,如存在则删除

通常&#xff0c;可以使用[ -f <file> ]来检查文件是否存在&#xff0c;使用rm <file>来删除文件。 以下是一个示例脚本&#xff0c;用于检测一个文件是否存在&#xff0c;并在存在时删除它&#xff1a; #!/bin/bash # 定义要检查的文件路径 file_path"/…...

Git代码托管(三)可视化工具操作(1)

常见的可视化操作工具有 一、官方网页 如码云、gitlab&#xff0c;自带了常见的git操作。 以码云为例&#xff1a; 1、创建分支&#xff1a; 进入分支目录&#xff0c;点击 新建分支 按钮&#xff0c; 在弹出框中输入新分支名称&#xff0c;点击确定即可一键创建分支&…...

How to use ffmpeg to convert video format from .webm to .mp4

The .mp4 container format doesn’t support the VP8 codec, which is commonly used in .webm files. MP4 containers typically use the H.264 codec for video and AAC for audio. You’ll need to re-encode the video using the H.264 codec and re-encode the audio us…...

Halcon 从XML中读取配置参数

1、XML示例 以下是一个XML配置文件的示例,该文件包含了AOI(自动光学检测)算法的环境参数和相机逻辑参数: <AOI><!--AOI算法参数 20241106--><Env><!--环境参数--><Param name="GPUName" value="NVIDIA GeForce RTX 405…...

hive表内外表之间切换

你想把内表和外表在元数据上达到切换的目的&#xff0c;这个操作有个前提&#xff0c;在apache版本源码上来讲是支持的&#xff01;&#xff01;&#xff01;&#xff01;但是&#xff01;&#xff01;&#xff01;&#xff01;注意哦&#xff01;默认情况下apache版本的源码中…...

电子邮件营销软件哪个好?

在数字化时代&#xff0c;电子邮件营销仍然是企业与客户沟通的核心策略之一。无论是推广新产品、发送新闻简报&#xff0c;还是进行客户关系管理&#xff0c;选择合适的电子邮件营销软件至关重要。面对市场上众多的选择&#xff0c;企业如何才能找到最适合自己的工具呢&#xf…...

OpenAI大事记;GPT到ChatGPT参数量进化

目录 OpenAI大事记 GPT到ChatGPT参数量进化 OpenAI大事记 GPT到ChatGPT参数量进化 ChatGPT是从初代 GPT逐渐演变而来的。在进化的过程中,GPT系列模型的参数数量呈指数级增长,从初代GPT的1.17亿个参数,到GPT-2的15 亿个参数,再到 GPT-3的1750 亿个参数。模型越来越大,训练…...

springboot020基于Java的免税商品优选购物商城设计与实现

&#x1f345;点赞收藏关注 → 文档最下方联系方式领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345; 一 、设计说明 1…...

代码随想录之字符串刷题总结

目录 1.反转字符串 2.反转字符串II 3.替换数字 4.翻转字符串里面的单词 5.右旋&&左旋字符串 1.反转字符串 题目描述&#xff1a; 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外…...

PS-基础学习(常用快捷键1.2-1.3)

常用快捷键 钢笔操作功能Alt 选择工具使用选择工具放到锚点上&#xff0c;按下alt&#xff0c;然后放到调整曲度的上面&#xff0c;可以修改一边的曲度可以修改出不平滑的转折点选择工具放到锚点上进行拖拽可以移动锚点的位置ctrl 选择工具使用选择工具&#xff0c;按住ctrl…...

qt QListView详解

1、概述 QListView 是 Qt 框架中的一个视图类&#xff0c;用于展示模型中的数据。它基于 QAbstractItemView&#xff0c;支持多种视图模式&#xff0c;如列表视图&#xff08;List View&#xff09;、图标视图&#xff08;Icon View&#xff09;等。QListView 是模型/视图框架…...

287. 寻找重复数

目录 题目我的解法解法 题目 给定一个包含 n 1 个整数的数组 nums &#xff0c;其数字都在 [1, n] 范围内&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 &#xff0c;返回 这个重复的数 。 你设计的解决方案…...

2024年最受欢迎的编程语言

No.1 JavaScript / TypeScript 自从创建第一个网站以使其动态化以来&#xff0c;JavaScript多年来一直受到欢迎。话虽如此&#xff0c;目前JavaScript是整个市场上需求量最大的编程语言。此外&#xff0c;TypeScript&#xff08;一种具有类型安全性的JavaScript超集&#xff0…...

C++ 线程初始化编译报错

这是一个很简单的开启一个线程, 用于演示一个线程和生命周期之间的错误,但是还没有把这个错误暴露出来, 就遇见了一个编译问题. 线程中执行指定逻辑的代码 线程的执行方法, 声明写在了ThreadRun.h 实现写在 ThreadRun.cpp中. class ThreadRun { public: void func(); };void T…...

[MySQL]视图

视图是什么 视图&#xff08;View&#xff09;是一种虚拟存在的表。视图中的数据&#xff0c;来自定义视图的查询语句中&#xff0c;使用的表&#xff0c;并且是在使用视图时动态生成的。 简单讲&#xff0c;视图只保存了查询的SQL逻辑&#xff0c;不保存查询结果。所以我们在…...

Windows Server2012 R2搭建NFS服务器

正文共&#xff1a;1024 字 23 图&#xff0c;预估阅读时间&#xff1a;1 分钟 在测试vCenter的集群操作时&#xff0c;出现了共享vSAN错误的问题&#xff0c;导致无法继续。我也只好先创建一个共享NFS&#xff08;Network File System&#xff0c;网络文件系统&#xff09;存储…...

SQL题:使用hive查询各类型专利top 10申请人,以及对应的专利申请数

一、题目以及介绍 题目介绍&#xff1a; 1、表名&#xff1a;t_patent_detail &#xff08;专利明细表&#xff09; 2、表字段&#xff1a;专利号(patent_id)、专利名称(patent_name)、专利类型(patent_type)、申请时间(aplly_date)、授权时间(authorize_date)、申请人(apply_…...

使用sealos部署的集群在部署metrics-server时日志x509

1、下载文件并进行部署 wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml2、进行部署 kubectl apply -f components.yaml3、发现问题 pod容器已经启动但是健康检查没有通过 kubectl get pod -n kube-system metrics-server…...

WPF怎么通过RestSharp向后端发请求

1.下载RestSharpNuGet包 2.请求类和响应类 public class ApiRequest {/// <summary>/// 请求地址/// </summary>public string Route { get; set; }/// <summary>/// 请求方式/// </summary>public Method Method { get; set; }/// <summary>//…...

promise的用法以及注意事项,看了这篇你就会了

一&#xff0c;为什么要使用promise,ta能解决那些问题&#xff1f; Promise 是异步编程的一种解决方案&#xff1a; 从语法上讲&#xff0c;Promise是一个对象&#xff0c;从它可以获取异步操作的消息&#xff1b;从本意上讲&#xff0c;它是承诺&#xff0c;承诺它过一段时间…...