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.rhkb.cn/news/344979.html

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

相关文章

2024年【天津市安全员C证】免费试题及天津市安全员C证试题及解析

题库来源:安全生产模拟考试一点通公众号小程序 天津市安全员C证免费试题是安全生产模拟考试一点通生成的,天津市安全员C证证模拟考试题库是根据天津市安全员C证最新版教材汇编出天津市安全员C证仿真模拟考试。2024年【天津市安全员C证】免费试题及天津市…

VBA excel 表格将多行拆分成多个表格或 文件 或者合并 多个表格

excel 表格 拆分 合并 拆分工作表按行拆分为工作表工作表按行拆分为工作薄 合并操作步骤 拆分 为了将Excel中的数万行数据拆分成多个个每个固定行数的独立工作表,并且保留每个工作表的表头,你可以使用以下VBA脚本。这个脚本会复制表头到每个新的工作表&…

行心科技中禄松波携手,开启智能健康新时代

在2024年第34届健博会暨中国大健康产业文化节的盛大舞台上,广州市行心信息科技有限公司(以下简称“行心科技”)与浙江中禄松波生物工程有限公司(以下简称“中禄松波”)宣布达成战略合作,共同推动医康养产业…

socket通信(C语言+Python)

在socket文件夹下创建server.c和client.c。 服务端代码&#xff08;server.c&#xff09;&#xff1a; #include <stdio.h> #include <Winsock2.h> void main() {WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested MAKEWORD( 1, 1 );err WSAS…

探索 Noisee AI 的奇妙世界与变现之旅

日赚800&#xff0c;利用淘宝/闲鱼进行AI音乐售卖实操 如何让AI生成自己喜欢的歌曲-AI音乐创作的正确方式 抖音主播/电商人员有福了&#xff0c;利用Suno创作产品宣传&#xff0c;让产品动起来-小米Su7 用sunoAI写粤语歌的方法&#xff0c;博主已经亲自实践可行 五音不全也…

通道堵塞自动识别摄像机

通道堵塞自动识别摄像机是一种利用先进的人工智能和图像识别技术来监测和识别通道堵塞情况的装置&#xff0c;广泛应用于交通管制、商场管理等领域。这项技术的出现极大地提高了通道管理的效率和准确性&#xff0c;为改善人们的出行体验和商场营运提供了新的解决方案。 传统的通…

Vue3【十一】08使用toRefs和toRef

08使用toRefs和toRef toRefs()函数将person对象中的name和age属性转换为响应式引用&#xff0c;并返回一个对象&#xff0c;对象中的name和age属性都是响应式引用&#xff0c;具有响应式功能。 toRef()函数将person对象中的name属性转换为响应式引用&#xff0c;并返回一个响应…

Doris Connector 结合 Flink CDC 实现 MySQL 分库分表

1. 概述 在实际业务系统中为了解决单表数据量大带来的各种问题&#xff0c;我们通常采用分库分表的方式对库表进行拆分&#xff0c;以达到提高系统的吞吐量。 但是这样给后面数据分析带来了麻烦&#xff0c;这个时候我们通常试将业务数据库的分库分表同步到数据仓库时&#x…

最新PHP众筹网站源码 支持报名众筹+商品众筹+公益众筹等多种众筹模式 含完整代码包和部署教程

在当今互联网飞速发展的时代&#xff0c;众筹模式逐渐成为了创新项目、商品销售和公益活动融资的重要渠道。分享一款最新版的PHP众筹网站源码&#xff0c;支持报名众筹、商品众筹和公益众筹等多种众筹模式。该源码包含了完整的代码包和详细的部署教程&#xff0c;让新手也可以轻…

java之面向对象

1 面向对象介绍 <span style"background-color:#f8f8f8"><span style"color:#333333">1.面向过程:自己的事情自己干,代表语言C语言洗衣服:每一步自己要亲力亲为 -> 找个盆,放点水,找个搓衣板,搓搓搓 2.面向对象:自己的事情别人帮忙去干,代…

STM32 uc/OS-III多任务程序

目录 一、项目创建 二、代码移植 1、uC/OS-III源码处理 2、KEIL文件配置 ​编辑3、文件修改 启动文件 ​编辑app_cfg.h includes.h bsp.c和bsp.h main.c lib_ cfg.h app.c和app.h 三、总结 学习目标&#xff1a; 学习嵌入式实时操作系统&#xff08;RTOS&#xf…

三端植物大战僵尸杂交版来了

Hi&#xff0c;好久不见&#xff0c;最近植物大战僵尸杂交版蛮火的 那今天苏音整理给大家三端的植物大战僵尸杂交版包括【苹果端、电脑端、安卓端】 想要下载的直接划到最下方即可下载。 植物大战僵尸&#xff0c;作为一款古老的单机游戏&#xff0c;近期随着B站一位UP主潜艇…

【数据结构初阶】栈和队列

1. 栈 1.1 栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;&#xf…

HTML开发 Vue2.x + Element-UI 动态生成表单项并添加表单校验

基于vue2.x 和element-ui 动态生成表单项并添加表单校验&#xff1b; 1、需求问题 如下图&#xff0c;项目有个需求&#xff0c;点击添加按钮&#xff0c;新增一行设备信息&#xff0c;且每项信息必填&#xff1b; 2、代码 看到这个需求&#xff0c;首先想到要使用v-for的形…

springboot集成uid-generator生成分布式id

一、简介 uid-generator是由百度技术部开发,GitHub地址 UidGenerator是Java实现的, 基于Snowflake算法的唯一ID生成器 Snowflake算法 Snowflake算法描述&#xff1a;指定机器 & 同一时刻 & 某一并发序列&#xff0c;是唯一的。据此可生成一个64 bits的唯一ID&#x…

Windows 宿主机访问 VirtualBox 虚拟机中创建的 docker 容器中的 mysql8.0 的数据

一、场景需求 在开发环境中&#xff0c;一般使用 windows 系统进行开发&#xff0c;但需要在 linux 系统中创建运行 mysql8.0 的 docker 容器中进行测试&#xff08;win10特定版本或win11才能安装 docker&#xff09;&#xff0c;为了方便还需要在 windows 系统中通过 SQLyog …

Python轻量级嵌入式关系数据库之apsw使用详解

概要 在现代应用开发中,数据库是一个非常重要的组成部分。SQLite 是一个轻量级的嵌入式关系数据库管理系统,被广泛应用于各种应用程序中。APSW(Another Python SQLite Wrapper)库是一个专门用于访问 SQLite 数据库的 Python 包,它提供了 SQLite 所有的功能,并且比标准库…

【教学类-40-01】20240607类似MJ的免费AI绘画工具——文心一格与通义万相

背景需求&#xff1a; 风变的AI对话大师一年到期了&#xff0c;也没有看到续费的按钮。不能使用它写代码了。 MJ早就用完了&#xff0c;最后480次&#xff0c;我担心信息课题会用到它生图&#xff0c;所以不敢用。 最近探索其他类似MJ的免费出图工具 一、文心一格&#xff08;…

各种空气能热泵安装图

空气能热泵安装图 循环式空气能热泵安装图 直热循环式空气能热泵安装图 泳池空气能热泵安装图 循环式水源热泵热安装系统原理图 直热循环式水源热泵安装系统图 空气水源热泵安装图

XUbuntu24.04之ch9344(usb转串口芯片)安装驱动(二百四十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…