镜像与容器

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://www.mzph.cn/diannao/47333.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Datawhale AI 夏令营】入门lightgbm及特征工程进行实践

文章目录 1. LightGBM简介2. 导入必要的库3. 加载数据集4. 数据可视化4.1 不同类型对应目标值的柱状图4.2 特定ID的目标值折线图 5. 特征工程5.1 合并训练集和测试集并进行排序5.2 历史平移5.3 窗口统计5.4 数据切分5.5 确定输入特征 6. 模型训练与评估7. 结果展示 1. LightGBM…

一文看懂JTAG基本知识

文章目录 1、JTAG是什么?1.1边界扫描2、JTAG如何起作用?2.1 PC控制JTAG2.2 并行端口2.3 JTAG TAP控制器2.4 计算JTAG链中元件个数2.5 获得JTAG链上芯片的ID3、边界扫描3.1、SAMPLE3.2、边界扫描寄存器3.3、JTAG还可以做什么?参考资料:1、JTAG是什么? JTAG是20世纪80年代开…

云监控(华为) | 实训学习day1(10)

云监控:确保服务器高效运行 在当今的数字化时代,服务器的稳定运行对于任何企业都至关重要。为了确保服务器的 CPU、内存和硬盘等资源的合理运行,云监控成为了一项不可或缺的技术。本文将详细介绍云监控的基本概念、所需软件、配置方法以及如何…

JDBC 技术 | Java连接MySQL数据库(四万字零基础保姆级超全详解)

文章目录 前言一. JDBC概述1. JDBC 概念2. JDBC 本质3. JDBC 的好处 二. JDBC 快速入门1. 编写Java 程序步骤2. 在IDEA 中的操作流程3. 正式编写 Java程序 三. JDBC API详解1. DriverManager 类2. Connection 接口2.1 获取执行SQL语句的对象 3 .ResultSet 类3.1 概述3.2 代码实…

Cadence23学习笔记(四)

这个人讲cadence也很不错: 73、创建Power NetClass[Cadence Allegro132讲视频教程字幕版]_哔哩哔哩_bilibili 上位机开发: MFC 最详细入门教程-CSDN博客 Board Geometry — Design_Outline 板框 Etch — Top 走线 Pin — Top 焊盘 …

探索APP开发中的主流版式设计与应用实践

在当今移动互联网高速发展的时代,APP已成为人们日常生活中不可或缺的一部分。无论是社交娱乐、购物支付还是工作学习,各类APP都以其独特的界面设计和用户体验赢得了用户的青睐。而APP开发的版式设计和页面规范,则是决定用户体验好坏的关键因素…

记录些MySQL题集(6)

MySQL 单表为什么不要超过 2000W 行? 数据持久化在磁盘中,磁盘的最小单元是扇区,一个扇区 0.5 KB,而由 8 个扇区可以构成一个文件系统块(4K),以 InnoDB 存储引擎为例,一个数据页的大…

打卡第15天------二叉树

最近公司给我派活儿太多了,要干好多活儿,好多工作任务要处理,我都没时间刷题了。leetcode上的题目通过数量一直停留在原地不动,我真的很着急呀,我现在每天过的都有一种紧迫感,很着急,有一种与时间赛跑的感觉,真的时间过的太快了,没有任何人能够阻挡住时间的年轮向前推…

【异步爬虫:利用异步协程抓取一部电影】

利用异步协程抓取一部电影 我们把目光转向wbdy. 目前该案例还是可以用的. 我们想要抓取网上的视频资源就必须要了解我们的视频网站是如何工作的. 这里我用91看剧来做举例. 其他网站的原理是一样的. 1.视频网站是如何工作的 假设, 你现在想要做一个视频网站. 也有很多的UP猪…

【BUG】已解决:java.lang.IllegalStateException: Duplicate key

已解决:java.lang.IllegalStateException: Duplicate key 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,武汉城市…

【数学建模】——多领域资源优化中的创新应用-六大经典问题解答

目录 题目1:截取条材 题目 1.1问题描述 1.2 数学模型 1.3 求解 1.4 解答 题目2:商店进货销售计划 题目 2.1 问题描述 2.2 数学模型 2.3 求解 2.4 解答 题目3:货船装载问题 题目 3.1问题重述 3.2 数学模型 3.3 求解 3.4 解…

超详细信息收集篇

1 域名信息收集 1.1 域名是什么 域名(英语:Domain Name),又称网域,是由一串用点分隔的名字组成的 Internet 上某一台 计算机 或计算机组的名称,用于在数据传输时对计算机的定位标识(有时也指地…

数据结构——栈和队列(C语言实现)

写在前面: 栈和队列是两种重要的线性结构。其也属于线性表,只是操作受限,本节主要讨论的是栈和队列的定义、表示方法以及C语言实现。 一、栈和队列的定义与特点 栈:是限定仅在表尾进行插入和删除的线性表。对栈来说,表…

【经验分享】关于静态分析工具排查 Bug 的方法

文章目录 编译器的静态分析cppcheck安装 cppcheck运行 cppcheck 程序员的日常工作,不是摸鱼扯皮,就是在写 Bug。虽然这是一个梗,但也可以看出,程序员的日常一定绕不开 Bug。而花更少的时间修复软件中的 Bug,且不引入新…

lightgbm

lightGBM 1.sklearn 使用代码 【机器学习基础】XGBoost、LightGBM与CatBoost算法对比与调参 首先,XGBoost、LightGBM和CatBoost都是目前经典的SOTA(state of the art)Boosting算法,都可以归类到梯度提升决策树算法系列。三个模…

5. JavaSE ——【适合小白的数组练习题】

📖开场白 亲爱的读者,大家好!我是一名正在学习编程的高校生。在这个博客里,我将和大家一起探讨编程技巧、分享实用工具,并交流学习心得。希望通过我的博客,你能学到有用的知识,提高自己的技能&a…

【区块链 + 智慧政务】澳门:智慧城市建设之证书电子化项目 | FISCO BCOS应用案例

2019 年 2 月 27 日,澳门政府设立的澳门科学技术发展基金与微众银行达成合作,通过区块链、人工智能、大数据、 云计算等创新技术,共同推进澳门特区的智慧城市建设与未来型城市发展,提升粤港澳大湾区的科创能力。在澳 门智慧城市建…

【数学建模】高温作业专用服装设计(2018A)隐式差分推导

为方便计算,对区域进行离散化处理,采用隐式差分格式进行离散计算。隐式差分格式如图: 每层材料内部 对第 j j j层材料: 其中, λ j \lambda_j λj​表示第 j j j层的热扩散率, c j c_j cj​表示第 j j j层的比热容…

linux需要熟悉的命令理解记忆

(1)光标插入 (1)一般模式下: i 插入到光标前方 记忆方法:在一般模式下, 光标选中字符, 我们按下 i, 就会插入光标的前方, insert, 表示插队 (2)一般模式下: a 插入到光标后方 记忆方法: 在一般模式下, 光标选中字符,a表示append, 添加或者附加的意思 (3) 如果要在行首或者行…

css实现每个小盒子占32%,超出就换行

代码 <div class"visitors"><visitor class"item" v-for"(user,index) in userArr" :key"user.id" :user"user" :index"index"></visitor></div><style lang"scss" scoped&…