Docker | 自定义Docker镜像

news2024/12/24 8:22:03

公众号封面

✅作者简介:大家好,我是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.coloradmin.cn/o/1262804.html

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

相关文章

Spring---IOC与DI

文章目录 什么是Spring?什么是Ioc?通过代码案例理解总结代码案例真正理解Ioc 什么是DI? 什么是Spring? Spring指的是 Spring Framework (Spring框架),它是一个开源的框架,有着活跃而…

【带头学C++】----- 八、C++面向对象编程 ---- 8.7 引用(Reference)

目录 8.7 引用(Reference) 8.7.1 普通变量引用 8.7.2 数组引用 8.7.3 指针变量的引用方法 8.7.4 函数的引用 8.7.5 引用作为函数的参数 8.7.6 引用作为函数的返回值类型 1. 返回值类型不用使用局部变量的引用类型 2.返回值类型为引用&#xff0…

es集群相关报错信息

给es集群添加用户密码的时候,会自动弹出相关的账户信息,这个时候,只需要设置对应密码就可以了 [esuserjky-test1 bin]$ ./elasticsearch-setup-passwords interactive future versions of Elasticsearch will require Java 11; your Java ve…

【Linux】了解进程的基础知识

进程 1. 进程的概念1.1 进程的理解1.2 Linux下的进程1.3 查看进程属性1.4 getpid和getppid 2. 创建进程3. 进程状态4. 进程优先级5. 进程切换6. 环境变量7. 本地变量与内建命令 1. 进程的概念 一个已经加载到内存中的程序,叫做进程(也叫任务&#xff09…

2021年全国硕士研究生入学统一考试管理类专业学位联考英语(二)试题

文章目录 2021年全国硕士研究生入学招生考试英语二试题SectionⅠUse of EnglishSection Ⅱ Reading ComprehensionText 1Text 2Text 2Text 3Text 4 Section III TranslationSection Ⅳ Writing 2021年全国硕士研究生入学招生考试英语二试题 SectionⅠUse of English Directio…

vue项目多个不同的服务器请求地址管理

vue项目多个不同的服务器请求地址管理 在vue项目开发过程中,获取不同的数据可能会出现需要请求多个不同服务器地址的域名,这个时候需要对不同域名的请求地址进行管理以及跨域的代理。 一、单服务器域名地址的跨域代理和请求配置: 跨域配置: 在vue项目的vue.config.js文件…

GAN:ImprovedGAN-训练GAN的改进策略

论文:https://arxiv.org/abs/1606.03498 代码:https://github.com/openai/improved_gan 发表:NIPS 2016 一、文章创新 1:Feature matching:特征匹配通过为生成器指定新目标来解决GANs的不稳定性,从而防止…

很清楚展示GPT插件的调用过程,人工智能(AI)的潜在危险与好处 超级智能 未来

好处,未来 很清楚展示GPT插件的调用过程: 把请求和要求发chatGPT chatGPT返回markdown格式发给插件 插件返回结果给用户。 你不用别人用。 人工智能(AI)的最危险之处通常与以下几个方面有关: 自主决策能力过强&…

一篇博客带你了解TCP网络传输协议

Transmission Control Protocol(TCP,传输控制协议)是互联网协议套件中的一种主要协议之一,负责在网络上可靠地传输数据。下面是TCP协议的详细讲解: 1. 基本概念: 面向连接: TCP是一种面向连接的…

2.安装docker

目录 1 安装依赖 2 安装docker 3 测试 目前docker分为三类 Docker-CE(社区版),Docker-EE(企业版)和Moby。Moby是docker社区用户自己写的,所以Moby我们一般用不上 每一类的每一个版本中都有Edge与Stable版,Stable维护4个月,Edge维护1个…

在柯桥西班牙语论文写作,连接词只会用porquepero?西语连接词大全来啦~

Adicin -agregan nuevos datos al desarrollo de una idea o introduce otro aspecto del tema. 为观点的论述增添新的信息,或介绍主题的另一个方面。 1 Lista de conectores 连接词列表 Adems. As mismo. Hay que mencionar, adems. Habra que decir tambin. Mas …

当消费增值模式遇上Dapp:擦出创新商业的火花

随着区块链技术和智能合约的不断发展,去中心化应用(Dapp)逐渐成为一种创新的商业模式。当消费增值模式与Dapp相遇,它们之间擦出了怎样的火花呢? 一、Dapp与消费增值模式的结合 Dapp是一种基于区块链技术和智能合约的去…

分层理解Java字符串常量池

Java是一门计算机编程语言,但我们脑海中所理解的Java不仅仅是一门语言。它还包括Java虚拟机(JVM)的一系列规定,及具体Java产品(如Hotspot)的实现原理。 不管我们日常在Java中用到的任何一种语法&#xff0…

python如何抓取携程酒店的价格,让工作更简单点

有时候老板没事安排点事,为了偷懒,只能使出大招,毕竟自己不是那么老老实实干活的人,整理数据这类累和繁琐的活,我怎么能轻易动,好在gpt可以帮我来实现,有人可能会说,这么点内容你还不…

在线陪诊系统: 医疗科技的崭新前沿

在医学科技的快速发展中,在线陪诊系统正成为医疗服务领域的创新力量。通过结合互联网和先进的远程技术,这一系统为患者和医生提供了更为便捷、高效的医疗体验。本文将深入探讨在线陪诊系统的技术背后的核心代码和实现原理。 技术背后的关键代码 在线陪…

面试题:说一下MyBatis动态代理原理?

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1.MyBatis简介2.使用步骤2.1、引入依赖2.2、配置文件2.3、接口定义2.4、加载执行 3.原理解析 1.MyBatis简介 MyBatis是一个ORM工具,封装了JDBC的操作&a…

k8s中pod的hostport端口突然无法访问故障处理

故障背景: 租户告知生产环境的sftp突然无法访问了,登录环境查看sftp服务运行都是正常的,访问sftp的hostport端口确实不通。 故障处理过程 既然访问不通那就先给服务做个全面检查,看看哪里出了问题,看下sftp日志&#…

Java学习路线第二篇:Java Web

这篇则分享Java学习路线第二part:Java Web 恭喜你已经成功追到第二章节啦,要被自己的努力感动到了吧,而这节将承担起学完Java web 的使命,本使命为单向契约,你可选择YES或者选择YES。 HTMLCSSJavaScript(JS) 【动…

Linux—进程状态、僵尸进程、孤独进程、优先级

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、进程状态二、僵尸进程、孤儿进程1、Z(zombie)-僵尸进程2、僵尸进程危害3、孤儿进程 三、进…

DHCP协议及实验omnipeek抓包工具分析 IPv4协议

一 抓包命令 adb shell tcpdump -i wlan0 -w /data/tcpdump.pcap 抓包后截图如下 二 DHCP是什么 2.1 DHCP定义 DHCP( Dynamic Host Configuration Protocol, 动态主机配置协议)定义: 存在于应用层(OSI) 前身是BOOTP(Bootstrap Protocol)协议 是一个使用UDP(User …