【容器固化】 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…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...