Docker | 自定义Docker镜像

公众号封面

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉
🍎个人主页:Leo的博客
💞当前专栏:Docker系列
✨特色专栏: MySQL学习
🥭本文内容: Docker | 自定义Docker镜像
🖥️个人小站 :个人博客,欢迎大家访问
📚个人知识库: 知识库,欢迎大家访问

1.前言

大家好,我是Leo哥🫣🫣🫣,前面我们学习了Docker的安装以及Docker的基本命令。学会了如何去通过Docker进行服务的安装,比如MySQL,Nginx等。那么大家可以思考一个问题,在之前,我们都是通过使用DockerHub官方提供的镜像,那么我们是否可以自定义镜像,对镜像diy呢,答案是当然可以,这篇文章我们就来学习一些前置知识以及自定义我们的镜像。好了,话不多说让我们开始吧😎😎😎。

2.什么是镜像

镜像 (Mirroring)是一种文件存储形式,是冗余的一种类型,一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像。可以把许多文件做成一个镜像文件,与GHOST等程序放在一个盘里用GHOST等软件打开后,又恢复成许多文件,RAID 1和RAID 10使用的就是镜像。常见的镜像文件格式有ISO、BIN、IMG、TAO、DAO、CIF、FCD。

所谓镜像文件其实和ZIP压缩包类似,它将特定的一系列文件按照一定的格式制作成单一的文件,以方便用户下载和使用,例如一个测试版的操作系统、游戏等。镜像文件不仅具有ZIP压缩包的“合成”功能,它最重要的特点是可以被特定的软件识别并可直接刻录到光盘上。其实通常意义上的镜像文件可以再扩展一下,在镜像文件中可以包含更多的信息。比如说系统文件、引导文件、分区表信息等,这样镜像文件就可以包含一个分区甚至是一块硬盘的所有信息。使用这类镜像文件的经典软件就是Ghost,它同样具备刻录功能,不过它的刻录仅仅是将镜像文件本身保存在光盘上,而通常意义上的刻录软件都可以直接将支持的镜像文件所包含的内容刻录到光盘上。

简单来说,在Docker中镜像就是一个轻量的、独立的软件包。用来打包运行环境和基于运行环境开发的软件。它包含软件运行所需的所有内容(包括代码、运行时、库、环境变量、配置文件)

所有的应用,打包docker镜像,就可以跑起来。

3.Docker镜像加载原理

Docker 镜像是构建 Docker 容器的基础,它是一个轻量级、可执行的独立软件包,包括运行应用所需要的所有内容——代码、运行时、库、环境变量和配置文件。接下来,我将详细介绍 Docker 镜像的加载原理。

3.1 Docker 镜像的分层

Docker 镜像采用了层叠的文件系统,这意味着镜像由一系列只读的层组成。这样做的好处是重用和共享,若干个镜像可以共享相同的层,节省磁盘空间和加速镜像下载。

  • 基础层: 所有镜像的第一层,通常是一个最小化的操作系统环境,如 Ubuntu 或 Alpine。
  • 依赖层: 包含应用程序运行所需的依赖、库文件等。
  • 应用层: 包括应用程序的代码和资源文件。

当你构建一个镜像时,每个指令(如 RUN, COPY, ADD 等)都会在现有镜像层之上创建一个新的层。

3.2 镜像加载过程

实际加载和运行 Docker 镜像的过程包含以下几个关键步骤:

  1. 拉取镜像: 当你使用 docker run 命令运行一个容器时,如果本地没有指定的镜像,Docker 将从 Docker Hub 或其他配置的镜像仓库拉取镜像。
  2. 镜像解压与加载: Docker 会将拉取的镜像文件解压到磁盘上,并按照镜像层的顺序将它们组合起来。
  3. Union File System: Docker 使用 UnionFS 把各层联合成一个统一的文件系统。多个只读层被叠加在一起,最顶部通常是一个可以写入的层,即容器层。
  4. 运行容器: 加载镜像后,Docker 可以在这个统一文件系统的基础上创建并启动一个新容器。
  5. 容器层动态写入: 容器运行后,对文件系统的所有更改都会发生在容器层。这些更改与下面的只读镜像层隔离开来,从而不会影响到基础镜像本身。
  6. 存储和缓存: 镜像层被拉取到本地之后,会被存储在本地的 Docker 宿主机上。当再次运行同样的镜像时,Docker 会使用这些已经存在的层来加速容器的运行。

