Docker的网络介绍

网络简单介绍

在介绍 Docker 的网络模式之前,先简单说下我们在使用 Vmware 虚拟机中的网络模式,形成对比,更好理解。

1、Vmware 中的网络模式

1.1、VMnet0(桥接模式)

虚拟机通过宿主机的物理网卡直接连接到外部网络,类似于在物理网络中新增了一台独立设备。虚拟机会获得与宿主机同网段的 IP 地址,由外部 DHCP 服务器或手动分配。

桥接模式的原理如下图所示:
在这里插入图片描述
这种模式下,VMware虚拟出了一个交换机。

首先,该虚拟交换机通过主机的物理网卡连接到主机所在的网络中,然后所有的虚拟机都通过虚拟交换机接入到主机所在网络中。

所以在该模式下,虚拟机和主机位于同一网络中,因此在主机接入网络的前提下,虚拟机和物理机是可以互通的。

可以把 虚拟交换机 当成平时生活中的 物理交换机,用于扩展我们的 LAN 口。

1.2、VMnet8(NAT模式)

虚拟机通过宿主机的 NAT 服务共享其 IP 访问外部网络。宿主机充当路由器,将虚拟机的内部IP转换为宿主机的公网IP进行通信。

NAT模式的原理如下图所示:
在这里插入图片描述
这种模式下,VMware虚拟出了一个交换机,一个DHCP服务以及一个NAT服务,相当于构成了一个虚拟路由器。

虚拟路由器通过主机的物理网卡连接到主机所在的网络,虚拟机则全部连接到虚拟路由器上,组成了一个子网。

此时所有的虚拟机位于同一网络,因此彼此之间可以互通,但是主机不能与虚拟机互通。

为使主机能够和虚拟机互通,VMware 又在主机中虚拟出了一个网卡,并连接到了这个虚拟路由器中,这时主机便可虚拟机互通了。

首先需要明确的一点,就是在这种模式下边, VMware它不仅虚拟出来了一个交换机,它还同时虚拟出来了一个 DHCP 服务以及一个 NAT 服务。

实际上这三者组合起来就相当于构成了一个虚拟的路由器,然后这个虚拟路由器的一端也就是它的WAN口,会通过这个宿主机(图中物理机-03),连接到这个真正的路由器上,相当于是它的一个WAN口上边。好了,然后所有的虚拟机都会接入到这个虚拟的路由器当中。

其实就相当于是我们这个虚拟路由器,那它又在真正的这个路由器的局域网下边又创建了一个子局域网。那这些虚拟机都位于这个子网内,所以这种情况下虚拟机之间是可以互相通信的,并且这个虚拟机也是可以访问互联网的。

原理

在访问互联网的时候,这个数据包会经过两次NAT的地址转换。

一次是由这个虚拟路由器,由这个子网 IP 转换成这个局域网的IP。

再一次就是由这个真正的路由器当中的NAT,由这个局域网的这个私网 IP 转换成互联网上面的一个公网IP。

目前这个主机在 NAT 模式下边,其实是处在两个网络当中的,一个是我们这个虚拟网络,还有一个是咱们这个真正的物理网络。

端口映射(Port Forwarding)

允许外部网络通过宿主机的特定端口访问虚拟机内的服务(需手动配置)。
例如:将宿主机的 8080 端口映射到虚拟机的 80 端口,用户访问 宿主机IP:8080 即可访问虚拟机的Web服务。

1.3、VMnet1(仅主机模式)

虚拟机与宿主机通过虚拟网络连接,但完全隔离于外部网络。宿主机提供虚拟交换机,仅允许虚拟机间及与宿主机通信。

仅主机模式的原理如下图所示:

这种模式,和NAT模式十分相似,唯一的区别是,虚拟路由器并未连接到主机所在的网络中,因此主机和虚拟机之间可以互通,但是虚拟机不能访问互联网。

这个模式就非常非常简单了。仅主机模式其实和 NAT 模式十分相似,这里虚拟出来了一个路由器,然后这些虚拟机也都会接入到这个路由器当中,那并且这个 VMware 在主机当中也虚拟出来了一块网卡。这个网卡也接入到了这个虚拟的路由器当中。

2、Dockers 中的网络模式

2.1、Bridge 模式

Docker 默认的网络模式。当你启动一个容器而没有指定网络模式时,它将使用bridge模式。在这种模式下,Docker 会在主机上创建一个名为 docker0 的虚拟网桥,作为容器之间的默认网桥。每个容器都会连接到这个网桥,并获得一个独立的 IP 地址,该地址通常在172.17.x.x192.168.x.x 范围内。

