详解 Macvlan 创建不同容器独立跑仿真(持续更新中)

一、概念介绍

1.1 什么是macvlan

        macvlan是一种网卡虚拟化技术,能够将一张网卡(Network Interface Card, NIC)虚拟出多张网卡,这意味着每个虚拟网卡都能拥有独立的MAC地址和IP地址,从而在系统层面表现为完全独立的网络接口。这些虚拟网卡可以直接连接到物理网络,就像是网络中单独的物理设备一样,而不像传统的网络桥接或VLAN那样需要一个共同的桥接接口来转发流量。可以简单理解为macvlan是docker容器中的一种网络模式,可以让容器直接连接到宿主机的物理网络。

1.2 什么是docker容器

        Docker容器是一种轻量级、可移植的软件封装技术,它允许开发者将应用程序及其所有的依赖包打包到一个独立的、可运行的包中。这个包可以在任何安装了Docker引擎的系统上运行,无论该系统是在开发、测试还是生产环境中,保证了应用运行环境的一致性。Docker容器利用操作系统的Namespace和Control Groups等技术,实现了资源的隔离和限制,使得每个容器都像是运行在一个独立的系统中,但实际共享着宿主机的内核。

1.3docker容器与虚拟机对比

  • 资源消耗:虚拟机运行在宿主机上的虚拟化层(如Hypervisor)上,每个虚拟机都需要自己的操作系统,这导致较高的资源开销。相比之下,容器直接运行在宿主机的操作系统上,共享宿主机的内核,因此资源消耗小得多。
  • 启动速度:容器由于不需要启动完整的操作系统,其启动速度远远快于虚拟机。
  • 隔离程度:虚拟机提供了更强的隔离性,每个虚拟机都有自己的硬件虚拟化层,包括CPU、内存、硬盘等,而容器共享宿主机的硬件资源,隔离性相对较弱,但通过命名空间和控制组仍能有效隔离。
  • 灵活性与便携性:容器镜像体积小,便于在网络上分发和快速部署,更适合动态扩缩容和快速迭代的开发模式。
  • 适用场景:虚拟机更适合需要高度隔离或需要运行完全不同操作系统环境的场景,而容器则更适合微服务架构、快速部署、轻量级隔离的场景。

1.4 docker的五种网络模式

Bridge (桥接模式)  ---默认模式

解释:Bridge模式是Docker的默认网络配置。每个使用此模式的容器都会得到一个独立的Network Namespace,Docker会为容器分配一个内部IP地址,并将其连接到一个名为docker0的虚拟网桥上。这意味着容器间可以相互通信,同时也能够通过宿主机的网络栈访问外部网络。

适用情况:当你需要容器之间能够直接通信,且容器需要访问互联网或者被外部网络访问时,使用Bridge模式最为常见。

Host (主机模式)

解释:在Host模式下,容器不会获得自己的Network Namespace,而是直接使用宿主机的网络堆栈。这意味着容器将共享宿主机的网络接口和端口,容器内的网络服务可以直接使用宿主机的IP地址和端口号对外提供服务。

适用情况:如果你的应用需要直接绑定到宿主机的网络接口,或者需要极低的网络延迟,可以考虑使用Host模式。但需要注意,这样做可能会导致安全风险和端口冲突问题。

None (无网络模式)

解释:None模式下,Docker不会为容器配置任何网络设施,容器将只有一个lo(loopback)接口,无法访问外部网络,也无法和其他容器通信,除非你手动配置网络。

适用情况:如果你的容器不需要网络连接,或者你计划完全自定义网络配置(例如,使用自定义网络接口或复杂的网络拓扑),可以选择None模式。

Container (容器模式)

解释:这种模式允许一个容器共享另一个容器的Network Namespace,而不是创建新的或使用宿主机的。这意味着两个容器将共享相同的网络配置,包括IP地址和端口空间。

适用情况:当多个容器需要共享相同的网络环境时,比如在Kubernetes中的Pods,所有容器需要共享同一套网络资源和配置时,这种模式非常有用。

Macvlan (MAC VLAN 模式) 

