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

【容器固化】 OS技术之OpenStack容器固化的实现原理及操作

1. Docker简介

要学习容器固化,那么必须要先了解下Docker容器技术。Docker是基于GO语言实现的云开源项目,通过对应用软件的封装、分发、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”。这里的应用软件,既可以是一个Web应用,也可以是一套数据库服务,甚至是一个操作系统或编译器。Docker基于Linux的多项开源技术提供了高效、敏捷和轻量级的容器方案,并且支持在多种主流平台(PaaS)和本地系统上部署。
Docker容器技术有效地将由单个操作系统管理的资源划分到孤立的组中,以便更好地在孤立的组之间平衡有冲突的资源使用需求。每个容器内运行一个应用,不同的容器相互隔离,容器之间也可以建立通信机制。容器的创建和停止都十分快速,容器自身对资源的需求也十分有限,远远低于虚拟机。

1.1 Docker的核心价值

它改变了传统的软件“交付方式”和“运行方式”。传统交付源码或者软件包的方式的最大问题在于,软件运行期间的“依赖环境”无法控制,不能标准化,IT开发和运维人员需要花费大量精力去解决“依赖环境”问题。而Docker将软件及其“依赖环境”打包到一起,以镜像的方式交付,让软件运行在“标准环境”中,非常符合云计算的需求。另外,Docker秒级创建及删除应用和动态调整资源的能力,也非常符合云计算“实例水平扩展,资源动态调整”的需求。

1.2 Docker的应用场景及组件

Web应用的自动化打包和发布;自动化测试和持续集成、发布;在服务型环境中部署和调整数据库或其他的后台应用。Docker组件包括Docker容器、仓库和镜像,容器是Docker的核心组件,负责Docker实例的运行,仓库分公共仓库(Docker hub)和私有仓库,用于Docker镜像的存放和分发,Docker镜像是容器运行时的只读模板。Docker采用Linux技术,所以只能运行在Linux上。

1.3 Docker相关命令

 查看H3Cloud OS大云平台使用容器进程的运行状态:
输入命令docker ps ,如下图所示,输出显示的第一列为容器的UUID信息,第二列为容器的镜像名称,第四列为容器进程创建时间,第五列为容器运行状态显示已运行的时长。
在这里插入图片描述

 进入容器:
输入命令docker exec –it <容器UUID> /bin/bash,其中容器的UUID可以只输入前三位。
在这里插入图片描述

 查看H3Cloud OS主机名:
输入命令hostname,此时输出的即是主机名。
在这里插入图片描述

 进入H3Cloud OS控制节点或计算节点容器后,查看openstack相关进程服务的状态,需要先执行加载环境变量,用于openstack内部组件间授权,执行命令:source /root/admin-openrc.sh。
在这里插入图片描述

 在计算节点容器内查看nova进程状态:
执行命令nova service-list
在这里插入图片描述

 手动停止和启动nova服务操作
执行命令systemctl start openstack-nova-conductor.service
在这里插入图片描述

2. 为什么需要进行固化操作

在容器中,镜像是只读的,不可写,当需要修改时会在镜像上增加一个可写层,写修改发生在可写层里,修改后形成整个新的容器,原镜像还是没有变,即在原镜像之外“包装”不同的可写层的新内容做固化。容器固化是一套方法,用于当容器中文件或内容需要修改发生变化时,将修改的内容固定下来,避免容器重建时修改的内容又还原了。

3. 固化的原理

其核心原理是通过dockfile新建镜像,从而将更改的内容放到新镜像里,然后再通过新镜像启动容器。Docker采用写时复制方式创建根文件系统,可以简单理解为如果有相同内容的文件或者镜像,使用这些资源的不同实例在没有对它们做任何修改的时候是不需要复制的,也就是说不需要创建新的资源来使用,当第一次修改发生时,这个时候再复制出新的资源,修改的内容放置于新的资源中。这样一来部署就会变得极其快捷,并且节省内存和硬盘空间。固化并没有对原始镜像做修改,镜像是不能修改的,只是在镜像的只读层(容器)修改。由于在重启虚机或销毁docker的情况下,会在原始镜像的基础上重新生成一个新的容器,从而我们修改的效果没有生效,因此进行固化操作来达到保存修改的效果。

