彻底搞懂Docker镜像分层的实现

yizhihongxing

我来详细讲解“彻底搞懂Docker镜像分层的实现”的完整攻略。

什么是Docker镜像分层

首先,我们需要了解Docker中镜像的概念。Docker镜像是一个只读模板,用于创建Docker容器。每个Docker镜像都由若干个分层构成,每个分层都可以看作是Docker容器文件系统的一个快照。每个分层只包含该层所做的更改。因此,每个镜像只包含对上一层的更改。

Docker镜像分为多个层,而且这些层是唯一的。在创建新的Docker镜像时,会在现有Docker镜像中增加或修改各层内容,这就是所谓的增量操作。每个层次都是唯一的,它们具有自己的ID(哈希值),使Docker能够快速进行增量更新和复用镜像层。

Docker镜像分层的实现

Docker在实现镜像分层时采用的是Copy-on-Write(写时复制)技术。当我们创建一个新镜像时,每一层都会被创建为一个独立的文件系统,并且Docker会在镜像构建时尽可能重用已经存在的层。在对某一层进行修改时,Docker并不会直接修改该层本身,而是会在该层操作的基础上再创建一个新的层次,用于存储修改的内容。如果在这个过程中多个层操作相同的内容,Docker会自动共享这部分内容,以减少空间和时间的浪费。

示例说明

为了更好地理解镜像分层的实现,下面介绍两个示例。

示例1

我们以Alpine Linux 镜像为例。打开终端,输入以下命令:

$ docker pull alpine

拉取完毕后,输入以下命令:

$ docker history alpine

该命令会显示以下内容:

IMAGE          CREATED             CREATED BY                                      SIZE      COMMENT
35154e07079d   6 months ago        /bin/sh -c #(nop)  CMD ["/bin/sh"]            0B
<missing>      6 months ago        /bin/sh -c #(nop) ADD file:f6e74ebeb2433f...   5.57MB

如上所示,alpine镜像只有两个层次。第一个层次的命令是“CMD ["/bin/sh"]”,表示在容器运行时默认启动Shell,在Alpine镜像启动时执行的命令,并且CMD命令没有前缀,说明它是在Docker Hub中对该镜像的某个基础镜像进行了配置改变;第二个层次的命令是“ADD file:f6e74ebeb2433f...”,表示添加了一个文件到容器中,文件ID为f6e74ebeb2433f。

示例2

我们以 Node.js 镜像为例来更深入地理解Docker镜像分层。在终端中执行以下命令:

$ docker pull node

拉取完毕后,输入以下命令:

$ docker history node

该命令会显示以下内容:

IMAGE          CREATED             CREATED BY                                                                                                 SIZE      COMMENT
b044f0c9daf3   4 days ago          /bin/sh -c #(nop)  CMD ["npm" "start"]                                                                         0B
<missing>      4 days ago          /bin/sh -c #(nop)  EXPOSE 8080                                                                                   0B
<missing>      4 days ago          /bin/sh -c echo "deb http://deb.debian.org/debian stretch non-free" >> /etc/apt/sources.list && apt-get update && apt-get install -y ca-certificates curl apt-transport-https lsb-release && curl -sL https://deb.nodesource.com/setup_14.x | bash - && apt-get install -y nodejs && rm -rf /var/lib/apt/lists/*   208MB
<missing>      4 days ago          /bin/sh -c #(nop)  MAINTAINER Docker Maintainers <docker-maintainers@docker.com>                                                          0B
<missing>      4 days ago          /bin/sh -c #(nop)  CMD ["bash"]                                                                                 0B
<missing>      4 days ago          /bin/sh -c #(nop) ADD file:d845fde0a3dd2138dd5672898bd1a299cf2e2d9cbae34315f9d71a9038e69697 in /                           125MB

