Docker 基础使用(2) 镜像与容器

文章目录

  • 镜像的含义
  • 镜像的构成
  • 镜像的作用
  • 镜像的指令
  • 容器的含义
  • 容器的状态
  • 容器的指令

Docker 基础使用(0)基础认识
Docker 基础使用 (1) 使用流程概览
Docker 基础使用(2) 镜像与容器
Docker 基础使用(3) 存储卷

镜像的含义

Docker image 即镜像, 本质上是一个个只读文件这个文件包含了文件系统、源码、库文件、依赖、工具等一些运行应用程序必须的资源。 镜像可以理解为面向对象编程中的类, 可以实例化出许多容器。

镜像的构成

镜像中是一层层Union FS (Union File System译为:联合文件系统) , 联合文件系统可以将多层目录挂载到同一目录下,形成一个虚拟文件系统 。每一层文件系统我们叫做一层 layer。联合文件系统可以对每一层文件系统设置三种权限,只读(readonly)、读写(readwrite)和写出(whiteout-able),但是docker 镜像中每一层文件系统都是只读的。

这种设计使得镜像在构成时的流程为,从一个最基本的操作系统开始,每个构建的操作都相当于做一层的修改,增加了一层文件系统。一层层往上叠加,上层的修改会覆盖底层该位置的可见性。

镜像的作用

功能在本地开发后传入云端运行, 为了避免运行环境的差异导致的运行问题,Docker将所有用到的环境配置一起"打包"生成镜像。Docker的核心设计是“容器镜像的分层的存储格式”,这种设计实现的基础是联合文件系统。

(看完前面只需要知道,镜像是一个类似于类的东西,镜像是由多层文件系统构成的)

所以镜像的作用有(或者说分层设计的优势):

节约存储空间:镜像的层可以被共享。如果多个镜像共享相同的层,这些层只需要在磁盘上存储一次,从而节约存储空间。

提高镜像的可复用性:镜像的层可以被重复使用。当一个镜像被修改时,只需存储新增的或修改过的层,而其他层可以继续被之前的镜像所使用。

加快镜像的传输速度:当镜像需要从一个地方传输到另一个地方时,只需传输新增或修改的层,而不需要传输整个镜像,这样可以大大加快传输速度。

便于镜像的管理:通过分层,可以更加方便地管理和组织镜像的不同部分,使得镜像的构建、共享和更新变得更加灵活和高效。

镜像的指令

(注意:只说明常用指令的存在,具体以及指令的拓展用法还是随用随查)

# 列出本地镜像
docker images
# 给镜像打标签,可用于推送镜像仓库
docker tag
# 拉取镜像
docker pull
# 推送镜像
docker push
# 删除镜像
docker rmi
# 用于使用 Dockerfile 创建镜像
docker build
# 将指定镜像保存成 tar 归档文件
docker save
#导入使用 docker save 命令导出的镜像
docker load
# 查看镜像历史
docker history
# 从归档文件中创建镜像。
docker import 
# 删除不使用的镜像
docker image prune

容器的含义

1.容器是镜像的实例化,镜像是只读文件,容器可读也可写。
2.容器中运行着进程。
3.容器有初建、运行、停止、暂停和删除五种状态。
4.容器本身也是一个进程,这个进程的不同之处在于做了更多的资源隔离。在容器内部,观测到宿主机上的进程、环境变量、网络等信息,这是容器与直接运行在主机上进程的本质区别。
5. 容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。 这将添加一个容器层,该层允许修改镜像的整个副本。

容器的状态

  1. created:初建状态
  2. running:运行状态
  3. stopped:停止状态
  4. paused: 暂停状态
  5. deleted:删除状态
docker create : 创建容器后,不立即启动运行,容器进入初建状态;
docker run : 创建容器,并立即启动运行,进入运行状态;
docker start : 容器转为运行状态;
docker stop : 容器将转入停止状态;
docker kill : 容器在故障(死机)时,执行 kill(断电),容器转入停止状态,这种操作容易丢失数据,除非必要,否则不建议使用;
docker restart : 重启容器,容器转入运行状态;
docker pause : 容器进入暂停状态;
docker unpause : 取消暂停状态,容器进入运行状态;
docker rm : 删除容器,容器转入删除状态。

容器对于OOM事件的处理:

OOM是Out Of Memory的缩写,中文翻译为内存溢出。