容器可以通过 docker0 网桥与外部网络通信,但这种通信默认情况下需要通过NAT(网络地址转换)进行。这意味着从外部网络访问容器时,必须先映射端口到宿主机。

+---------------------------------------------------+
|                   Host Machine                    |
|                                                   |
|  +------------+       +------------+              |
|  | Container1 |       | Container2 |              |
|  | 172.17.0.2 |       | 172.17.0.3 |              |
|  +-----+------+       +-----+------+              |
|        | vethXXXX           | vethYYYY            |
|        |                    |                     |
|  +-----+--------------------+-------+             |
|  |            docker0               |             |
|  |         (172.17.0.1)             |             |
|  +----------------+-----------------+             |
|                   | eth0                          |
|                   |                               |
+-------------------+-------------------------------+|[Physical Network]
  1. docker0 桥接设备:Docker 创建的虚拟以太网桥
  2. veth pair:虚拟以太网设备对,一端在容器内(显示为 eth0),一端在主机上(连接到 docker0)
  3. iptables NAT 规则:实现容器与外部网络的通信

端口映射:如果你想让外部网络访问容器内的服务,你需要在运行容器时通过-p--publish选项指定端口映射。这样,Docker会设置 iptables 规则,将宿主机上的特定端口流量重定向到容器内的对应端口。

2.2、Host 模式

Host 网络模式是 Docker 中最简单直接的网络模式,容器直接使用宿主机的网络命名空间,与宿主机共享网络栈。在这种模式下,容器不会获得独立的网络环境,而是直接使用主机的 IP 地址和端口。

网络架构原理图:

+-----------------------------------------------------------+
|                        Host Machine                       |
|                                                           |
|   +----------------+     +----------------+               |
|   |   Container A  |     |   Container B  |               |
|   |  (host网络模式) |     |  (host网络模式) |                |
|   +-------+--------+     +-------+--------+               |
|           |                      |                        |
|   +-------+----------------------+--------+               |
|   |            Host Network Stack         |               |
|   |  (eth0, 所有网络接口, 路由表, iptables)  |               |
|   +----------------------------------------+              |
|                                                           |
|   +---------------------+                                 |
|   |   Physical Network  |                                 |
|   |      Interface      |                                 |
|   +---------------------+                                 |
+-----------------------------------------------------------+
  • 容器:在这个例子中,容器直接使用宿主机的网络栈,包括其 IP 地址和端口。这意味着任何在容器中运行的服务都必须确保使用的端口不与宿主机上的现有服务冲突。
  • 宿主机:宿主机提供了一个共享的网络命名空间给容器使用,使得容器可以直接通过宿主机的网络接口进行通信。

生成原理

  1. 共享网络栈:当容器以host模式运行时,它将直接使用宿主机的网络栈,这意味着容器内的网络配置(如IP地址、路由表等)与宿主机完全相同。
  2. 端口冲突风险:由于容器和宿主机共享相同的网络视图,容器中的服务必须小心选择端口号,以免与宿主机上的其他服务发生冲突。例如,如果宿主机上已经有一个服务在80端口运行,那么容器内就不能再有服务尝试绑定到这个端口。
  3. 增强性能:因为没有额外的网络地址转换(NAT)层,host模式下的网络性能通常优于bridge模式。
  4. 减少隔离性:虽然host模式提高了网络性能并简化了网络配置,但它也减少了容器之间的网络隔离。所有容器和宿主机上的服务都在同一个网络环境中,这可能增加安全风险。

2.3、Container 模式

Container 网络模式(也称为"容器共享网络命名空间"模式)是一种特殊的Docker网络模式,它允许一个容器共享另一个容器的网络命名空间。在这种模式下,多个容器共享同一个网络环境,包括 IP 地址、端口范围、网络接口等。

特性

  1. 共享网络栈:当使用container模式时,新启动的容器不会创建自己的网络命名空间,而是复用已经存在的某个容器的网络命名空间。这意味着这两个容器将共享同一个IP地址和端口集合,以及其它网络资源。
  2. 减少隔离性:由于两个容器共享同一个网络环境,这种设置减少了容器之间的网络隔离。因此,这种模式通常用于那些需要在容器之间进行直接通信而无需经过外部网络的情况。
  3. 简化网络配置:因为两个容器共享网络配置,所以在其中一个容器中配置的服务可以直接被另一个容器访问,无需额外的网络配置或端口映射。