4. 固化的步骤

容器固化流程图见下:
在这里插入图片描述

4.1 备份当前镜像

输入命令docker ps | grep cloudos-openstack来查看关键字为cloudos-openstack的容器,找到相应容器的id,输入命令docker images|grep openstack查看需要操作的镜像。
在这里插入图片描述

备份镜像:tag命令来为镜像打上标签,实际上就是备份的过程。
在这里插入图片描述

4.2 删除原镜像

使用docker rmi命令来删除原镜像。
在这里插入图片描述

此时查看镜像列表,已经没有原镜像了。
在这里插入图片描述

4.3 重新制作镜像

重新制作镜像前先登入openstack docker容器中,将pre-install.sh拷贝到/opt/openstack-transfer/中,接下来要修改pre-install.sh文件。
在这里插入图片描述

修改pre-install.sh是为了新建dockerfile并新建容器,因此需要从之前容器中退出在设备层操作。拷贝/opt/openstack-transfer/pre-install.sh到/root/eventually目录下,如果该目录不存在需要在/root路径下执行命令mkdir eventually来创建目录。注意不能在不存在相应路径的情况下直接执行命令cp 命令,否则会把pre-install.sh复制到/root路径下并且重命名为eventually。
说明:涉及镜像等与CloudOS有关的配置都需要修改pre-install.sh文件,其他如新建.txt文件这样的配置则无需修改该文件。
拷贝完成后就可以编辑vim /root/eventually路径下的pre-install.sh文件了。按照要求将firewall_type修改为GATEWAY,将lb_type参数修改为SERVICE_CHAIN,将resource_mode修改为NFV。
在这里插入图片描述

开始重新制作镜像:已经在/root/eventually/路径下做了以上修改,接着继续在这个路径下通过命令vi dockerfileopenstackbuild.txt创建一个文件。
在这里插入图片描述

创建dockerfile文件是为了以docker build来创建镜像,这是创建镜像的方法之一,目前用得最多,CloudOS也用这个。其他的方法还有通过容器创建来使用docker commit命令构建镜像,简单来讲就是先创建好一个容器,然后把它转为镜像。
进入文件进行编辑:首行FROM cloudos-openstack:E1137H10_twins表示以cloudos-openstack:E1137H10_twins镜像为基础启动容器,注意首行必须以FROM开始且行首行末都不能有空格,支持以#开头的注释行。第二行命令USER root表示用户身份为root。第三行命令是对基础镜像的调整变更,这里的意思是将pre-install.sh拷贝替换为/root/scripts/pre-install.sh。编辑结果如下图所示:
在这里插入图片描述

创建好后执行docker build –t cloudos-openstack:E1137H10 –f dockerfileopenstackbuild.txt .命令构建镜像,这条命令最后的.表示在当前路径下操作。之后会逐行执行文件里的命令,首先从之前备份过的镜像cloudos-openstack:E1137H10_twins启动,用户名为root,执行的操作为将本路径下的已经修改过配置的pre-install.sh文件拷贝到/root/scripts下。
在这里插入图片描述

如果dockerfileopenstackbuild文件内命令输入有误则会报错,举例如下图所示,文件第三行拷贝路径输入有误,那么在执行命令时的第三步会显示失败。
在这里插入图片描述

查看结果,显示已创建好新的镜像文件。
在这里插入图片描述

4.4 使用新镜像启动容器

先输入命令/opt/bin/kubectl –server=192.168.113.250:8888 get rc查看openstackrc,然后delete将它停止,查看pod状态已经没有openstackrc容器了。
在这里插入图片描述

重新创建openstack docker容器前请检查openstack-rc.yaml文件中的image字段是否与上一步build出来的tag一致。如下图所示,查看openstack-rc.yaml文件中的image字段与上一步build出来的tag一致,镜像信息为cloudos-openstack:E1137H10。注意:如果不一致则需要修改,且修改前要先备份。
在这里插入图片描述

