docker(四)使用篇二:docker 镜像

 在上一章中,我们介绍了 docker 镜像仓库,本文就来介绍 docker 镜像。

一、什么是镜像

docker 镜像本质上是一个 read-only 只读文件, 这个文件包含了文件系统、源码、库文件、依赖、工具等一些运行 application 所必须的文件。

我们可以把 Docker 镜像 理解成一个模板,通过这个模板,可以实例化出来很多容器

docker 镜像里面由一层层 Union FS(联合文件系统)组成

镜像生活案例

镜像相当于我们 java 或者 C++中的类,相当于一个模板,可以很方便的构建出来不同的对象。

docker 镜像的组合层核心:联合文件系统(Union FS)

联合文件系统可以将几层文件目录挂载到一起,形成一个虚拟文件系统。

每一层文件系统我们叫做一层 layer,联合文件系统可以对每一层文件系统设置三种权限,只读(readonly)、读写(readwrite)和写出(whiteout-able),但是 docker 镜像中每一层文件系统都是只读的。(PS:联合文件系统的读写速度都比较慢)

构建镜像的时候,会从一个最基本的操作系统开始构建;每个构建的操作都相当于做一层文件目录的修改,即增加了一层文件系统。

一层层往上叠加,上层的修改会覆盖底层该位置的可见性。这也很容易理解,就像上层把底层遮住了一样。当使用的时候,只会看到一个完全的整体,不知道里面有几层,也不清楚每一层所做的修改是什么。

联合文件系统使得容器可以拥有自己的文件视图(即容器层),同时共享宿主机或者其他容器的基础镜像层(只读层)。这种方式不仅减少了存储空间的使用,而且提高了容器启动速度,因为只需要复制必要的镜像即可创建新的容器

联合文件系统镜像分层生活案例

我们以日常的地板为例,开发商的房子提供给用户的时候一般是做好了地暖,而这些地暖其实是一层一层添加的,最底层的钢筋水泥层,然后添加保温层,采暖管,再铺设水泥层,到最后交付的时候家家户户都是水泥面,这些层一般是不可修改的。

最上层用户一般会再铺设商木地板或者地板砖每家每户的选择不一样,相当于我们镜像的容器层。

二、为什么需要镜像

1、通过打包,解决环境不一致问题

在部署应用时,原先是通过手工 / 写一些脚本的方式进行部署。这样部署面临的最大问题就是云端和本地环境可能不一致。用户为每个应用打包过程比较繁琐,需要配置和修改等操作,非常费劲。 Docker 镜像就是为了解决这个小小的打包功能,突然一夜之间成名。

那么,读者可能会猜测 Docker 镜像就是个压缩包,是的,猜对了,它就像一个压缩包文件。那么它是如何解决 Paas 时代所面临的云端和本地一致性问题?

很简单,它是把一个镜像制作成一个完整的操作系统,有所有文件和对应的目录结构,这样的压缩包跟你本地和测试环境用的操作系统一摸一样。

2、减少空间占用,加速软件开发

docker 最大的贡献就是定义了容器镜像的分层的存储格式docker 镜像技术的基础是联合文件系统(UnionFS),其文件系统是分层的。这样既可以充分利用共享层,又可以减少存储空间占用。

docker 镜像提供了一种打包应用程序和预配置服务器环境的便捷方式,也可以很方便的将其用于个人用途或与其他 Docker 用户公开共享。

三、核心:镜像相关命令

命令清单

