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

news2024/11/26 19:55:58

文章目录

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

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

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

相关文章

达梦8 并行查询

达梦数据库可以通过在查询语句加/* parallel */ HINT并行执行。下面以一个排序语句为例 我们通过一条监控语句查询排序区的使用情况。 最初没有查询结果(no rows) 伴随着语句insert /* parallel(4) */ into d select * from a order by 2执行&#xff…

Redis系列之淘汰策略介绍

Redis系列之淘汰策略介绍 文章目录 为什么需要Redis淘汰策略?Redis淘汰策略分类Redis数据淘汰流程源码验证淘汰流程Redis中的LRU算法Redis中的LFU算法 为什么需要Redis淘汰策略? 由于Redis内存是有大小的,当内存快满的时候,又没有…

解决CSDN 导入Markdown图片失效不显示问题

每次将MarkDown文件导入CSDN的时候,有些图片总是由于防盗链的问题导致图片加载不出来,还得手动再导一遍,极其不方便。所以我们能不能建立一个属于自己的图片服务器或者说在线图库呢,而且每次使用Typora插入图片的时候都会自动的上…

【ARFoundation自学05】人脸追踪(AR Face manager)实现

1. 修改摄像机朝向渲染方式-选中user 这个方式就会调用前置摄像头 2 创建 AR Session、XR Origin,然后在XR Origin上面添加组件 注意:XR Origin 老版本仍然叫 AR Session Origin 接下来在XR Origin上面添加AR Face Manager组件,如下图&am…

差分原理+练习

差分的原理和前缀和相似,我们先联想一下前缀和。 前缀和计算下标从0到n的和,记为sum[n1];如果想要求出[l,r]区间的和,可以快速的通过sum[r1]-sum[l]来得到 。 前缀和适用于需要多次获取指定连续区间和的情景 而差分即计算相邻两个元素的差…

【Text2SQL 论文】How to prompt LLMs for Text2SQL

论文:How to Prompt LLMs for Text-to-SQL: A Study in Zero-shot, Single-domain, and Cross-domain Settings ⭐⭐⭐⭐ arXiv:2305.11853, NeurlPS 2023 Code: GitHub 一、论文速读 本文主要是在三种常见的 Text2SQL ICL settings 评估不同的 prompt constructio…

Mybatis编写SQL

文章目录 一、用注解编写1.1 增普通增加获取自增ID 1.2 删和改1.3 查单表查询多表查询 二、用xml编写2.1 使用xml的流程2.2 增普通增加获取自增ID 2.3 删 和 改2.4 查 三、#{} 和 ${}3.1 #{} 、${}3.1 预编译 SQL 、即时编译SQL 两种写法是可以同时存在的 一、用注解编写 1.1 …

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-24.5,6 SPI驱动实验-ICM20608 ADC采样值

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

【高校科研前沿】新疆生地所陈亚宁研究员团队在GeoSus发文:在1.5°C和2°C全球升温情景下,中亚地区暴露于极端降水的人口增加

目录 文章简介 1.研究内容 2.相关图件 3.文章引用 文章简介 论文名称:Increased population exposures to extreme precipitation in Central Asia under 1.5 ◦C and 2 ◦C global warming scenarios(在1.5C和2C全球变暖情景下,中亚地区…

数学建模 —— 灰色系统(4)

目录 什么是灰色系统? 一、灰色关联分析 1.1 灰色关联分析模型 1.2 灰色关联因素和关联算子集 1.2.1 灰色关联因素 1.2.2 关联算子集 1.3 灰色关联公理与灰色关联度 1.3.1 灰色关联度 1.3.2 灰色关联度计算步骤 1.4 广义关联度 1.4.1 灰色绝对关联…

[AI]大模型训练成本到底有多大?

大模型成本到底有多大,大到太平洋装不下。 上图是早前统计的,目前比较流行的大模型的厂家、模型名称、参数级别和类型。 大模型的成本主要有三块,分别是训练成本、推理成本、储存成本。 大模型的成本确实主要涉及训练成本、推理成本和储存成…

Python 包安装及常用命令【python 入门】

背景: 近期看到一个项目,做微信只能机器人,服务是使用python搭建的,于是拷贝下来自己打算跑一跑,部署一下,可是自己又没有python的经验,于是各种查资料学习,跟着敲一敲,顺…

Signac|成年小鼠大脑 单细胞ATAC分析(1)

引言 在本教程中,我们将探讨由10x Genomics公司提供的成年小鼠大脑细胞的单细胞ATAC-seq数据集。本教程中使用的所有相关文件均可在10x Genomics官方网站上获取。 本教程复现了之前在人类外周血单核细胞(PBMC)的Signac入门教程中执行的命令。…

【机器学习】使用Stable Diffusion实现潜在空间搜索

1、引言 1.1 潜在空间的概念 潜在空间(Latent Space)是在机器学习和深度学习中一个重要的概念,它指的是用于表示数据的一种低维空间。这个空间编码了数据中包含的所有有用信息的压缩表示,通常比原始数据空间的维数更低&#xff…

java守护线程介绍

在Java中,守护线程(Daemon Thread)是一种特殊类型的线程,它在后台默默地运行,为其他线程提供服务。当 JVM 中只剩下守护线程时,JVM 会退出。这意味着,守护线程不应该执行关键的任务,…

COMPUTEX 2024 国际电脑展即将举行,英伟达宣布将Copilot+引入RTX系列设备,赋能游戏本AI助理

COMPUTEX 2024 国际电脑展即将于2024年6月4日至7日在台北南港展览馆1馆及2馆盛大举行。作为业界瞩目的盛会,本次展会不仅吸引了全球各地的科技爱好者,更迎来了AMD CEO苏姿丰博士和NVIDIA首席执行官黄仁勋的精彩演讲。 在展会的开幕之际,图形…

【Python】教你彻底了解Python中的模块和包

​​​​ 文章目录 一、模块的概念1. 导入模块2. 导入特定对象3. 给模块或对象取别名 二、标准库模块1. 常用标准库模块2. 使用示例 三、自定义模块1. 创建模块2. 使用自定义模块 四、包的结构与使用1. 创建包2. 使用包中的模块 五、包的深入使用1. 相对导入2. 子包3. 使用子包…

策略模式+简单工厂

🍇工厂模式 🍈工厂模式向策略模式过度——工厂加一个保安 🍏策略模式 🍐策略模式简单工厂 声明本文需要理解多态的基础上才能来学习 欢迎前来学习——继承和多态 学习记录 工厂模式 需要什么就生成什么 // 工厂模式 class Fact…

DP读书:如何使用badge?(开源项目下的标咋用)

最近在冲论坛,很少更一些内容了。但遇到了一个真的有趣的: 开源项目下,蓝蓝绿绿的标是怎么用的呢? 这是我的主页Readme,在看一些NXP的主仓时,突然发现没有这个玩,就自己整了个 再比如我的CSDN专…

php高级之框架源码、宏扩展原理与开发

在使用框架的时候我们经常会看到如下代码 类的方法不会显示地声明在代码里面&#xff0c;而是通过扩展的形式后续加进去&#xff0c;这么做的好处是可以降低代码的耦合度、保证源码的完整性。我自己看着框架源码实现了这个功能。 以下是结果: base代码 index.php <?php…