在启动容器时,可以使用Docker命令行工具或者Docker Compose文件来设置容器的内存限制。例如,通过docker run命令,可以使用-m标志来指定容器的内存限制,例如docker run -m 512m my_container表示将最大内存限制设置为512MB。

对于OOM事件,Docker通常有以下三种处理方案:

(1)如果容器中的应用耗尽了主机系统分配给容器的内存限额,就会触发 OOM 事件。例如,在容器当中,部署了一个 web 服务。假设主机分配给此容器的内存上限为 1G,当脚本申请的内存大于 1G 时,此容器就会触发 OOM 事件。而在这种情况下,此容器将会被强制关闭。但需要注意的是,**此时关闭容器的并非是 Docker Daemon,而是宿主机操作系统。**因为一个容器其实就是一组运行在宿主机操作系统当中的进程,宿主机操作系统通过cgroups 对这组进程设定资源上限,当这些进程申请的资源到达上限时,触发的是宿主机操作系统的内核 OOM 事件,因此最终是由宿主机内核来关闭这些进程.

(补充:Docker Daemon是Docker引擎的后台进程,负责管理Docker对象(如镜像、容器、网络等)的创建、运行和分发。它接受来自Docker API的请求,并通过与其他进程通信来执行这些请求。Docker Daemon还负责与Docker客户端进行通信,并监控容器的运行状态。)

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

(补充: 禁用的完整命令为 docker run --oom-kill-disable --memory=1g my_container
(补充: hung 状态即为挂起状态)

在这里插入图片描述

(3) 如果用户使用了–oom-kill-disable,但也没有使用-m 来设定上限,因而此时此容器将会尽可能多地使用主机内存资源。换言之,主机内存有多大,它就将用多大

容器异常退出的处理流程

每个容器内部都存在一个 Init 进程(类似于Linux中的进程ID为1的进程),容器中其他所有进程都是此进程的子进程。运行的容器是因为 Init 进程在运行,如果一个子进程因为某种原因造成了退出,那么其父进程也会同步退出,直至 Init 进程也退出。当 Init 进程退出时,也就代表着此容器被关闭。ocker 目前没有办法知道此时的进程退出属于正常退出还是异常退出。当出现容器关闭情况时,Docker Daemon 会尝试再次重新将此容器由 Stopped 状态转为 Running 状态。(只有设置了–restart 参数的容器,Docker Daemon 才会去尝试启动,否则容器会保持停止状态。)

容器暂停状态的解释

即容器不被分配CPU资源

容器的指令

(注意:只说明常用指令的存在,具体以及指令的拓展用法还是随用随查)

# 创建一个新的容器但不启动它
docker create
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

○ -i: 以交互模式运行容器,通常与 -t 同时使用;
○ -P: 随机端口映射,容器内部端口随机映射到主机的端口
○ -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
○ -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
○ --name="nginx-lb": 为容器指定一个名称;
○ -h "mars": 指定容器的 hostname;
○ -e username="ritchie": 设置环境变量;
○ --cpuset-cpus="0-2" or --cpuset-cpus="0,1,2": 绑定容器到指定 CPU 运行;
○ -m :设置容器使用内存最大值;
○ --network="bridge": 指定容器的网络连接类型;
○ --link=[]: 添加链接到另一个容器;
○ --volume , -v: 绑定一个卷
○ --rm :shell 退出的时候自动删除容器

# 创建一个新的容器并运行一个命令
docker run 
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]