命令别名功能备注
docker pulldocker image pull从镜像仓库中拉取镜像和镜像仓库命令相同,亦可以归类为镜像命令
docker pushdocker image push推送镜像到仓库和镜像仓库命令相同,亦可以归类为镜像命令
docker images
docker image
ls / docker
image list
列出本地镜像必须掌握
docker tagdocker image tag给本地某个镜像打标签(标记版本),在推送镜像到仓库时比较有用必须掌握
docker rmi
docker image
rm / docker
image remove
删除本地某个镜像必须掌握
docker builddocker image build通过 dockerfile 制作镜像必须掌握
docker savedocker image save把制定镜像保存成 tar 格式的归档文件必须掌握
docker loaddocker image load导入使用 docker save 保存的 tar 格式的镜像文件必须掌握
docker image inspect查看镜像的详细信息必须掌握
docker history
docker image
history
查看镜像历史
docker import
docker image
import
从归档文件 docker export 中创建镜像。 (与容器 docker export 对应,在下一章容器章节讲解)
docker prune
删除不使用的镜像

 1、docker images

# RESPOSITORY 指的是镜像所在仓库名
docker images [关键参数] [RESPOSITORY[:TAG]]

关键参数

无参情况:列出本地所有镜像

-a:列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);

--digests:显示镜像的摘要信息;

-f:显示满足条件的镜像;

--format:指定返回值的模板文件;

--no-trunc:显示完整的镜像信息;

-q :只显示镜像 ID

功能: 列出本地镜像

# 列出本地全部镜像
docker images
# 列出本地镜像中 REPOSITORY 为 ubuntu 的镜像列表。
docker images ubuntu

2、docker tag

# SOURCE_IMAGE:原镜像名
# TARGET_IMAGE:目标镜像名(可以加上仓库地址,就可以归入某一仓库)
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

功能: 给本地镜像打标签,并归入某一仓库(目的通常为推送做准备)

可以看见,给 nginx 镜像打了个标签,仓库中会多出一个相同镜像ID不同 REPOSITORY 的镜像,这个镜像就可以作为推送到仓库的一个版本

 3、docker rmi

# 可以同时删除多个镜像
docker rim [关键参数] 镜像名....

关键参数

-f:强制删除;

--no-prune:不移除该镜像的过程镜像,默认移除;

 功能:删除指定镜像

(PS:删除前需要把引用了该镜像的容器删掉之后才能删除镜像;由于是比较暴力的删除镜像,用的较少,一般使用 docker rm 删除容器)

成功删除

4、docker save

# 可以同时把多个镜像归档到一个文件
docker save [关键参数] 镜像名...

 功能:把指定的镜像保存成 tar 归档文件,便于在各个服务器上分发

关键参数

-o:把镜像保存到哪一个文件中,(可以同时写上路径,就保存在那个路径中;只写文件名则是默认保存在当前文件夹中) 

成功归档

 5、docker load

docker load [关键参数]

功能:把 tar 文件再加载成镜像

关键参数

--input , -i : 导入的文件的文件名,代替 STDIN

--quiet , -q : 精简输出信息。(默认是一层层导入的,会全部展示)

 

可以发现精简了很多

6、docker image inspect

# 可以同时查看多个镜像
docker image inspect [关键参数] 镜像名...

 功能:查看镜像的详细信息

(PS:如果是 docker inspect 的话,docker 会自动判断是镜像还是容器,然后显示信息)

查看详细信息

7、docker history

docker history [关键参数] 镜像名

功能:显示镜像的历史 

关键参数:

-H , --human:大小和日期采用人容易读的格式展现

--no-trunc:显示全部信息,不要隔断(不截断的话像 ID 等都会很长)

-q, --quiet:只显示镜像 id 信息

从左往右每一列的意义依次是:镜像名、镜像创建时间、通过什么命令创建(dockerfile 命令,后文会说)、镜像大小、注释

8、docker import

其与容器 docker export 对应,二者搭配使用,因此将在下一章容器进行讲解

9、docker image prune

docker image prune [关键参数]

功能:删除当前未使用的镜像

(PS:无参的话,会删除虚悬镜像,即那些既没有标签又被没有任何容器引用的镜像)

关键参数:

-a , --all:删除全部不使用的镜像(只要没有容器使用,就被视作未使用镜像,比较危险,慎用) 

--filter filter:指定过滤条件;

