镜像与容器

Docker Image (镜像)

Docker 镜像概念

  • Docker iamge 本质上是一个 read-only 只读文件,这个文件包含了文件系统、源码、库文件、依赖、工具等一些运行 application 所必需的文件。

  • 可以把 Docker image 理解成一个模板,可以通过这个模板实例化出来很多容器。

  • image 里面是一层层文件系统 Union FS。联合文件系统,可以将几层目录挂在到一起,形成一个虚拟文件系统。

每一层文件系统称为一层 layer,联合文件系统可以对每一层文件系统设置三种权限,只读(readonly)、读写(readwrite)和写出(whiteout-able),但是 docker 镜像中每一层文件系统都是只读的。

构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层的修改,增加了一层文件系统。一层层网上叠加,上层的修改会覆盖底层该位置的可见性。在使用的时候,只会看到一个完全的整体,不知道里面有几层,也不清楚每一层所做的修改是什么。

镜像主要解决什么问题

三个要点:一致性、压缩、分层存储。

在部署应用时,通常是以手工或者脚本的方式进行。但是这样会导致一个问题,无法让云端和本地的环境一致。而且,用户打包每个应用的过程比较繁琐,需要配置和修改等操作,比较繁琐。

但是,Docker 会把一个镜像制作成一个完整的操作系统所有文件和对应的目录结构,形成一个“压缩包”,并且与本地和测试环境所用的操作系统一样。

docker 最大的贡献就是定义了容器镜像的分层的存储格式。

docker 镜像技术的基础是联合文件系统(UnionFS),其文件系统是分层的,这样既可以充分利用共享层,又可以减少存储空间占用。

docker 镜像提供了一种打包应用程序和预配置服务器环境的便捷方式,可以很方便地将其用于个人用途或与其他 Docker 用户公开共享。

Docker Container (容器)

容器概念

通俗来说,容器是镜像的运行实体。镜像是静态的只读文件,容器是带有运行时需要的可写文件层的,并且容器中的进程属于运行状态。即容器运行着真正的应用进程,它有创建、运行、停止、暂停和删除五种状态。

虽然容器本质上是主机上运行的一个进程,但是容器有自己独立的命名空间隔离和资源限制。也就是说,在容器内部,无法看到主机上的进程、环境变量、网络等信息,这是容器与直接运行在主机上进程的本质区别。

容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。这将添加一个容器层,该层允许修改镜像的整个版本。

容器的生命周期

各种状态

容器的状态包括:初建状态(created)、运行状态(running)、停止状态(stopped)、暂停状态(paused)、删除状态(deleted)。

各状态之间转换关系如下:

  • docker create:创建容器后,不立即运行,容器进入初建状态。

  • docker run:创建容器,并立即启动进行,进入运行状态。

  • docker start:容器转为运行状态。

  • docker stop:容器将转入停滞状态。

  • docker kill:容器在故障(死机)时,执行 kill(断电),容器转入停止状态,这种操作容器丢失数据,除非必要,否则不建议使用。

  • docker restart:重启容器,容器进入运行状态。

  • docker pause:容器进入暂停状态。

  • docker unpause:取消暂停状态,容器进入运行状态。

  • docker rm:删除容器,容器进行删除状态。

  • killed by out-of-memory(因内存不足被终止):宿主机内存被耗尽,也被称为 OOM,非计划终止,这时需要杀死最吃内存的容器。

  • container process exited(异常终止):出现容器被终止后,将进入 Should restart?(yes需要重启,容器执行 start 命令,转为运行状态;no 不需要重启,容器转为停止状态)。

容器 OOM

Docker 在处理 OOM 事件时并不是二话不说,直接关闭容器,而是分为以下三种情况:

  1. 如果容器中的应用耗尽了主机系统分配给容器的内存限额,就会触发 OOM 事件。此时,此容器将会被强制关闭。但是需要注意的是,此时关闭的容器并不是一个 docker daemon,而是宿主机操作系统。因为一个容器就是一组运行在宿主机操作系统中的进程,宿主机操作系统通过 cgroups 对这组进程设定资源上限,当这些进程申请的资源到达上限时,触发的是宿主机操作系统的内核 OOM 事件,因此最终是由宿主机内核来关闭这些进程。

  2. 如果用户不想关闭这个容器,则可以选择 --oom-kill-disable 来禁用 OOM-Killer。使用这个参数时,仍需要注意,如果使用 -m 设置了此容器内存上限,则当容器到达内存资源上限时,主机不会关闭容器,但也不会继续向此容器继续分配资源,此时容器处于 hung 状态。只需要将最坏的情况封闭在一定范围之内,而不至于蔓延出去。

  3. 如果用户使用了 --oom-kill-disable,但也没有使用 -m 来设定上限,此时此容器会尽可能多地使用主机内存资源。也就是说,主机内存有多大,它就可以用多大。

