镜像与容器

news2024/11/11 5:22:31

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.coloradmin.cn/o/1933285.html

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

相关文章

2024全球和国内最常用的弱密码,有没有你的?

密码管理器NordPass分析了来自公开来源的超过4.3TB 的密码数据,找出了当前为止(2024年)最常用(最脆弱)的密码。 这些密码主要有下面这些特征: 简单且常用,万年弱密码,比如123456、a…

Axure中继器入门:打造你的动态原型

前言 中继器 是 Axure 中的一个高级功能,它能够在静态页面上模拟后台数据交互的操作,如增加、删除、修改和查询数据,尽管它不具备真实数据存储能力。 中继器就像是一个临时的数据库,为我们在设计原型时提供动态数据管理的体验&a…

IntelliJ IDEA 使用maven构建项目时一直卡在Compiling 阶段

IntelliJ IDEA 使用maven构建项目时一直卡在Compiling 阶段 1. maven log [DEBUG] incrementalBuildHelper#beforeRebuildExecution [INFO] Compiling 56 source files to D:\code\short-url\target\classes...2. 增加日志级别 通过添加 -X 参数到 Maven 命令中(例…

Ubuntu 24.04 LTS 桌面安装MT4或MT5 (MetaTrader)教程

运行脚本即可在 Ubuntu 24.04 LTS Noble Linux 上轻松安装 MetaTrader 5 或 4 应用程序,使用 WineHQ 进行外汇交易。 MetaTrader 4 (MT4) 或 MetaTrader 5 是用于交易外汇对和商品的流行平台。它支持各种外汇经纪商、内置价格分析工具以及通过专家顾问 (EA) 进行自…

曲轴自动平衡机:提升制造精度与效率的利器

在现代制造业中,曲轴作为发动机的核心部件之一,其质量和性能直接影响着整个发动机的运行效果。而曲轴自动平衡机的出现,为曲轴的生产制造带来了显著的优势。 一、高精度平衡校正 曲轴自动平衡机采用先进的传感技术和精密的测量系统&#xff0…

Qt 快速保存配置的方法

Qt 快速保存配置的方法 一、概述二、代码1. QFileHelper.cpp2. QSettingHelper.cpp 三、使用 一、概述 这里分享一下,Qt界面开发时,快速保存界面上一些参数配置的方法。 因为我在做实验的时候,界面上可能涉及到很多参数的配置,我…

FastAPI 学习之路(五十六)将token缓存到redis

在之前的文章中,FastAPI 学习之路(二十九)使用(哈希)密码和 JWT Bearer 令牌的 OAuth2,FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2,FastAPI 学习之路&…

【笔记】一起齿轮箱的故障和相应的数学模拟实验

1.齿轮箱故障一例 出处:设备的故障识别 GearBox的频谱图,原作者不知道是从哪里拷贝来的,待会儿确认一下。 齿轮啮合频率GMF等于齿数乘以齿轮转速频率: ★齿轮啮合频率两边有边频,间距为1X(这是由冲击响应…

游泳溺水智能监测报警摄像机

当今社会,游泳已经成为人们重要的休闲活动之一。然而,溺水事故时有发生,尤其是在公共泳池或开放水域。为了提高游泳安全,智能监测技术的应用变得尤为重要。本文将探讨一种创新的游泳溺水智能监测报警摄像机系统,旨在有…

git使用以及理解

git练习网站 Learn Git Branching git操作大全Oh Shit, Git!?! git commit git branch name git merge bugFix 合并俩个分支 git rebase main git checkout headgit switch head 会导致HEAD分离 ,就是指head->HEAD->c1 相对引用 ------------------- …

PDF文件无法编辑?3步快速移除PDF编辑限制

正常来说,我们通过编辑器打开pdf文件后,就可以进行编辑了。如果遇到了打开pdf却不能编辑的情况,那有可能是因为密码或是扫描件的原因。小编整理了一些pdf文件无法编辑,以及pdf文件无法编辑时我们要如何处理的方法。下面就随小编一起来…

WEB前端06-BOM对象

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

Human Serum Amyloid A1 ELISA试剂盒

走近指标:Serum Amyloid A1(SAA1) (Human SAA1 结构图,参考网址https://www.rcsb.org/structure/4IP9) 血清淀粉样蛋白 A1(SAA1)是一种由SAA1基因编码的蛋白质&…

用Docker来开发

未完成。。。 现在好像用Docker是越来越多了。之前其实也看过docker的原理,大概就是cgroup那些,不过现在就不看原理了,不谈理论,只看实际中怎么用,解决眼前问题。 用docker来做开发,其实就是解决的编译环境…

Word文档恢复竟然这么简单?3个推荐方案送上!

“我很喜欢用Word进行文字创作,可是我有一次重新打开我的Word文档,却显示文档已丢失,这该怎么办呢?凝聚我多年心血的文章还有可能恢复吗?” 不论是总结学习内容还是汇报工作成果,我们总会用上Word。Word作…

[C++基础]构造函数和析构函数

💖💖💖欢迎来到我的博客,我是anmory💖💖💖 又和大家见面了 欢迎来到C探索系列 作为一个程序员你不能不掌握的知识 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低成本搭建个人网站…

继承和多态常见的面试问题

文章目录 概念问答 概念 下面哪种面向对象的方法可以让你变得富有( A) A: 继承 B: 封装 C: 多态 D: 抽象 (D )是面向对象程序设计语言中的一种机制。这种机制实现了方法的定义与具体的对象无关, 而对方法的调用则可以关联于具体的对象。 A: 继承 B: 模板 C: 对象的…

关于hash的面试题

目录 题目1.java里,HashMap的底层实现原理2.如何判断一个HashMap是否已经满了?3.HashSet如何检查重复4.HashSet如何判断一个元素是否已经存在.简单的理解hash 题目 选自牛客网 1.java里,HashMap的底层实现原理 数组结构:HashMap 使用一个数…

vue2导入elementui组件库

第一步安装 npm i element-ui -S 第二步在main.js中导入 第三步使用然后在运行项目

【合集】临时邮箱网站 临时邮箱API(持续更新)

众所周知,在注册一些账户时,比较常见的验证方式就是邮箱,但是在进行一些小众和不知名网站注册时,邮箱的泄露可能预示着不休止的邮件推送。尤其是当我们只是想临时使用邮箱这种情况,第二种,批量注册账号的情…