网络架构原理图

+-----------------------------------------------------------+
|                        Host Machine                       |
|                                                           |
|   +----------------+                                      |
|   |  Primary       |                                      |
|   |  Container     |                                      |
|   |  (拥有独立网络栈) |                                     |
|   |  172.17.0.2    |                                      |
|   +-------+--------+                                      |
|           | vethXXX                                       |
|   +-------+--------+    +----------------+                |
|   | docker0        |    | Secondary      |                |
|   | 172.17.0.1/16  |    | Container      |                |
|   +-------+--------+    | (共享Primary容器网络)|            |
|           |             | 172.17.0.2     |                |
|   +-------+--------+    +----------------+                |
|   | 物理网络接口     |                                      |
|   | eth0           |                                      |
|   +----------------+                                      |
+-----------------------------------------------------------+

关键特点

  1. 网络栈共享:多个容器共享同一个网络命名空间
  2. IP地址共享:所有共享容器使用相同的IP地址
  3. 端口共享:容器间需要协调端口使用,避免冲突
  4. 隔离性降低:共享网络的容器可以互相访问 localhost 服务

完毕。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/82589.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Netty学习专栏(六):深度解析Netty核心参数——从参数配置到生产级优化

文章目录 前言一、核心参数全景解析1.1 基础网络层参数1.2 内存管理参数1.3 水位线控制1.4 高级参数与系统级优化 二、生产级优化策略2.1 高并发场景优化2.2 低延迟场景优化 总结 前言 在分布式系统和高并发场景中,Netty作为高性能网络通信框架的核心地位无可替代。…

计算机网络学习(六)——UDP

一、UDP UDP(User Datagram Protocol,用户数据报协议)是传输层的一种协议,和 TCP 并列。与 TCP 不同,UDP 是无连接、不可靠、面向报文的协议,它的设计目标是追求更快的数据传输速度和更小的开销。 UDP 为…

vue3文本超出三行显示省略号,点击查看更多显示全部文本

只有一行时&#xff08;不显示展开按钮&#xff09;&#xff1a; 话不多说&#xff0c;上码 ~template <el-col :span"24"><el-form-item :label"$t(warningOrgNames_)"><div class"content-box" ref"contanierRef"…

手写Tomcat(一)

一、Tomcat简介 Tomcat 服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP 程序的首选。 1.1 Tomcat基本架构 Servlet接口文件中定义的方法有以下…

第三节_PySide6中Qt Designer 的基础使用_上篇

文章目录 前言一、Qt Designer简介1.什么是 Qt Designer&#xff1f;2.核心功能3.核心优势 二、Qt Designer界面介绍1.主窗口的创建2.窗口五大区域的简单介绍 三、界面布局 Layout1.窗口布局方式介绍2.UI布局技巧概述3.UI布局实战应用 总结 前言 第二节_PySide6项目创建流程介…

行列式的线性性质(仅限于单一行的加法拆分)

当然可以&#xff0c;以下是经过排版优化后的内容&#xff0c;保持了原始内容不变&#xff0c;仅调整了格式以提升可读性&#xff1a; 行列式的线性性质&#xff08;加法拆分&#xff09; 这个性质说的是&#xff1a;如果行列式的某一行&#xff08;或某一列&#xff09;的所有…

Git使用说明

配置Git 确定已经安装了Git, 通过以下的命令配置全局的邮箱和用户名 git config --global user.email "your@xx.com" git config --global user.name "yourname" 初始化本地仓库 首先,打开终端并切换到存放你代码的项目目录。接着执行以下命令,将该…

【后端高阶面经:缓存篇】36、如何保证Redis分布式锁的高可用和高性能?

一、分布式锁核心挑战:从单机到分布式的跨越 (一)分布式锁的本质需求 互斥性:同一时刻仅一个客户端持有锁容错性:节点故障时锁仍有效(避免单点)原子性:加锁/释放锁操作原子完成可重入性:支持同一客户端多次获取同一把锁(二)Redis天然优势 单线程模型保证操作原子性…

【后端高阶面经:MongoDB篇】40、怎么优化MongoDB的查询性能?

一、索引优化&#xff1a;构建高效查询的基石 &#xff08;一&#xff09;索引类型与适用场景 1. 五大核心索引类型 索引类型适用场景示例代码性能影响单字段索引单条件查询&#xff08;如用户ID、状态字段&#xff09;db.users.createIndex({ user_id: 1 })低复合索引多条件…