3.3 优化读取速度和资源利用

Docker 的设计允许多个容器共享同一个基础镜像,这使得部署多个容器更加高效。例如,如果10个容器都基于同一个操作系统镜像,那么在磁盘上只需要有一个该操作系统镜像的副本,各个容器只需创建自己特有的容器层即可。

另外,Union File System 是增量的,这意味着只有当文件层发生改变时才需要额外存储空间。未被修改的部分仍然共享相同的物理存储空间。结合容器层的设计,这提供了高效的文件操作性能,同时确保了容器之间的文件系统隔离。

总体来说,Docker 使用一种分层的方式来管理和加载镜像,这种方法带给了 Docker 镜像和容器之间的高效能力和灵活性。通过缓存,共享层和增量更新。

4. Docker中的分层

下面我们就以 CentOS 发行版的 overlay2 文件系统进行介绍,其实不管是什么发行版,其远离都如出一辙。

overlayer2 官方介绍: https://docs.docker.com/storage/storagedriver/overlayfs-driver/

先来看张图:

image-20231128162209929

从上图中的右边可以看到 OverlayFS 中有三个层级结构:lowerdirupperdirmerged 层。

对应的,使用 docker inspect [container-id] 就可以看到这几个层所在的位置:

"GraphDriver": {"Name": "overlay2","Data": {"LowerDir": "/var/lib/docker/overlay2/45abab78c6fd022d9ce132a0fb995f9e91bc0a807ccc73e2461fce6c9b68b250/root","MergedDir": "/var/lib/docker/overlay2/dc838cbc7d903a4bfd6bd0280a6910c063f2d1f03439e917ebc773fccc377402/merged","UpperDir": "/var/lib/docker/overlay2/dc838cbc7d903a4bfd6bd0280a6910c063f2d1f03439e917ebc773fccc377402/upper","WorkDir": "/var/lib/docker/overlay2/dc838cbc7d903a4bfd6bd0280a6910c063f2d1f03439e917ebc773fccc377402/work"}
},

docker镜像都是只读的,当容器启动时,一个新的可写层被加到镜像的顶部。

这一层就是我们通常说的容器层,容器之下的都叫镜像层

5.自定义镜像

5.1 准备

首先本地准备一个服务jar包,Redis或者MySQL都可以。

5.2 通过容器转镜像

使用以下命令进行转换

docker commit  容器ID 镜像名称:版本号
docker save -o 压缩文件名称  镜像名称:版本号

最后通过以下命令加载一下即可。

docker load -i 压缩文件名称

这样就大功告成了!

其实这样方式我们使用的并不大,我们今天这里只是简单了解一下,后面我们会详细讲解另一种方式dockfile

6.文章参考

  • https://docs.docker.com/engine/install/centos/#install-from-a-package
  • https://docs.docker.com/engine/reference/commandline/cli/

7.总结

以上便是本文的全部内容,本人才疏学浅,文章有什么错误的地方,欢迎大佬们批评指正!我是Leo,一个在互联网行业的小白,立志成为更好的自己。

如果你想了解更多关于Leo,可以关注微信公众号-程序员Leo,后面文章会首先同步至公众号。

公众号封面

本文由博客一文多发平台 OpenWrite 发布!

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

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

相关文章

Leetcode刷题之设计循环队列(C语言版)