Macvlan 是一种网络虚拟化技术,允许在单个物理网络接口上创建多个虚拟以太网接口(每个都有独立的MAC地址),这些虚拟接口可以直接连接到物理网络,仿佛是直接连接到交换机上的独立物理设备。在 Docker 中使用 macvlan 模式,可以为每个容器提供一个直接与物理网络相连的网络接口,绕过 Docker 默认的网络桥接,从而获得更低的网络延迟和更接近物理机的网络行为。这种模式非常适合需要直接与外部网络交互,且要求低延迟或特定网络配置的场景。

二、 Docker的安装与使用

2.1  Docker的安装

安装教程:https://docker-practice.github.io/zh-cn/install/ubuntu.html

安装完后一定要添加镜像源:

比如我在广州或东莞:

{

      "registry-mirrors": ["https://cn-guangzhou.mirror.aliyuncs.com"]

 基础操作:

nano daemon.json  #进入文件,文件不存在时自动创建

ctrl + o  保存文件           ctrl + x 退出文件            rm -i 文件名   #删除文件

mkdir  目录名  #创建目录                   rmdir  目录名  #删除目录

更改文件前建议备份文件:

  • cp example.txt example.txt.backu       #假设要编辑的文件名为example.txt,cp命令创建一个副本
  • mv example.txt.backup example.txt    #如果修改后的文件已经保存,你可以直接用mv将备份文件覆盖回去
  • diff example.txt.example.txt.backup   #如果你不确定是否需要完全恢复,或者想查看具体哪些地方发生了变化,可以使用diff命令比较两个文件的差异,然后手动决定如何修改。

安装完上面后再拉取镜像 

docker pull ubuntu  #获取Ubuntu的最新长期支持版本(LTS)

docker pull ubuntu:20.04 #如果你需要特定版本,比如10.04

2.1.1 相关知识了解

   daemon.json是Docker守护进程(dockerd)的配置文件,它允许系统管理员自定义Docker守护程序的行为和参数。这个文件通常位于/etc/docker/目录下,并且在Docker Engine 1.12及更高版本中可以被使用。docker服务使用 systemctl start docker 命令启动失败时,考虑daemon.json的配置是否正确。

作用:

  1. 网络配置:通过daemon.json,你可以配置Docker的网络设置,比如桥接网络的子网、网关等。

  2. 日志记录:配置Docker日志的驱动、日志级别以及日志输出目标,比如将日志发送到syslog或文件系统。

  3. 存储驱动:选择或修改Docker使用的存储驱动(如overlay2、aufs等),这对于容器的存储性能和管理非常重要。

  4. 镜像加速:对于中国用户而言,可以在该文件中配置镜像加速器地址,以加快从Docker Hub拉取镜像的速度。

  5. 注册表镜像认证:配置私有注册表的认证信息,使得Docker守护进程能够无需交互式输入凭据就能拉取私有镜像。

  6. TLS配置:设定Docker守护进程的TLS加密和证书路径,增强Docker API的安全性。

  7. 资源限制:例如内存、CPU使用限制,可以在这里全局设置Docker容器可使用的最大资源量。

  8. live-restore:设置容器在Docker守护进程重启时不退出,保持容器持续运行。

  9. 其他高级选项:包括IPv6支持、容器默认的隔离技术、容器标签策略等。

2.2 Docker的基础使用命令

查看信息   --------------------------------------------------------------------------docker ps   # 查看正在运行的容器
docker ps -a   # 查看所有容器#查看容器相关信息(推荐使用这个)
#打印网络名称、容器名称、主机名及对应的IP地址
docker inspect --format '{{range $key, $value := .NetworkSettings.Networks}}{{$key}}: {{$.Name}} - {{$.Config.Hostname}} - {{$value.IPAddress}}{{println}}{{end}}' 容器名/ID#查看存在的网络
docker network ls#查看某个网络下连接的容器
docker network inspect 网络名或ID#查看容器连接的网络
docker inspect  容器名/IDip addr show #列出系统中所有网络接口,包括IP地址、子网掩码、广播地址、网络接口的状态ip route #展示系统的路由表。路由表是决定数据包在网络中如何转发删除    ------------------------------------------------------------------------------#将容器从指定网络断开
docker network disconnect my_network my_container#删除网络(无容器连接时才可删除)
docker network rm my_network -f  (-f表示强制删除)#删除容器
docker rm  容器名/ID      #(正在运行容器不能删除,除非加-f选项)进入和退出容器   ------------------------------------------------------------------------#进入容器前要先启动
docker start 容器名/ID       #启动容器
docker restart 容器名/ID       #重启容器
docker stop 容器名/ID         #停止正在运行的容器# 进入容器,推荐exec        进入容器前要先启动容器
docker attach  容器名/ID  #使用attach进入后退出,容器停止运行
docker exec -it 容器名/ID /bin/bash  #使用exec进入后退出,容器不会停止
docker exec -it 容器名/ID bash# 退出容器
exit    #直接退出
crlt + P 再按 ctrl + Q     #退出容器但是不终止运行docker相关服务   ------------------------------------------------------------------------
systemctl start docker   #启动服务
systemctl status docker   #查看状态  active(runing)表示已启动
systemctl stop docker   #停止服务ubuntu防火墙  ---------------------------------------------------------------------------
sudo ufw status  #查看防火墙状态,inactive是关闭,active是开启
sudo ufw enable  #开启防火墙
udo ufw disable  #关闭防火墙

三、创建macvlan网络连接的容器

3.1 创建macvlan网络

        创建容器时必须选择连接一个网络,如果不选择就是默认桥接模式brideg,可以使用docker network ls查看目前存在的网络。

sudo docker network create \--driver macvlan \--subnet=<你的宿主机子网,如192.168.0.0/24> \--gateway=<你的宿主机网关> \-o parent=物理接口名称,如ens33 \net-1

 参数介绍:

  •  --driver macvlan:指定网络类型为macvlan。
  • --subnet:192.168.1.0/24表示容器将会从这个子网范围内分配IP地址
  • --gateway: 通过宿主机网关容器知道如何路由到外部网络
  • -o parent: 指定macvlan网络将绑定到宿主机的哪个物理网络接口
  • net-1: 这个是你创建的网络名称

 3.2 查询创建网络时候的相关信息

docker network ls   #显示所有网络,如net-1

 ip addr  #查看所有网络接口的详细信息       ifconfig也可以

 查询信息如下列所示:

  我的物理网络接口为ens33,所以接口的IP地址配置显示为192.168.1.100/24。这里的/24就是子网掩码的CIDR表示形式,意味着网络部分有24个二进制的1,即子网掩码为255.255.255.0。因此,从这个输出中可以看出,该接口配置在一个子网为192.168.1.0/24的网络中,一般来说默认网关就是你的ip地址,比如这里的192.168.1.100。如果不确定则按下面步骤查询。

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic ens33valid_lft 3444sec preferred_lft 3444sec

ip route  #查看路由表,网关,其中包括了目标网络、网关、接口、标志以及路由的优先级等信息。路由表来决定数据包应当通过哪个接口(网络接口卡,如 Ethernet 卡)以及下一跳的IP地址(通常是网关)来转发数据。

default via [网关IP] dev [网络接口名称] proto [协议] metric [数值]
  • [网关IP]:这部分显示的就是你的默认网关地址。
  • [网络接口名称]:表示数据包将通过哪个网络接口发送到默认网关。
  • [协议]:可能是dhcp, static, kernel, boot等,表示路由设置的来源。
  • [数值]:metric值,用于衡量路径的优先级,数值越小优先级越高。 

3.3 创建一个docker容器

sudo docker run -itd \--name container-1 \--network=net-1 \--ip=192.168.0.61  \-v /home/norten/Public/tools:/mnt \ubuntu

  参数介绍:

  • -i: 表示以交互模式运行容器,即使没有连接到终端也会保持STDIN(标准输入)打开
  • -t: 为容器分配一个伪TTY(虚拟终端),这使得它看起来更像是一个交互式会话
  • -d: 表示以后台模式运行容器(守护进程模式),你不会直接看到容器的输出,但容器会在后台持续运行
  • --name container-1: 为新创建的容器指定一个名称
  • --network=net-1: 指定容器要加入的网络名为net-1
  • --ip=192.168.0.61: 为容器指定了一个固定的IP地址
  • -v /home/norten/Public/tools:/mnt: 使用卷挂载功能,将宿主机的/home/norten/Public/tools目录挂载到容器内的/mnt目录
  • ubuntu: 这是告诉Docker使用ubuntu镜像作为基础来创建容器

需要注意的是:

  1. 容器要先使用docker start [容器名称] 命令启动后才能够进入容器内部
  2. 可以使用dokcer ps查看所有正在运行的容器,docker ps -a显示所有存在的容器
  3. 使用docker exec -it [容器名称] bash 进入容器后,使用exit退出时容器仍正常运行
  4. 使用docker attach [容器名称] 进入容器后,使用exit退出容器则容器停止运行
  5. 可以使用docker inspect [网络名称] 查看该网络所有相关的信息
  6. 可以使用docker inspect [容器名称] 查看该容器所有相关的信息,如以下图片所示

Mounts: 

Networks: 

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

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

相关文章

winmail添加gmail和QQ邮箱(现已更新为outlook mail)

想在windows自带的邮件桌面应用里&#xff0c;不仅能访问outlook邮件&#xff0c;也能访问gmail邮件和QQ邮件的方法。 参考文章&#xff1a; Windows 10 的邮件怎么添加并同步 Gmail&#xff1f;​www.zhihu.com/question/53079836/answer/147669935?utm_psn178781450843941…

个人成长的利器:复盘教你如何避免重蹈覆辙

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 最近忙着学习和工作&#xff0c;更新比较少&#xff0c;期间一直在思考如何才能快速…

如何使用Gau针对任意指定域名执行URL收集任务

关于Gau Gau是一款功能强大的URL收集工具&#xff0c;该工具可以针对任意指定的域名&#xff0c;从AlienVault的开放威胁交换器、Wayback Machine、Common Crawl平台和URLScan收集并爬取已知的URL地址。 Gau&#xff0c;全称为GetAllUrls。该工具灵感来源于Tomnomnom的wayback…

【Linux】进程间通信_1

文章目录 七、进程间通信1. 进程间通信分类管道 未完待续 七、进程间通信 进程间由于 进程具有独立性 &#xff0c;所以不可以直接进行数据传递。但是我们通常需要多个进程协同&#xff0c;共同完成一件事&#xff0c;所以我们需要进程间通信的手段。进程间通信的本质就是先让…

WordPress视频主题Qinmei 2.0

WordPress视频主题Qinmei 2.0&#xff0c;简单漂亮的WP视频站源码 主题功能 可以根据豆瓣ID直接获取到其他详细信息&#xff0c;省去慢慢填写的痛苦&#xff1b;播放器支持直链&#xff0c;解析&#xff0c;m3u8格式&#xff0c;同时解析可匹配正则自动更改&#xff1b;新增动…

2024全国各地高考录取分数线一览表(含一本、二本、专科)

2024年高考录取分数线陆续公布&#xff0c;上大学网(www.sdaxue.com)为大家整理全国31个省市高考录取分数线汇总&#xff0c;包括本科批、专科批和特殊类招生控制分数线汇总&#xff0c;来看看你的省份多少分能上大学吧。 一、2024年全国高考录取线一览表 1、宁夏 一本线&…

Java开发-面试题-0007-GPT和MBR的区别

Java开发-面试题-0007-GPT和MBR的区别 更多内容欢迎关注我&#xff08;持续更新中&#xff0c;欢迎Star✨&#xff09; Github&#xff1a;CodeZeng1998/Java-Developer-Work-Note 技术公众号&#xff1a;CodeZeng1998&#xff08;纯纯技术文&#xff09; 生活公众号&#…

大模型参数高效微调学习笔记

大模型参数高效微调学习笔记 github地址 billbill链接 1.分类 图中有五个大类&#xff1a; selective&#xff08;选择性微调&#xff09;&#xff1a;BitFit&#xff0c;Attention Tuningsoft prompts&#xff08;提示微调&#xff09;&#xff1a;Prompt-tuning&#xff0c…

Selenium进行Web自动化测试

Selenium进行Web自动化测试 SeleniumPython实现Web自动化测试一、环境配置 SeleniumPython实现Web自动化测试 一、环境配置 环境基于win10&#xff08;X64&#xff09; 安装Python&#xff1b;安装PyCham安装chomedriver chomedriver下载地址 可以查看本地chrome软件版本下载…

项目-博客驿站测试报告

测试用例设计 功能测试 该部分主要围绕对于博客系统的增删改查, 文章通过性审核, 关注功能等进行测试, 还进行了其它一些探索性的测试. 以上是作者设计的全部用例. BUG发现: 问题1: 当多端同时操作同一篇文章BUG 环境: Windows11, Edge和Chrome浏览器 复现步骤: 1.先使用Edg…

基于协方差信息的Massive MIMO信道估计算法性能研究

1. 引言 随着移动互联网不断发展&#xff0c;人们对通信的速率和可靠性的要求越来越高[1]。目前第四代移动通信系统已经逐渐商用&#xff0c;研究人员开始着手研究下一代移动通信系统相关技术[2][3]。在下一代移动通信系统中要求下行速率达到10Gbps&#xff0c;这就要求我们使…

BFS:解决多源最短路问题

文章目录 什么是多源最短路问题&#xff1f;1.矩阵2.飞地的数量3.地图的最高点4.地图分析总结 什么是多源最短路问题&#xff1f; 多源最短路问题&#xff08;Multi-Source Shortest Path Problem&#xff0c;MSSP&#xff09;是图论中的一个经典问题&#xff0c;它的目标是在…

支付系统的渠道路由架构设计

图解支付系统的渠道路由设计 渠道路由是引导流量路径的关键&#xff0c;其设计至关重要。本文详解渠道路由概念、必要性及形态&#xff0c;并分享一个高效实用的基于规则的渠道路由设计方案。 注&#xff1a;有些公司称渠道为通道&#xff0c;都是一个意思&#xff0c;为方便起…

【React】ref

概述 使用 ref 引用值 – React 中文文档 希望组件“记住”某些信息&#xff0c;但又不想让这些信息更新时 触发新的渲染 时&#xff0c;可以使用 ref 。 也就是说 ref 对象 包裹的值 React 追踪不到的&#xff0c;他像是用来存储组件信息的秘密“口袋”。 与 state 相同的是…

基于uni-app和图鸟UI开发上门服务小程序

一、技术栈选择 uni-app&#xff1a;我们选择了uni-app作为开发框架&#xff0c;因为它基于Vue.js&#xff0c;允许我们编写一次代码&#xff0c;发布到多个平台&#xff0c;包括iOS、Android、Web以及各种小程序。uni-app的丰富组件库、高效的状态管理以及便捷的预览调试功能&…

【PL理论深化】(3) MI 归纳法:归纳假设 (IH) | 结构归纳法 | 归纳假设的证明

&#x1f4ac; 写在前面&#xff1a;所有编程语言都是通过归纳法定义的。因此&#xff0c;虽然编程语言本身是有限的&#xff0c;但用该语言编写的程序数量是没有限制的&#xff0c;本章将学习编程语言研究中最基本的归纳法。本章我们继续讲解归纳法&#xff0c;介绍归纳假设和…

【论文阅读】场景生成及编辑3D定位论文阅读

<div id"content_views" class"htmledit_views" style"user-select: auto;"><div class"kdocs-document"> 前置知识 归纳偏置 关于归纳偏置的理解&#xff1a;首先推荐一篇解释归纳偏置非常好的博客&#xff1a;浅谈归纳…

STM32学习 修改系统主频

前面时钟树的学习说明单片机的主频是可以修改的&#xff0c;那么怎么更改系统的主频&#xff0c;这里做一个简单的介绍。首先要明白&#xff0c;单片机的程序是如何运行&#xff0c;这里简单说明一下。 对应的代码在startup_stm32....文件里面&#xff0c;这里是复位程序的汇编…

多分类情绪识别模型训练及基于ChatGLM4-9B的评论机器人拓展

你的下一个微博罗伯特何必是罗伯特 这是一篇我在使用开源数据集(Twitter Emotion Dataset (kaggle.com))进行情绪识别的分类模型训练及将模型文件介入对话模型进行应用的过程记录。当通过训练得到了可以输入新样本预测的模型文件后&#xff0c;想到了或许可以使用模型文件对新样…

JavaScript的学习之旅之初始JS

目录 一、认识三个常见的js代码 二、js写入的第二种方式 三、js里内外部文件 一、认识三个常见的js代码 <script>//写入js位置的第一个地方// 控制浏览器弹出一个警告框alert("这是一个警告");// 在计算机页面输入一个内容&#xff08;写入body中&#xff…