容器异常退出

每个容器内部都存在一个 Init 进程,容器中其他所有进程都是此进程的子进程。

运行的容器是因为 Init 进程在运行,如果一个子进程因为某种原因造成了退出,那么其父进程也会同步退出,直至 Init 进程也退出。

当 Init 进程退出时,也就代表着此容器被关闭。

Docker 目前没有办法知道此时的进程退出属于正常退出还是异常退出。

当出现容器关闭情况时,Docker Daemon 会尝试再次重新将此容器由 Stopped 状态转为 Running 状态。

只有设置了 --restart 参数的容器,Docker Daemon 才会去尝试启动,否则容器会保持停止状态。

容器暂停

Docker “剥夺”了此容器的 CPU 资源,而其他资源,如 Memory 资源、Network 资源等还保留未动。所以,失去了 CPU 资源的进程,是不会被主机内核系统所调度的,所以此容器就处于“冰封”状态。

常见问题

docker create、docker start 和 docker run 有什么区别?

docker create 命令从 Docker 映像创建一个全新的容器。但是不会立刻运行它。

docker start 命令将启动任何已停止的容器。如果使用 docker create 命令创建容器,则可以使用此命令启动它。

docker run 命令时创建和启动的组合,因为它创建了一个新容器并立即启动它。实际上,如果 docker run 命令在系统上找不到映像,它可以从 Docker Hub 中提取映像。

docker import 和 docker load 有什么区别?

需要先知道 docker save和 docker export 命令:

  • docker save images_name:将一个镜像导出为文件,再使用 docker load 命令将文件导入为一个镜像,会保存该镜像的所有历史记录。比 docker export 命令导出的文件大,因为会保存镜像的所有历史记录。

  • docker export container_id:将一个容器导出为文件,再使用 docker import 命令将容器导入为一个新的镜像,但是相比 docker save 命令,容器文件会丢失原数据和历史记录,仅保存容器当时的状态,相当于虚拟机使用。

既可以使用 docker load 命令来导入镜像库存储文件到本地镜像库,也可以使用 docker import 命令来导入一个容器快照到本地镜像库。

两者的区别在于容器快照将会丢失所有的历史记录和元数据信息,而镜像存储文件将保存完整记录,体积也会更大。

docker rm & docker rmi & docker prune 的差异?

docker rm:删除一个或多个容器。

docker rmi:删除一个或多个镜像。

docker prune:用来删除不再使用的 docker 对象。

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

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

相关文章

Qt类 | QLabel类详解

文章目录 一、QLabel类介绍二、Properties(属性)三、Public Functions(公共函数)1.构造函数2.alignment与setAlignment函数 -- 标签内容的对齐方式3.buddy与setBuddy函数 -- QLabel关联的伙伴控件4.hasScaledContents与setScaledC…

在学习使用LabVIEW的过程中,需要注意哪些问题?

在学习使用LabVIEW的过程中,需要注意以下问题: 1. 基础知识 图形化编程思维: LabVIEW采用图形化编程方式,与传统的文本编程语言有很大不同,需要适应这种新的编程思维方式。数据流概念: 理解LabVIEW的核心数…

Django Q()函数

Q() 函数的作用 在Django中,Q()函数是一个非常有用的工具,主要用于构建复杂的查询。它允许你创建复杂的查询语句,包括AND、OR和NOT逻辑操作。这对于处理复杂的数据库查询特别有用,特别是在你需要组合多个条件或处理复杂的过滤逻辑…

深入理解Android中的缓存与文件存储目录

🌟 引言 在Android应用开发中,合理管理应用的数据存储至关重要。应用可能需要保存各种类型的数据,从简单的配置信息到多媒体文件,甚至是缓存数据以提高性能和用户体验。Android提供了多个内置目录来满足这些需求,但它…

唐山养老院哪家好---守护晚年幸福,用服务引领老年人高品质养老生活

随着社会的快速发展和人口老龄化趋势的加剧,老年人对养老机构的需求日益增长,选择养老机构作为养老方式已成为许多老年人的必然选择。随着年龄的增长,生理功能的退化和疾病风险的增加,使得老年人更加需要专业的医疗照护和日常生活…

《大数据基础》相关知识点及考点,例题

1.6大数据计算模式 1、MapReduce可以并行执行大规模数据处理任务,用于大规模数据集(大于1TB)的并行运算。MapReduce 极大地方便了分布式编程工作,它将复杂的、运行于大规模集群上的并行计算过程高度地抽象为两个函数一一Map和Redu…