Leetcode刷题之设计循环队列(C语言版) 一、题目描述二、题目示例三、题目解析Ⅰ、typedef structⅡ、MyCircularQueue* myCircularQueueCreate(int k)Ⅲ、bool myCircularQueueIsEmpty(MyCircularQueue* obj)Ⅳ、bool myCircularQueueIsFull(MyCircularQ…

Vue3-admin-template 导入模板功能

先看效果&#xff1a; 直接上代码&#xff1a; 1.绑定事件&#xff1a; <el-button type"primary" click"templates">模板导入</el-button> 2.写结构样式 <!-- 模板导入 --><el-dialog v-model"Statusimprot" title&quo…

2023年通过已经认证的微信公众号注册微信小程序

登录已经认证的微信公众号 注册完成后&#xff0c;打开微信公众平台的网址&#xff0c;用账号密码的方式登录

与 PCIe 相比,CXL为何低延迟高带宽?

文章目录 前言1. LatencyPCIE 生产者消费则模型结论Flit 包PCIE/CXL.ioCXL.cace & .mem总结 2. BandWidth常见开销CXL.IO Link efficiencyPCIe Link efficiencyCXL.IO bandwidthCXL.mem/.cache bandwidth 参考 前言 CXL 规范里没有具体描述与PCIe 相比低延时高带宽的原因&…

视频文案怎么写,媒介盒子支招

近几年短视频成为风口&#xff0c;各行各业都想分一杯羹&#xff0c;但是一头热的你&#xff0c;是否知道短视频的相关文案怎么写呢?正所谓兵马未动&#xff0c;文案先行&#xff0c;一个合适的文案是上热门的秘密武器&#xff0c;今天媒介盒子就来和大家聊聊&#xff1a;视频…

【技术干货】宇视IPC音频问题解决步骤

近期技术人员从宇视官网下载sdk进行二次开发时&#xff0c;在启动实时直播&#xff0c;并通过回调函数拿到流数据&#xff0c;发现没有音频流数据。 通过下面的数据发现&#xff0c;codeType此字段一直是28&#xff0c;代表的是H.264数据&#xff0c;但未没发现有音频的数据包…

51单片机项目(16)——基于51单片机的水箱冷却系统

1.项目背景 汽车水箱又称散热器&#xff0c;是汽车冷却系统中主要机件&#xff1b;其功用是散发热量&#xff0c;冷却水在水套中吸收热量&#xff0c;流到散热器后将热量散去&#xff0c;再回到水套内而循环不断。从而达到散热调温的效果。它还是汽车发动机的重要组成部分。 汽…

docker 安装elasticsearch集群

准备工作 docker 安装好&#xff0c;docker compose 安装好编辑好docker-compose.yml文件&#xff08;本文会提供&#xff09;生成elastic-certificates.p12密钥&#xff0c;与docker-compose文件在同一个目录&#xff08;本文会介绍生成方式&#xff09;准备elasticsearch配置…

虚幻学习笔记5—UI预设体制作

一、前言 本文使用的虚幻引擎5.3.2&#xff0c;在unity中有预设体的概念&#xff0c;可以将一个组合型的物体或UI制作成预设体&#xff0c;方便后续可以快速制作更多元的内容和复用。虚幻本身没有这个概念&#xff0c;但是要实现类似的效果其&#xff0c;故此我引用了这个概念。…

iOS-打包上架构建版本一直不出现/正在处理/自动消失

iOS开发过程中&#xff0c;打包上架苹果审核是一个不可或缺的环节。说实话&#xff0c;这个问题我遇见两次了&#xff0c;为了让自己长点记性&#xff0c;决定写下来。首先&#xff0c;列举几种情况&#xff1a; 1.iPa包上传至App store后&#xff0c;一个小时内不显示构建版本…

如何使用Cloudreve将个人电脑打造为私有云盘并实现远程访问

文章目录 1、前言2、本地网站搭建2.1 环境使用2.2 支持组件选择2.3 网页安装2.4 测试和使用2.5 问题解决 3、本地网页发布3.1 cpolar云端设置3.2 cpolar本地设置 4、公网访问测试5、结语 1、前言 云存储概念兴起后&#xff0c;现在市面上也已经有了很多公有云盘。但一段时间后…

关于easy-es的聚合问题-已解决

es实体类&#xff1a; public class ChemicalES {IndexId(type IdType.CUSTOMIZE)private Long id;HighLightIndexField(fieldType FieldType.TEXT, analyzer "ik_max_word")private String name;IndexField(fieldType FieldType.KEYWORD)private List<Stri…