○ -d: 后台运行容器,并返回容器 ID;比 create 多了这个参数
○ -i: 以交互模式运行容器,通常与 -t 同时使用;
○ -P: 随机端口映射,容器内部端口随机映射到主机的端口
○ -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
○ -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
○ --name="nginx-lb": 为容器指定一个名称;
○ -h "mars": 指定容器的 hostname;
○ -e username="ritchie": 设置环境变量;
○ --cpuset-cpus="0-2" or --cpuset-cpus="0,1,2": 绑定容器到指定 CPU 运行;
○ -m :设置容器使用内存最大值;
○ --network="bridge": 指定容器的网络连接类型;
○ --link=[]: 添加链接到另一个容器;
○ --volume , -v: 绑定一个卷
○ --rm :shell 退出的时候自动删除容器
○ --restart:自动重启
# 列出容器
docker ps
docker ps [OPTIONS]-a :显示所有的容器,包括未运行的。
○ -f :根据条件过滤显示的内容。
○ --format :指定返回值的模板文件。如 json 或者 table
○ -l :显示 latest 的容器。
○ -n :列出最近创建的 n 个容器。
○ --no-trunc :不截断输出。
查看容器日志
docker logs
连接到正在运行中的容器
docker attach
在容器中执行命令
docker exec
启动停止的容器
docker start
停止运行的容器
docker stop
重启容器 
docker restart
强制退出容器
docker kill
查看容器中运行的进程信息,支持 ps 命令参数
docker top
显示容器资源的使用情况,例如CPU、内存、网络 I/O 等。
docker stats
查看容器详细信息
docker container inspect
用于列出指定的容器的端口映射
docker port
在容器和宿主机之间拷贝文件
docker cp
检查容器里文件结构的更改
docker diff
从容器创建一个新的镜像。
docker commit
暂停容器中所有的进程
docker pause
恢复容器中所有的进程
docker unpause
删除停止的容器 
docker rm
导出容器内容为 tar 文件
docker export
阻塞运行直到容器停止,然后打印出它的退出代码。
docker wait
重命名容器 
docker rename
删除所有停止的容器
docker container prune
更新容器配置
docker update

需要注意的相似指令间的区别

1. docker create / docker start / docker run

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

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

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

2. docker import / docker load

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

docker export container_id:将一个容器导出为文件,再使用 docker import 命令将容器导入成为一个新的镜像,但是相比 docker save 命令,容器文件会丢失所有元数据和历史记录,仅保存容器当时的状态。可以使用docker import 命令来导入一个容器快照到本地镜像库。两者的区别在于容器快照将会丢弃所有的历史记录和元数据信息,而镜像存储文件将保存完整记录,体积也会更大。

3. docker rm / docker rmi / docker prune

docker rm : 删除一个或多个容器
docker rmi : 删除一个或多个镜像
docker prune: 用来删除不再使用的 docker 对象, 删除所有已停止的容器、悬空镜像以及未使用的网络和卷。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于stm32的复用和重映射问题

目录 需求IO口的复用和重映射使用复用复用加重映射 总结参考资料 需求 一开始使用stm32c8t6,想实现pwm输出,但是原电路固定在芯片的引脚PB10和PB11上,查看了下引脚的功能,需要使用到复用功能。让改引脚作为定时器PWM的输出IO口。…

tinyrenderer-切线空间法线贴图

法线贴图 法线贴图分两种,一种是模型空间中的,一种是切线空间中的 模型空间中的法线贴图的rgb代表着每个渲染像素法线的xyz,与顶点坐标处于一个空间,图片是五颜六色的。 切线空间中的法线贴图的rgb同样对应xyz,是切线…

排序算法(C++)

参考C算法,这里面有些写法也值得商榷。 1. 冒泡排序算法 冒泡排序算法代码和思路比较简单,大家如果在面试时被要求实现排序时,可以用这种方法来实现。 该算法里,会统一地遍历待排序的数据,每次比较两个相邻的数据&a…

零基础也能学!在RK平台下的OpenHarmony分区镜像烧录

开源鸿蒙硬件方案领跑者 触觉智能 本文适用于在Purple Pi OH开发板进行分区镜像烧录。触觉智能的Purple Pi OH鸿蒙开源主板,是华为Laval官方社区主荐的一款鸿蒙开发主板。 该主板主要针对学生党,极客,工程师,极大降低了开源鸿蒙开…

【Java】设计一个支持敏感数据存储和传输安全的加解密平台

一、问题解析 在一个应用系统运行过程中,需要记录、传输很多数据,这些数据有的是非常敏感的,比如用户姓名、手机号码、密码、甚至信用卡号等等。这些数据如果直接存储在数据库,记录在日志中,或者在公网上传输的话&…

极海APM32F072用Keil5烧录失败Error: Flash Download failed -“Cortex-MO+“

在用Keil5烧录时,出现错误弹窗,大概长这样: 检查了一圈设置,都搞不好。 先用J-Flash,显示读写保护(未截图),会跳出界面让选择是否解除读写保护: 1.点击允许读操作YES&am…

循环购模式!增加用户复购的不二之选!

大家好,我是吴军,来自一家专注于软件开发与商业模式设计的公司。我们主要业务是构建商城系统,并为各类企业提供全面的商业模式解决方案。目前,我们已经成功开发了超过200种独特的商业模式,帮助许多企业实现了他们的商业…