如上所示,node镜像有多个层次。第一个层次的命令是“CMD ["npm" "start"]”,表示容器运行时默认启动Node.js 应用程序;第二个层次的命令是“EXPOSE 8080”,表示容器监听8080端口;第三个层次安装了Node.js和npm;第四个层次是维护者信息,第五个层次是通过“ADD”命令添加一个文件。

以上就是关于彻底搞懂Docker镜像分层的实现的完整攻略,包括了镜像分层的定义、实现原理以及两个示例的说明。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:彻底搞懂Docker镜像分层的实现 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • docker 部署 springboot项目和直接运行 jar 文件详细步骤

    目前docker发布springboot有两种方式,一种是制作镜像,另一种是直接运行jar 文件 第一种使用镜像来部署 一、创建项目目录 [root@dex ~]# mkdir /opt/backstage_proj/leshan 二、安装jdk 这里直接使用docker pull一个openjdk镜像下来就ok了(比宿主机安装省事) [root@dex b…

    Docker 2023年4月13日
    00
  • docker实战练习(一)

    systemctl start docker systemctl pause docker systemctl unpause docker systemctl start docker systemctl restart docker docker image ls 查看镜像 docker image –digests 显示镜像摘要信息 docker i…

    Docker 2023年4月12日
    00
  • Docker超详细讲解镜像操作

    Docker超详细讲解镜像操作 Docker镜像是Docker轻量级的构建单元,能够支持更快速的应用部署和管理。在这篇攻略中,我们将详细讨论如何使用Docker镜像进行操作。 Docker镜像的基本操作 拉取镜像 你可以从Docker Hub获取镜像,使用以下命令进行: docker pull [OPTIONS] NAME[:TAG|@DIGEST] 其中O…

    Docker 2023年5月16日
    00
  • Rancher 系列文章-Rancher 对接 Active Directory 实战

    概述 只要是个公司,基本上都有邮箱和 AD(Active Directory). 在 AD 里,已经有了: 用户 账号密码 邮箱 用户组 组织架构 所以对于一些仅限于本公司一定范围内人员使用的管理或后台或运营运维类系统,其实是非常适合对接 AD 来进行认证、分组,以及根据分组来进行权限分配的。 对于 Rancher,假设使用者只会有这么几类: 管理员:运维部…

    2023年4月10日
    00
  • docker文件存放路径, 获取容器启动命令

    容器早已创建好,如何得知它的启动参数(数据挂载到哪) #假设通过如下命令启动了一个容器 docker run -d –name mysql\ -p 3306:3306\ -e MYSQL_ROOT_PASSWORD=123456\ –restart=always\ mysql:5.5 –character-set-server=utf8 #如何通过容器…

    Docker 2023年4月13日
    00
  • Docker存储驱动之ZFS简介

    ZFS是下一代的文件系统,支持了很多存储高级特性,如卷管理、快照、和校验、压缩和重复删除技术、拷贝等。  ZFS由Sun公司创建,现属于Oracle,ZFS是开源的,并基于CDDL license。因为CDDL和GPL不兼容,ZFS不能加入Linux kernel主线。然而,ZFS On Linux(ZoL)项目提供kernel模块和用户空间程序,这些都可以…

    Docker 2023年4月11日
    00
  • [MySQL] docker下安装使用mysql配置主从复制

    拉取mysql的镜像docker search mysqldocker pull mysql 通过镜像创建容器,这里先创建第一个容器作为master mysql-v /etc/mysql:/etc/mysql/conf.d 表示目录共享,目录提前创建好,第二个容器要目录不一样 docker run -d –name one_mysql -v /etc/my…

    Docker 2023年4月11日
    00
  • [RHEL8]安装Docker Problem: package docker-ce-3:19.03.6-3.el7.x86_64 requires containerd.io

    系统环境 # cat /etc/redhat-release Red Hat Enterprise Linux release 8.0 (Ootpa) 安装依赖 # yum install -y yum-utils device-mapper-persistent-data lvm2 Last metadata expiration check: 0:33:…

    Docker 2023年4月13日
    00
合作推广
合作推广
分享本页
返回顶部