-f, --force:不提示是否删除;

无参情况,删除虚悬镜像;加上 -a ,会把所有未被容器使用的镜像删除,比较危险!

 

10、docker build

docker build [关键参数] PATH | URL | -

功能:用于使用 dockfile 创建镜像(会在 dockerfile 制作镜像章节详细讲解)

关键参数:

--build-arg=[] :设置镜像创建时的变量;

-f :指定要使用的 Dockerfile 路径;

--label=[] :设置镜像使用的元数据;

--no-cache :创建镜像的过程不使用缓存;

--pull :尝试去更新镜像的新版本;

--quiet, -q :安静模式,成功后只输出镜像 ID

--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构

建中为一个镜像设置多个标签。

--network: 默认 default。在构建期间设置 RUN 指令的网络模式

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

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

相关文章

k8s 1.10.26 一次containerd失败引发kubectl不可用问题

k8s 1.10.26 一次containerd失败引发kubectl不可用问题 开机k8s 1.10.26时,报以下错误 [rootmaster ~]# kubectl get no E0515 08:03:00.914894 7993 memcache.go:265] couldnt get current server API group list: Get "https://192.168.80.50:6443/api?…

今日积累:若依框架配置QQ邮箱,来发邮件,注册账号使用

QQ邮箱SMTP服务器设置 首先,我们需要了解QQ邮箱的SMTP服务器地址。对于QQ邮箱,SMTP服务器地址通常是smtp.qq.com。这个地址适用于所有使用QQ邮箱发送邮件的客户端。 QQ邮箱SMTP端口设置 QQ邮箱提供了两种加密方式:SSL和STARTTLS。根据您选…

无缝部署您的应用程序:将 Jenkins Pipelines 与 ArgoCD 集成

在 DevOps 领域,自动化是主要目标之一。这包括自动化软件部署方式。与其依赖某人在部署软件的机器上进行 rsync/FTP/编写软件,不如使用 CI/CD 的概念。 CI,即持续集成,是通过代码提交创建工件的步骤。这可以是 Docker 镜像&#…

4.2.3 Thymeleaf标准表达式 - 5. 片段表达式