Linux wget 常用命令详解

目录 1.1 工具定位 基础下载示例 二、高效下载参数详解 2.1 下载控制类 2.2 文件管理类 2.3 网络优化类 三、高级应用场景 3.1 递归下载与整站镜像 3.2 自动化下载实践 3.3 安全下载配置 四、参数速查手册 4.1 常用参数汇总 1.1 工具定位 基础下载语法 wget [选项…

Pytorch中文文本分类

本文为&#x1f517;365天深度学习训练营内部文章 原作者&#xff1a;K同学啊 将对中文文本进行分类&#xff0c;示例如下&#xff1a; 文本分类流程图 1.加载数据 import time import pandas as pd import torch from torch.utils.data import DataLoader, random_split impo…

13.「极简」扣子(coze)教程 | 小程序UI设计进阶(三)让界面动起来,实操讲透“聚焦”事件

前一期大师兄介绍了扣子平台组件的两种状态“禁用”和“加载”。这两种方法使控件可以通过简单设置表示出更多的运行状态。今天大师兄将详细介绍控件的一种事件“聚焦”。 扣子&#xff08;coze&#xff09;编程 「极简」扣子(coze)教程 | 小程序UI设计进阶 II&#xff01;让…

剑指offer11_矩阵中的路径

矩阵中的路径 请设计一个函数&#xff0c;用来判断在一个矩阵中是否存在一条路径包含的字符按访问顺序连在一起恰好为给定字符串。 路径可以从矩阵中的任意一个格子开始&#xff0c;每一步可以在矩阵中向左&#xff0c;向右&#xff0c;向上&#xff0c;向下移动一个格子。 如…

腾讯2025年校招笔试真题手撕(三)

一、题目 今天正在进行赛车车队选拔&#xff0c;每一辆赛车都有一个不可以改变的速度。现在需要选取速度差距在10以内的车队&#xff08;车队中速度的最大值减去最小值不大于10&#xff09;&#xff0c;用于迎宾。车队的选拔按照的是人越多越好的原则&#xff0c;给出n辆车的速…

《三维点如何映射到图像像素?——相机投影模型详解》

引言 以三维投影介绍大多比较分散&#xff0c;不少小伙伴再面对诸多的坐标系转换中容易弄混&#xff0c;特别是再写代码的时候可能搞错&#xff0c;所有这篇文章帮大家完整的梳理3D视觉中的投影变换的全流程&#xff0c;一文弄清楚这个过程&#xff0c;帮助大家搞清坐标系转换…

Ini配置文件读写,增加备注功能

1.增加备注项写入 例: #节点备注 [A] #项备注 bbb1 ccc2 [B] bbb1 IniConfig2 ic new IniConfig2(); //首次写入 if (!ic.CanRead()) { ic.AddSectionReMarke("A", "节点备注"); ic.SetValue("A&qu…

OpenHarmony 5.0中状态栏添加以太网状态栏图标以及功能实现

目录 1.前置条件 2.方案 1.前置条件 首先以太网接口是有问题的,如下按照如下流程将以太网接口进行修复 OpenHarmony 以太网卡热插拔事件接口无效-CSDN博客 然后上述的接口可以了就可以通过这个接口获取以太网是否连接状态 要注意wifi连接的干扰和预置虚拟网口干扰 2.方案…

RNN GRU LSTM 模型理解

一、RNN 1. 在RNN中&#xff0c; 2. RNN是一个序列模型&#xff0c;与非序列模型不同&#xff0c;序列中的元素互相影响&#xff1a; 是由 计算得来的。 在前向传播中&#xff1a; 用于计算 和 用于计算 和 因此&#xff0c;当进行反向链式法则求导时候&#xf…

多路径传输(比如 MPTCP)控制实时突发

实时突发很难控制&#xff0c;因为 “实时” 和 “突发” 相互斥。实时要求避免排队&#xff0c;而突发必然要排队&#xff0c;最终的解决方案都指向找一个公说公有理&#xff0c;婆说婆有理的中间点&#xff0c;这并没解决问题&#xff0c;只是权衡了问题。 这种局部解决问题的…

函数式编程思想详解

函数式编程思想详解 1. 核心概念 不可变数据 (Immutable Data) 数据一旦创建&#xff0c;不可修改。任何操作均生成新数据&#xff0c;而非修改原数据。 优点&#xff1a;避免副作用&#xff0c;提升并发安全&#xff0c;简化调试。 Java实现&#xff1a;使用final字段、不可变…