详解 Macvlan 创建不同容器独立跑仿真

news2024/10/24 20:15:59

一、概念介绍

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.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  容器名/ID
 
ip 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网络将绑定到宿主机的哪个物理网络接口

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

 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 1000
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic ens33
       valid_lft 3444sec preferred_lft 3444sec

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

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

创建一个docker容器

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

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

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

相关文章

基于欧式距离的匈牙利匹配跟踪器(C++)

文章目录 介绍参考repo修改后的效果修改后的代码使用方法介绍 基于欧式距离的匈牙利匹配跟踪器是一种在目标跟踪领域常用的算法。它通常用于解决多目标跟踪中的匹配问题,其中需要将当前帧中的检测目标与上一帧中已知的目标进行匹配。 算法步骤大致如下: 特征提取:对检测到…

Vue快速上手和Vue指令

一、Vue快速上手 1、Vue概念 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套构建用户界面的渐进式框架 Vue2官网&#xff1a;https://v2.cn.vuejs.org/ 构建用户界面&#xff1a;基于数据渲染出用户可以看到的界面 渐进式&#xff1a; 循序渐进&#xff0c;不一定非得把…

docker容器网络与宿主机网络冲突的原因与解决方案

一、故障现象 在用docker-compos.yaml文件或者手动创建docker网络时&#xff0c;可能会出现新建的容器网络与宿主机网络冲突&#xff0c;导致SSH远程连接中断&#xff0c;并无法再用Xshell等远程连接工具连接宿主机。现象如下&#xff1a; [rootcontroller ~]# docker networ…

LeRobot——Hugging Face打造的机器人领域的Transformer架构

前言 如友人邓博士所说&#xff0c;“用 Stanford aloha 课题组提供的训练数据&#xff0c;训练他们研发的 Action Chunking Transformer 动作规划模型&#xff0c;训练结果&#xff0c;能用&#xff0c;但是稳定性有待提高 要提高稳定性&#xff0c;看来必须修改 Stanford a…

web安全渗透测试十大常规项(一):web渗透测试之PHP反序列化

渗透测试之PHP反序列化 1. PHP反序列化1.1 什么是反序列化操作? - 类型转换1.2 常见PHP魔术方法?- 对象逻辑(见图)1.2.1 construct和destruct1.2.2 construct和sleep1.2.2 construct和wakeup1.2.2 INVOKE1.2.2 toString1.2.2 CALL1.2.2 get()1.2.2 set()1.2.2 isset()1.2.2…