在本次实战中,我们通过 Thymeleaf 的片段表达式实现了模板的模块化和复用。首先,我们定义了一个导航栏片段 navbar,并通过参数 activeTab 动态高亮当前激活的标签。然后,我们在多个页面(如主页、关于页和联系页&#x…

网安面试经(1)

1.说说IPsec VPN 答:IPsec VPN是利用IPsec协议构建的安全虚拟网络。它通过加密技术,在公共网络中创建加密隧道,确保数据传输的保密性、完整性和真实性。常用于企业分支互联和远程办公,能有效防范数据泄露与篡改,但部署…

【C++/Qt shared_ptr 与 线程池】合作使用案例

以下是一个结合 std::shared_ptr 和 Qt 线程池(QThreadPool)的完整案例,展示了如何在多线程任务中安全管理资源,避免内存泄漏。 案例场景 任务目标:在后台线程中处理一个耗时的图像检测任务,任务对象通过 …

【Unity】 HTFramework框架(六十五)ScrollList滚动数据列表

更新日期:2025年5月16日。 Github 仓库:https://github.com/SaiTingHu/HTFramework Gitee 仓库:https://gitee.com/SaiTingHu/HTFramework 索引 一、ScrollList滚动数据列表二、使用ScrollList1.快捷创建ScrollList2.ScrollList的属性3.自定义…

经典案例 | 筑基与跃升:解码制造企业产供销协同难题

引言 制造企业如何在投产初期突破管理瓶颈,实现高效运营?G公司作为某大型集团的新建子公司,面对产供销流程缺失、跨部门协同低效等难题,选择与AMT企源合作开展流程优化。 项目通过端到端流程体系搭建、标准化操作规范制定及长效管…

【Python 操作 MySQL 数据库】

在 Python 中操作 MySQL 数据库主要通过 pymysql 或 mysql-connector-python 库实现。以下是完整的技术指南,包含连接管理、CRUD 操作和最佳实践: 一、环境准备 1. 安装驱动库 pip install pymysql # 推荐(纯Python实现&#xff0…

记录vsCode连接gitee并实现项目拉取和上传

标题 在 VSCode 中上传代码到 Gitee 仓库 要在 VSCode 中将代码上传到 Gitee (码云) 仓库,你可以按照以下步骤操作: 准备工作 确保已安装 Git确保已安装 VSCode拥有 Gitee 账号并创建了仓库 可以参考该文章的部分:idea实现与gitee连接 操…

【信息系统项目管理师】第6章:项目管理概论 - 31个经典题目及详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 第一节 PMBOK的发展【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】第二节 项目基本要素【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】第三节 项目经…

简单介绍C++中线性代数运算库Eigen

Eigen 是一个高性能的 C 模板库,专注于线性代数、矩阵和向量运算,广泛应用于科学计算、机器学习和计算机视觉等领域。以下是对 Eigen 库的详细介绍: 1. 概述 核心功能:支持矩阵、向量运算,包括基本算术、矩阵分解&…

生产级编排AI工作流套件:Flyte全面使用指南 — Core concepts Launch plans

生产级编排AI工作流套件:Flyte全面使用指南 — Core concepts Launch plans Flyte 是一个开源编排器,用于构建生产级数据和机器学习流水线。它以 Kubernetes 作为底层平台,注重可扩展性和可重复性。借助 Flyte,用户团队可以使用 P…

Python 之类型注解

类型注解允许开发者显式地声明变量、函数参数和返回值的类型。但是加不加注解对于程序的运行没任何影响(是非强制的,且类型注解不影响运行时行为),属于 有了挺好,没有也行。但是大型项目按照规范添加注解的话&#xff…

rocketmq并发消费

netty的handler 在netty的网络模型中,在想bootstrap设置handler时, 都是在等待 事件 的到来,才会被调用的方法,都是被动的, 服务端等待 request 的到来,进行read, 然后主动调用writeAndFlush写出去。 客户…

React 播客专栏 Vol.9|React + TypeScript 项目该怎么起步?从 CRA 到配置全流程

👋 欢迎回到《前端达人 React 播客书单》第 9 期(正文内容为学习笔记摘要,音频内容是详细的解读,方便你理解),请点击下方收听 你是不是常在网上看到 .tsx 项目、Babel、Webpack、tsconfig、Vite、CRA、ESL…

【PmHub后端篇】PmHub中基于自定义注解和AOP的服务接口鉴权与内部认证实现

1 引言 在现代软件开发中,尤其是在微服务架构下,服务接口的鉴权和内部认证是保障系统安全的重要环节。本文将详细介绍PmHub中如何利用自定义注解和AOP(面向切面编程)实现服务接口的鉴权和内部认证,所涉及的技术知识点…

芯片测试之X-ray测试

原理: X-ray是利用阴极射线管产生高能量电子与金属靶撞击,在撞击过程中,因电子突然减速,其损失的动能会以X-Ray形式放出。而对于样品无法以外观方式观测的位置,利用X-Ray穿透不同密度物质后其光强度的变化,…

QBasic 一款古老的编程语言在现代学习中的价值(附程序)

QBasic(Quick Beginner’s All-purpose Symbolic Instruction Code)是微软公司于 1991 年推出的一款简单易学的编程语言,作为BASIC语言的变种,它曾广泛应用于教育领域和初学者编程入门。尽管在当今Python、Java等现代编程语言主导…

【八股战神篇】Java高频基础面试题

1 面向对象编程有哪些特性? 面向对象编程(Object-Oriented Programming,简称 OOP)是一种以对象为核心的编程范式,它通过模拟现实世界中的事物及其关系来组织代码。OOP 具有三大核心特性:封装、继承、多态。…