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

我来详细讲解“彻底搞懂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日

相关文章

  • Ansible 学习笔记 – 定位主机和组的模式

    中英文对照表 英文 中文 备注 host 主机 group (主机)组 pattern 模式 ad hoc 特别命令 playbook 剧本 Ansible 专有名词,一段复杂的编排 inventory 库存 Ansible 专有名词 flag 标志 alias 别名 模式(Patterns):定位主机和主机组 当您通过一个特别命令(ad hoc)或运行一个…

    Docker 2023年4月10日
    00
  • Docker如何快速搭建LNMP环境(最新)

    首先需要说明的是,Docker是一种容器化技术,可以在不同的平台和环境中迅速搭建应用程序。LNMP环境则是指搭建Linux+Nginx+MySQL+PHP等Web应用程序的运行环境。本文将讲解如何使用Docker快速搭建LNMP环境。 环境准备 一台已安装Docker的Linux计算机; 一个可用的端口号; 一个test.php文件用于测试。 示例一:使用D…

    Docker 2023年5月16日
    00
  • docker 深入理解之cgroups

    cgroups 资源限制  cgroups 是什么     cgroups 最初名为process container,有Google工程师Paul Menage和Rohit Seth于 2006 年提出,后由域container有多重含义容易引起误会,就与2007年更名为control groups, 并整合进Linux内核,顾名思义就是把任务放到一个组里…

    Docker 2023年4月13日
    00
  • docker 挂载、修改文件的步骤

    Docker是一种开源的容器化技术,它能够将应用程序及其依赖项打包在容器中,从而实现隔离和移植,减轻了部署和维护工作的负担。 当我们在Docker容器中运行应用程序时,有时需要修改或挂载某些文件,这时我们可以使用Docker挂载和修改文件来实现。以下是详细的步骤。 Docker 挂载文件 对于需要在Docker容器中挂载本地文件系统的应用程序,可以使用以下步…

    Docker 2023年5月15日
    00
  • 使用 docker-compose 安装 php 运行环境 —— network 的方式

    官方手册明确说明,容器互联不要采用 link 的方式,而应该采用 network 的方式。   以下演示的以 centOS 上为例,如果你在 mac 上,就需要注意一下路径问题,mac 下一班把文件什么的放在用户目录下。 直接上步骤: 1、centOS下需要升级 yum —— 不然可能会有一些神经病的错误发生 yum update 2、将已经写好的 yml …

    Docker 2023年4月11日
    00
  • Docker Dockerfile的使用实例

    下面我将详细讲解“Docker Dockerfile的使用实例”的完整攻略,同时包含两条示例说明。 Docker Dockerfile的使用实例 Docker 是一个开源的应用容器引擎,能够轻松地为任何应用程序创建轻量级、可移植、可扩展的容器。Docker 将应用程序与底层系统分离开来,从而实现更快、更可靠的应用部署。 Dockerfile 是 Docker…

    Docker 2023年5月16日
    00
  • Linux Docker安装Jenkins

    安装环境 操作系统 centos7.3 安装Docker,安装及配置见 《Docker之Docker介绍及安装配置》 安装Jenkins 下载Jenkins 命令:sudo docker pull jenkins 启动Jenkins前准备 创建jenkins文件夹 创建jenkins文件夹,用于和容器内文件夹做磁盘挂载 命令:mkdir /home/hzq/…

    Docker 2023年4月16日
    00
  • docker之点到点的容器网络的配置

    下面我将为你详细讲解“docker之点到点的容器网络的配置”的完整攻略,过程中包含两条示例说明: 点到点容器网络的配置 Docker支持多种网络模式,其中一种是点到点(p2p)网络,它将每个容器直接连接起来,使得它们之间可以进行无需外部干预的通信。下面我们将以两个容器之间的通信为例,来讲解如何配置点到点容器网络。 步骤一:准备工作 在进行网络配置之前,需要准…

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