C++_deque:deque的数据结构特点

文章目录 🚀1. deque介绍🚀2. deque数据结构🚀3. deque的缺陷🚀4.为什么选择deque作为stack和queue的底层默认容器🚀5.deque头插逻辑(了解) 大家好!本文会简单讲讲deque的使用与数据…

实现流程化办公,可以相信拖拽表单设计器!

当前,竞争压力越来越大,利用什么样优良的办公软件实现流程化办公?可以一起来了解低代码技术平台、拖拽表单设计器的优势特点,看看它们是如何助力企业降本、增效、提质的。低代码技术平台的优势特点多,可以助力企业用拖…

第99天:权限提升-数据库提权口令获取MYSQLMSSQLOracleMSF

案例一:提权条件-数据库帐号密码获取方式 提权条件 - 数据库帐号密码获取方式 0 、网站存在高权限 SQL 注入点 1 、数据库的存储文件或备份文件 2 、网站应用源码中的数据库配置文件 3 、采用工具或脚本爆破 ( 需解决外联问题 ) sql注入点 xhcms后台管理系统…

刷新页面控制台莫名奇妙报错显示/files/test_files/file_txt.txt

今天突然发现每次刷新页面都有几个报错,不刷新页面就没有。 这个报错应该不是我们系统的问题,是因为装了浏览器插件的原因。比如我安装了 大家有没有遇到类似的问题。

MyBatis快速入门教程

文章目录 一、介绍什么是持久层为什么要学MyBatis? 二、如何获得MyBatis?三、第一个Mybatis程序数据库导入maven依赖bean 实体类dao持久层resources编写对应的映射文件 mybatis主配置文件测试类运行遇到报错Could not find resource com/qibu/dao/IUserD…

Park Here:城市停车新神器,让停车不再难

在现代城市的快节奏生活中,停车问题往往成为驾驶者的一大困扰。无论是寻找停车位时的焦虑,还是对停车规则的不了解,都让停车变得不那么简单。然而,随着科技的发展,一款名为“Park Here”的移动应用程序正逐渐改变这一现…

论文精读--Swin Transformer

想让ViT像CNN一样分成几个block,做层级式的特征提取,从而使提取出的特征有多尺度的概念 Abstract This paper presents a new vision Transformer, called Swin Transformer, that capably serves as a general-purpose backbone for computer vision. …

做了几年的广告设计,发现一些东西

我换了多个行业,发现了一些广告设计的一些行业规律,先从面试说起。 他们面试比较倾向是本行业的,找到他们去当前公司来当设计,但是重点;还是不喜欢我这种经常被试用期不合格的情况。 还有甲方公司,经常需要…

【机器学习】【遗传算法】【项目实战】药品分拣的优化策略【附Python源码】

仅供学习、参考使用 一、遗传算法简介 遗传算法(Genetic Algorithm, GA)是机器学习领域中常见的一类算法,其基本思想可以用下述流程图简要表示: (图参考论文:Optimization of Worker Scheduling at Logi…

EMQX Enterprise 5.7 发布:新增会话持久化、消息 Schema 验证、规则引擎调试与追踪功能

EMQX Enterprise 5.7.0 版本现已正式发布! 在这个版本中,我们引入了一系列新的功能和改进,包括会话持久化、消息 Schema 验证、规则引擎调试与追踪测试等功能。此外,新版本还进行了多项改进以及 BUG 修复,进一步提升了…

QT 编译Lua 动态库,使用Lua脚本混合编程

一,编译Lua动态库 1,下载lua源码 地址:Lua: downloadhttps://www.lua.org/download.html 2,配置 解压lua源码压缩包,里面有个src文件夹,里面的代码就是lua的源码

TMS320F280049 ECAP模块--capture模式(1)

功能框图 event预分频 如下图所示,可以对输入信号进行预分频。 一次性触发和连续触发 如下图所示,可以进行一次性触发,也可以进行连续触发。 中间计数器的clk是事件1-4,stop是由一次性触发逻辑控制,rst是由ctrfiltre…

【数据结构与算法 经典例题】(C语言)反转链表图文详解

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《数据结构与算法 经典例题》C语言 期待您的关注 ​ 目录 一、问题描述 二、解题思路分析 三、代码实现 一、问题描述 二、解题…