【容器固化】 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简介 要学习容器固化,那么必须要先了解下Docker容器技术。Docker是基于GO语言实现的云开源项目,通过对应用软件的封装、分发、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”。这里的应用软件&am…...
设置 SSH 通过密钥登录
我们一般使用 PuTTY 等 SSH 客户端来远程管理 Linux 服务器。但是,一般的密码方式登录,容易有密码被暴力破解的问题。所以,一般我们会将 SSH 的端口设置为默认的 22 以外的端口,或者禁用 root 账户登录。其实,有一个更…...
1.6 面试经典150题 - 买卖股票的最佳时机
买卖股票的最佳时机 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易…...

locust快速入门--使用分布式提高测试压力
背景: 使用默认的locust启动命令进行压测时,尽管已经将用户数设置大比较大(400),但是压测的时候RPS一直在100左右。需要增加压测的压力。 问题原因: 如果你是通过命令行启动的或者参考之前文章的启动方式…...
K8s(三)Pod资源——pod亲和性与反亲和性,pod重启策略
目录 pod亲和性与反亲和性 pod亲和性 pod反亲和性 pod状态与重启策略 pod状态 pod重启策略 本文主要介绍了pod资源与pod相关的亲和性,以及pod的重启策略 pod亲和性与反亲和性 pod亲和性(podAffinity)有两种 1.podaffinity,…...

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

高通sm7250与765G芯片是什么关系?(一百八十一)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…...

[Python进阶] Python操作MySQL数据库:pymysql
7.7 操作MySQL数据库:pymysql 7.7.1 准备工作(创建mysql数据库) PHPStudy介绍: phpstudy是一款非常有用的PHP开发工具,旨在帮助开发者更加便捷地进行PHP程序的开发与调试。它提供了一个友好的图形用户界面,使得用户能够方便地进…...
Vue3实现带点击外部关闭对应弹出框(可共用一个变量)
首先,假设您在单文件组件(SFC)中使用了Vue3,并且有两个div元素分别通过v-if和v-else来切换显示一个带有.elpopver类的弹出组件。在这种情况下,每个弹出组件应当拥有独立的状态管理(例如:各自的isOpen变量)。…...
可视化试题(一)
1. 从可视化系统设计的角度出发,通常需要根据系统将要完成的任务的类型选择交互技术。按照任务类型分类可以将数据可视化中的交互技术分为选择、( 重新配置 )、重新编码、导航、关联、( 过滤 )、概览和细节等八…...
RHCE 【在openEuler系统中搭建基本论坛(网站)】
目录 网站需求: 准备工作: 1.基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! 测试: 2.给该公司创建三个子界面分别显示学生信息,教学资料和缴费网站,基于[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 提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传 输的系统。Flume 基于流式架构,主要有以下几个部分组成。 主要组件介绍: 1)、Flume Agent 是一个 JVM 进程…...

关于Vue前端接口对接的思考
关于Vue前端接口对接的思考 目录概述需求: 设计思路实现思路分析1.vue 组件分类和获取数值的方式2.http 通信方式 分类 如何对接3.vue 组件分类和赋值方式, 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your p…...
【设计模式之美】SOLID 原则之三:里式替换(LSP)跟多态有何区别?如何理解LSP中子类遵守父类的约定
文章目录 一. 如何理解“里式替换原则”?二. 哪些代码明显违背了 LSP?三. 回顾 一. 如何理解“里式替换原则”? 子类对象能够替换程序中父类对象出现的任何地方,并且保证原来程序的逻辑行为不变及正确性不被破坏。 里氏替换原则…...
代码随想录第六十三天——被围绕的区域,太平洋大西洋水流问题,最大人工岛
leetcode 130. 被围绕的区域 题目链接:被围绕的区域 步骤一:深搜或者广搜将地图周边的’O’全部改成’A’ 步骤二:遍历地图,将’O’全部改成’X’,将’A’改回’O’ class Solution { private:int dir[4][2] {-1, 0…...
Docker 项目如何使用 Dockerfile 构建镜像?
1、Docker 和 Dockerfile 的重要性 1.1、Docker 简介:讲述 Docker 的起源、它是如何革新现代软件开发的,以及它为开发者和运维团队带来的好处。重点强调 Docker 的轻量级特性和它在提高应用部署、扩展和隔离方面的优势。 本文已收录于,我的…...

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

Vue 中修改 Element 组件的 下拉菜单(Dropdown) 的样式
Vue 中修改 Element 组件的 下拉菜单(Dropdown) 的样式 今天在项目中碰到一个 UI 改造的需求,需要根据设计图把页面升级成 UI 设计师提供的设计图样式。 到最后页面改造完了,但是 UI 提供的下拉菜单样式全部是黑色半透明的,只能硬着头皮改了。…...
达梦数据库主备集群
1:服务器硬件需求 按实际业务需求,选择合适的服务器,准备 3 台服务器,一台主库服务器,一台备库服务器,一台监视器服务器,服务器参数建议如下: 硬件要求物理内存>16 GB交换区Swa…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...