执行命令/opt/bin/kubectl --server=127.0.0.1:8888 create -f /opt/bin/confFile/openstack-rc.yaml拉起openstack docker,查看运行状态是否都是正常的Running状态。
在这里插入图片描述

4.5 进入容器查看修改的内容是否固化

查看文件显示已将firewall_type参数修改为GATEWAY,将lb_type参数修改为SERVICE_CHAIN,将resource_mode参数修改为NFV,固化成功。
在这里插入图片描述

相关文章:

【容器固化】 OS技术之OpenStack容器固化的实现原理及操作

1. Docker简介 要学习容器固化&#xff0c;那么必须要先了解下Docker容器技术。Docker是基于GO语言实现的云开源项目&#xff0c;通过对应用软件的封装、分发、部署、运行等生命周期的管理&#xff0c;达到应用组件级别的“一次封装&#xff0c;到处运行”。这里的应用软件&am…...

设置 SSH 通过密钥登录

我们一般使用 PuTTY 等 SSH 客户端来远程管理 Linux 服务器。但是&#xff0c;一般的密码方式登录&#xff0c;容易有密码被暴力破解的问题。所以&#xff0c;一般我们会将 SSH 的端口设置为默认的 22 以外的端口&#xff0c;或者禁用 root 账户登录。其实&#xff0c;有一个更…...

1.6 面试经典150题 - 买卖股票的最佳时机

买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易…...

locust快速入门--使用分布式提高测试压力

背景&#xff1a; 使用默认的locust启动命令进行压测时&#xff0c;尽管已经将用户数设置大比较大&#xff08;400&#xff09;&#xff0c;但是压测的时候RPS一直在100左右。需要增加压测的压力。 问题原因&#xff1a; 如果你是通过命令行启动的或者参考之前文章的启动方式…...

K8s(三)Pod资源——pod亲和性与反亲和性,pod重启策略

目录 pod亲和性与反亲和性 pod亲和性 pod反亲和性 pod状态与重启策略 pod状态 pod重启策略 本文主要介绍了pod资源与pod相关的亲和性&#xff0c;以及pod的重启策略 pod亲和性与反亲和性 pod亲和性&#xff08;podAffinity&#xff09;有两种 1.podaffinity&#xff0c;…...

免费的域名要不要?

前言 eu.org的免费域名相比于其他免费域名注册服务&#xff0c;eu.org的域名后缀更加独特。同时&#xff0c;eu.org的域名注册也比较简单&#xff0c;只需要填写一些基本信息&#xff0c;就可以获得自己的免费域名。 博客地址 免费的域名要不要&#xff1f;-雪饼前言 eu.org…...

