zoukankan      html  css  js  c++  java
  • Docker镜像实现原理

    镜像操作

    镜像是一个只读的 Docker 容器模板,包含启动容器所需要的所有文件系统结构和内容。简单来讲,镜像是一个特殊的文件系统,它提供了容器运行时所需的程序、软件库、资源、配置等静态数据。即镜像不包含任何动态数据,镜像内容在构建后不会被改变。

    Dockerfile指令

    Dockerfile指令介绍

    镜像的实现原理

    其实 Docker 镜像是由一系列镜像层(layer)组成的,每一层代表了镜像构建过程中的一次提交。下面以一个镜像构建的 Dockerfile 来说明镜像是如何分层的。

    FROM busybox
    COPY test /tmp/test
    RUN mkdir /tmp/testdir

    上面的 Dockerfile 由三步组成:

    第一行基于 busybox 创建一个镜像层;

    第二行拷贝本机 test 文件到镜像内;

    第三行在 /tmp 文件夹下创建一个目录 testdir。

    为了验证镜像的存储结构,我们使用docker build命令在上面 Dockerfile 所在目录构建一个镜像:

    $ docker build -t mybusybox .

    这里我的 Docker 使用的是 overlay2 文件驱动,进入到/var/lib/docker/overlay2目录下使用tree .命令查看产生的镜像文件:

    $ tree .
    # 以下为 tree . 命令输出内容
    |-- 3e89b959f921227acab94f5ab4524252ae0a829ff8a3687178e3aca56d605679
    |   |-- diff  # 这一层为基础层,对应上述 Dockerfile 第一行,包含 busybox 镜像所有文件内容,例如 /etc,/bin,/var 等目录
    ... 此次省略部分原始镜像文件内容
    |   `-- link 
    |-- 6591d4e47eb2488e6297a0a07a2439f550cdb22845b6d2ddb1be2466ae7a9391
    |   |-- diff   # 这一层对应上述 Dockerfile 第二行,拷贝 test 文件到 /tmp 文件夹下,因此 diff 文件夹下有了 /tmp/test 文件
    |   |   `-- tmp
    |   |       `-- test
    |   |-- link
    |   |-- lower
    |   `-- work
    |-- backingFsBlockDev
    |-- bec6a018080f7b808565728dee8447b9e86b3093b16ad5e6a1ac3976528a8bb1
    |   |-- diff  # 这一层对应上述 Dockerfile 第三行,在 /tmp 文件夹下创建 testdir 文件夹,因此 diff 文件夹下有了 /tmp/testdir 文件夹
    |   |   `-- tmp
    |   |       `-- testdir
    |   |-- link
    |   |-- lower
    |   `-- work
    ...

    通过上面的目录结构可以看到,Dockerfile 的每一行命令,都生成了一个镜像层,每一层的 diff 夹下只存放了增量数据,如图 2 所示。

    分层的结构使得 Docker 镜像非常轻量,每一层根据镜像的内容都有一个唯一的 ID 值,当不同的镜像之间有相同的镜像层时,便可以实现不同的镜像之间共享镜像层的效果。(镜像分层主要是为了镜像层之间的复用) 

    总结一下, Docker 镜像是静态的分层管理的文件组合,镜像底层的实现依赖于联合文件系统(UnionFS)。充分掌握镜像的原理,可以帮助我们在生产实践中构建出最优的镜像,同时也可以帮助我们更好地理解容器和镜像的关系。

    本文源自:拉勾教育课程:由浅入深吃透 Docker,讲师:郭少 前 360 高级容器技术专家

  • 相关阅读:
    字符串与Json操作
    默认让IE用最高文档模式浏览网页
    MVC中简单的文件下载代码
    2017年1月22日
    JDK环境变量设置
    如何实现windows命令提示符的tab补全
    win7热点设置
    为什么小米5不能适配win7
    各种错误锦集
    插头DP
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/14158330.html
Copyright © 2011-2022 走看看