nginx全局块的user指令

文章目录 1、user指令1.1、进入nginx解压的目录1.2、./configure --help1.3、工作进程默认是nobody 2、user指令的使用步骤:2.1、设置一个用户信息"www"2.2、 创建一个用户2.3、./nginx -s reload2.4、创建/root/html/index.html页面,添加如下内容2.5、修…

《电脑知识与技术》是什么级别的期刊?是正规期刊?能评职称吗?

​问题解答 问:《电脑知识与技术》是不是核心期刊? 答:不是,是知网收录的正规学术期刊。 问:《电脑知识与技术》级别? 答:省级。主管单位:安徽出版集团有限责任公司 主办单位&a…

海外营销推广:快速创建维基百科(wiki)词条-大舍传媒

一、维基百科的永久留存问题 许多企业和个人关心维基百科是否能永久留存。实际上,只要企业和个人的行为没有引起维基百科管理方的反感,词条就可以长期保存。如果有恶意行为或被投诉,维基百科可能会对词条进行删除或修改。 二、创建维基百科…

FPGA 实现DDR4的读写

1 硬件设计 FPGA 端: DDR4: 2 验证方案 3 仿真验证 4 DDR4 下板验证

【有效验证】解决SQLyog连接MYSQL的错误 1251 - Client does not support

目录 一、原因分析: 二、进入到mysql 三、查看当前加密方式 四、更改加密方式 五、查看是否成功 前言:使用一个开源软件使用sqlyog、navcat都报1251错误,网上都是提示升级客户端,还有一种就是修改mysql配置。本文就是修改配置…

QT实现图片开关控件-自定义控件

开关按钮大家应该很熟悉,在设置里面经常遇到,切换时候的滑动效果比较帅气。通常说的开关按钮,有两个状态:on、off。大部分的开关按钮控件,基本上有两大类,第一类是纯代码绘制,这种对代码的掌控度…

WEB前端06-BOM对象

BOM浏览器对象模型 浏览器对象模型:将浏览器的各个组成部分封装成对象。是用于描述浏览器中对象与对象之间层次关系的模型,提供了独立于页面内容、并能够与浏览器窗口进行交互的对象结构。 组成部分 Window:浏览器窗口对象 Navigator&…

PHP手边酒店多商户版平台小程序系统源码

🏨【旅行新宠】手边酒店多商户版小程序,一键解锁住宿新体验!🛌 🌈【开篇:旅行新伴侣,尽在掌握】🌈 还在为旅行中的住宿选择而纠结吗?是时候告别繁琐的搜索和比价过程&a…

Java反射机制基础知识赏析、接口、实现类、方法

前言 最近打算手写一个RPC,但奈何自己Java基础知识中的反射就很欠缺,第一章就看不太懂了,特地编写了几个小Demo验证一下Java中关于反射的基础知识。 目录组织结构 代码编写 // TestService接口 package reflect.testServices;import main.v…

基于asp.net 在线订票管理系统 设计与实现

博主介绍:专注于Java .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的可以…

Vue封装文件上传组件(支持图片、PDF、Excel、word预览下载)

一、准备工作 安装预览依赖包&#xff1a;exceljs、mammoth、vue-pdf 二、封装组件 文件上传组件 fileUploadPro.vue。默认预览、下载是true,可通过isPreView、isDownLoad控制 <template><div style"display: flex"><el-uploadmultipleaction&qu…

使用百度语音技术实现文字转语音

使用百度语音技术实现文字转语音 SpringBootVue前后端分离项目 调用api接口需要使用AK和SK生成AccessToken,生成getAccessToken的接口有跨域限制,所以统一的由后端处理了 部分参数在控制台->语音技术->在线调试里面能找到 Controller RestController RequestMapping(&q…

【Spring Cloud】掌握Gateway核心技术,实现高效路由与转发

目录 前言示例创建一个服务提供者创建网关 创建common子项目 前言 Spring Cloud Gateway 是一个基于 Spring Boot 的非阻塞 API 网关服务&#xff0c;它提供了动态路由、请求断言、过滤器等功能。 以下是关于 Spring Cloud Gateway 的示例&#xff1a; 示例 创建一个服务提…

C#实现数据采集系统-实现功能介绍

系统介绍 我们这里主要使用C#( .Net 6)来实现一个数据采集系统&#xff0c;从0到1搭建数据采集系统&#xff0c;从系统分析&#xff0c;功能拆解&#xff0c;到一一实现 数据采集 数据采集是企业信息化和数字化转型过程中的关键环节&#xff0c;它涉及到从生产设备、传感器…