高通sm7250与765G芯片是什么关系?(一百八十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…...

[Python进阶] Python操作MySQL数据库:pymysql

7.7 操作MySQL数据库&#xff1a;pymysql 7.7.1 准备工作(创建mysql数据库) PHPStudy介绍&#xff1a; phpstudy是一款非常有用的PHP开发工具&#xff0c;旨在帮助开发者更加便捷地进行PHP程序的开发与调试。它提供了一个友好的图形用户界面&#xff0c;使得用户能够方便地进…...

Vue3实现带点击外部关闭对应弹出框(可共用一个变量)

首先&#xff0c;假设您在单文件组件(SFC)中使用了Vue3&#xff0c;并且有两个div元素分别通过v-if和v-else来切换显示一个带有.elpopver类的弹出组件。在这种情况下&#xff0c;每个弹出组件应当拥有独立的状态管理&#xff08;例如&#xff1a;各自的isOpen变量&#xff09;。…...

可视化试题(一)

1. 从可视化系统设计的角度出发&#xff0c;通常需要根据系统将要完成的任务的类型选择交互技术。按照任务类型分类可以将数据可视化中的交互技术分为选择、&#xff08; 重新配置 &#xff09;、重新编码、导航、关联、&#xff08; 过滤 &#xff09;、概览和细节等八…...

RHCE 【在openEuler系统中搭建基本论坛(网站)】

目录 网站需求&#xff1a; 准备工作&#xff1a; 1.基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! 测试&#xff1a; 2.给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料和缴费网站&#xff0c;基于[www.openla…...

20240112让移远mini-PCIE接口的4G模块EC20在Firefly的AIO-3399J开发板的Android11下跑通【DTS部分】

20240112让移远mini-PCIE接口的4G模块EC20在Firefly的AIO-3399J开发板的Android11下跑通【DTS部分】 2024/1/12 16:20 https://blog.csdn.net/u010164190/article/details/79096345 [Android6.0][RK3399] PCIe 接口 4G模块 EC20 调试记录 https://blog.csdn.net/hnjztyx/artic…...

日志采集传输框架之 Flume,将监听端口数据发送至Kafka

1、简介 Flume 是 Cloudera 提供的一个高可用的&#xff0c;高可靠的&#xff0c;分布式的海量日志采集、聚合和传 输的系统。Flume 基于流式架构&#xff0c;主要有以下几个部分组成。 主要组件介绍&#xff1a; 1&#xff09;、Flume Agent 是一个 JVM 进程&#xf…...

关于Vue前端接口对接的思考

关于Vue前端接口对接的思考 目录概述需求&#xff1a; 设计思路实现思路分析1.vue 组件分类和获取数值的方式2.http 通信方式 分类 如何对接3.vue 组件分类和赋值方式&#xff0c; 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your p…...

【设计模式之美】SOLID 原则之三:里式替换(LSP)跟多态有何区别?如何理解LSP中子类遵守父类的约定

文章目录 一. 如何理解“里式替换原则”&#xff1f;二. 哪些代码明显违背了 LSP&#xff1f;三. 回顾 一. 如何理解“里式替换原则”&#xff1f; 子类对象能够替换程序中父类对象出现的任何地方&#xff0c;并且保证原来程序的逻辑行为不变及正确性不被破坏。 里氏替换原则…...

代码随想录第六十三天——被围绕的区域,太平洋大西洋水流问题,最大人工岛

leetcode 130. 被围绕的区域 题目链接&#xff1a;被围绕的区域 步骤一&#xff1a;深搜或者广搜将地图周边的’O’全部改成’A’ 步骤二&#xff1a;遍历地图&#xff0c;将’O’全部改成’X’&#xff0c;将’A’改回’O’ class Solution { private:int dir[4][2] {-1, 0…...

Docker 项目如何使用 Dockerfile 构建镜像?

1、Docker 和 Dockerfile 的重要性 1.1、Docker 简介&#xff1a;讲述 Docker 的起源、它是如何革新现代软件开发的&#xff0c;以及它为开发者和运维团队带来的好处。重点强调 Docker 的轻量级特性和它在提高应用部署、扩展和隔离方面的优势。 本文已收录于&#xff0c;我的…...

实践学习PaddleScience飞桨科学工具包

实践学习PaddleScience飞桨科学工具包 动手实践&#xff0c;在实践中学习&#xff01;本项目可以在AIStudio平台一键运行&#xff01;地址&#xff1a;https://aistudio.baidu.com/projectdetail/4278591 本项目第一次执行会报错&#xff0c;再执行一次即可。若碰到莫名其妙的…...

Vue 中修改 Element 组件的 下拉菜单(Dropdown) 的样式

Vue 中修改 Element 组件的 下拉菜单(Dropdown) 的样式 今天在项目中碰到一个 UI 改造的需求&#xff0c;需要根据设计图把页面升级成 UI 设计师提供的设计图样式。 到最后页面改造完了&#xff0c;但是 UI 提供的下拉菜单样式全部是黑色半透明的&#xff0c;只能硬着头皮改了。…...

达梦数据库主备集群

1&#xff1a;服务器硬件需求 按实际业务需求&#xff0c;选择合适的服务器&#xff0c;准备 3 台服务器&#xff0c;一台主库服务器&#xff0c;一台备库服务器&#xff0c;一台监视器服务器&#xff0c;服务器参数建议如下&#xff1a; 硬件要求物理内存>16 GB交换区Swa…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...