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

2024-06-23 14:36

本文主要是介绍详解 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: 

这篇关于详解 Macvlan 创建不同容器独立跑仿真(持续更新中)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1087437

相关文章

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

MySQL中的锁机制详解之全局锁,表级锁,行级锁

《MySQL中的锁机制详解之全局锁,表级锁,行级锁》MySQL锁机制通过全局、表级、行级锁控制并发,保障数据一致性与隔离性,全局锁适用于全库备份,表级锁适合读多写少场景,行级锁(InnoDB)实现高并... 目录一、锁机制基础:从并发问题到锁分类1.1 并发访问的三大问题1.2 锁的核心作用1.3 锁粒度分

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