Js-w3school(2024(1)

10.访问 HTML 元素 使用“不整洁的” HTML 样式的后果&#xff0c;也许是导致 JavaScript 错误。请在 HTML 中使用相同的命名约定&#xff08;就像 JavaScript 那样&#xff09; 11. 请使用正确的文档类型 请始终在文档的首行声明文档类型&#xff1a; 如果您一贯坚持小写标…

数据结构之B数

目录 1.概述 2.特点 3.诞生 4.优缺点 4.1.优点 4.2.缺点 5.应用场景 6.C语言中的B树实现例子 7.总结 1.概述 B树&#xff08;B-tree&#xff09;是一种自平衡的树数据结构&#xff0c;广泛应用于数据库和文件系统中&#xff0c;以便高效地进行顺序读取、写入以及查找…

南京邮电大学计算机网络实验一(网络操作系统的安装与配置)

文章目录 一、 实验目的和要求二、 实验环境(实验设备)三、 实验原理和步骤四、 实验小结&#xff08;包括问题和解决方法、心得体会、意见与建议等&#xff09;&#xff08;一&#xff09;问题和解决方法&#xff08;二&#xff09;心得体会&#xff08;三&#xff09;意见与建…

osgearth提示“simple.earth: file not handled”

在用vcpkg编译完osg和osgearth后&#xff0c;为了验证osgearth编译是否正确&#xff0c;进行测试&#xff0c;模型加载代码如下&#xff1a; root->addChild(osgDB::readNodeFile("simple.earth")); 此时以为是simple.earth路径的问题&#xff0c;遂改为以下代码…

AI交互数字人如何赋能数智教育?

随着AI交互数字人技术的飞速发展&#xff0c;教育领域正经历着前所未有的变革。AI交互数字人为教育领域注入了全新活力&#xff0c;重塑着教学模式&#xff0c;为学生带来沉浸式学习体验。 AI交互数字人在教育领域中&#xff0c;可以应用在&#xff1a; 1、个性化学习教学指导…

不适合编程的人是怎样的?

你知道不适合编程的人是怎样的吗&#xff1f;其实&#xff0c;对编程没有兴趣的人往往都不适合从事编程工作。编程并非是一项轻松简单的任务&#xff0c;它需要投入大量的时间和精力。 编程领域有其独特的特点和要求。首先&#xff0c;编程有着相当陡峭的学习曲线。从最基础的语…

分布式锁三种方案

基于数据库的分布式锁&#xff08;基于主键id和唯一索引&#xff09; 1基于主键实现分布式锁 2基于唯一索引实现分布式锁 其实原理一致&#xff0c;都是采用一个唯一的标识进行判断是否加锁。 原理&#xff1a;通过主键或者唯一索性两者都是唯一的特性&#xff0c;如果多个…

二开的精美UI站长源码分享论坛网站源码 可切换皮肤界面

二开的精美UI站长源码分享论坛网站源码 可切换皮肤界面 二开的精美UI站长源码分享论坛网站源码 可切换皮肤界面

如何使用React的lazy和Suspense来实现代码分割?

在React中&#xff0c;使用React.lazy和Suspense可以方便地实现组件的代码分割。代码分割是一种优化技术&#xff0c;它将代码拆分成多个包&#xff0c;然后按需加载这些包&#xff0c;从而加快应用的初始加载时间。下面是如何使用这两个API的基本步骤&#xff1a; 使用React.l…

24上软考成绩预计6月底公布?附查分指南

最近&#xff0c;很多小伙伴都在问上半年成绩什么时候出来&#xff1f;每天学习群变成了祈祷群&#xff0c;都在祈祷45,45,45。按照上一次的成绩发布时间&#xff0c;从考试结束到成绩发布&#xff0c;间隔了32天。这次是不是会更快&#xff1f; 一般阅卷只要7-10天&#xff0c…

深入探究RTOS的IPC机制----邮箱

阅读引言&#xff1a; 因为将来工作需要&#xff0c; 最近在深入学习OS的内部机制&#xff0c;我把我觉得重要的、核心的东西分享出来&#xff0c; 希望对有需要的人有所帮助&#xff0c; 阅读此文需要读友有RTOS基础&#xff0c; 以及一些操作系统的基础知识&#xff0c; 学习…

基于SSM+Jsp的书店仓库管理系统

摘要&#xff1a;仓库作为储存货物的核心功能之一&#xff0c;在整个仓储中具有非常重要的作用&#xff0c;是社会物质生产的必要条件。良好的仓库布局环境能够对货物进入下一个环节前的质量起保证作用&#xff0c;能够为货物进入市场作好准备&#xff0c;在设计中我们根据书店…

Vue与SpringSecurity认证整合-06

Vue与SpringSecurity整合 我们要知道springsecurity是一个安全框架,我们在后端的时候没有接触前端,springsecurity引入依赖之后,启动项目会对我们进行拦截,让我们登录,然后我们制定了一个登录页面,也是后端的,我们可以指向我们的登录页面,但是与Vue整合之后,登录页面肯定是在Vu…

【JavaScript复习二】选择结构if和Switch(1)

### []( )2、单分支条件分支语句if (条件表达式) { // 条件为真时&#xff0c;做的事情 } else { // 条件为假时&#xff0c;做的事情 } ### []( )2,、多分支的 if 语句if (条件表达式1) { // 条件1为真时&#xff0c;做的事情} else if (条件表达式2) { // 条件1不满足&…

打造完美启动页:关键策略与设计技巧

启动页&#xff08;Splash Screen&#xff09;设计是指在应用程序启动时&#xff0c;首先展示给用户的界面设计。这个界面通常在应用加载或初始化期间显示&#xff0c;其主要目的是为用户提供一个视觉缓冲&#xff0c;展示品牌标识&#xff0c;并减少用户在等待过程中的焦虑感。…