zoukankan      html  css  js  c++  java
  • 架构师修炼之微服务部署

    镜像简介

    它是一个创建Docker 容器的只读模板,通过DockerFile可以自定义镜像。

    它也是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

    Dockerfile简介

    Dockerfile是一个文本文件,其内包含了创建镜像(image)所需要的所有指令(Instruction)。使用docker build有序的执行文件中每一条指令,每一条指令构建一层,构建的层通过UnionFS组合起来形成一个只读的镜像。

    UnionFS简介

    它是一个Linux和FreeBSD的文件系统服务。通过它可以将多个不同文件系统(含文件或者目录)组合形成一个虚拟的文件系统。

    比如: test1和test2两个文件夹,各个文件夹下有各自的文件。

    test1/n
    test1/b
    test2/l
    test2/f
    

    通过UnionFS虚拟成test文件夹之后,表面上会变成如下样子。

    test/n
    test/b
    test/l
    test/f
    

    它有一个很重要的特性:Copy on write

    比如:把changed、test1、test2三个文件夹虚拟组合成test文件夹。虚拟组合时指定changed读写权限、test1与test2只读权限。

    ├── changed
    ├── test
    │   ├── n
    │   ├── b
    │   ├── l
    │   └── f
    ├── test1
    │   ├── n
    │   └── b
    └── test2
        ├── l
        └── f
    

    如果对 test/f 文件进行修改,将会复制 f 文件到具备读写权限的changed文件夹,而原始的 test2/f 不会更新。

    ├── changed
    │   └── f  #复制创建
    ├── test
    │   ├── n
    │   ├── b
    │   ├── l
    │   └── f  #更新
    ├── test1
    │   ├── n
    │   └── b
    └── test2
        ├── l
        └── f  #不更新
    

    镜像与容器关系

    使用UnionFS与Copy on write特性之后,容器与镜像的关系如下:

    只读镜像层的数据更新时,就会复制数据到可读写操作的容器层。这个复制处理的具体操作依赖系统选择的Storage Driver。

    Storage Driver列表:

    • overlay2, overlay
    • aufs
    • btrfs
    • devicemapper
    • vfs
    • zfs

    由上可以知道,由于共用了只读镜像层,从而缩小了容器的大小,加快了启动速度。

    镜像内部分层结构

    举个例子看看镜像里头分层情况。

    第一步:创建DockerFile,内容如下

    FROM centos:7
    

    执行docker build:

    D:docker0-basic>docker build -t centos7 .
    Sending build context to Docker daemon  2.048kB
    Step 1/1 : FROM centos:7
    7: Pulling from library/centos
    ab5ef0e58194: Pull complete                                                                                                                   Digest: sha256:4a701376d03f6b39b8c2a8f4a8e499441b0d567f9ab9d58e4991de4472fb813c
    Status: Downloaded newer image for centos:7
     ---> 5e35e350aded
    Successfully built 5e35e350aded
    Successfully tagged centos7:latest
    SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.
    

    查看镜像分层构造:

    D:docker0-basic>docker history centos7
    IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
    5e35e350aded        5 months ago        /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
    <missing>           5 months ago        /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B
    <missing>           5 months ago        /bin/sh -c #(nop) ADD file:45a381049c52b5664…   203MB
    

    第二步:修改DockerFile内容如下。

    FROM centos:7
    RUN echo "Hello world" > /tmp/newfile
    

    执行docker build:

    D:docker0-basic>docker build -t centos7 .
    Sending build context to Docker daemon  2.048kB
    Step 1/2 : FROM centos:7
     ---> 5e35e350aded
    Step 2/2 : RUN echo "Hello world" > /tmp/newfile
     ---> Running in 8bd61ed2d5e7
    Removing intermediate container 8bd61ed2d5e7
     ---> cdbbf869ca90
    Successfully built cdbbf869ca90
    Successfully tagged centos7:latest
    SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.
    

    查看镜像分层构造:

    D:docker0-basic>docker history centos7
    IMAGE               CREATED              CREATED BY                                      SIZE                COMMENT
    cdbbf869ca90        About a minute ago   /bin/sh -c echo "Hello world" > /tmp/newfile    12B
    5e35e350aded        5 months ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
    <missing>           5 months ago         /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B
    <missing>           5 months ago         /bin/sh -c #(nop) ADD file:45a381049c52b5664…   203MB
    

    对比两次的分层结构,就可以知道第二步只在第一步的基础上加了一个12B的分层。

    从而可以推导出:Docker 为了加速镜像构建、重复利用资源,会利用这些中间层镜像。

    镜像优化

    知道镜像内部分层之后,我们就可以做一些处理来优化我们的镜像。

    1. 由于镜像每层是只读的,构建之后无法改变。所以在构建这一层时创建的临时文件,也需要在这一层进行删除,后续层中做的删除只是表面效果。

    优化前:

    FROM ubuntu:18.04
    RUN apt-get update
    RUN apt-get clean && rm -rf /var/lib/apt/lists/*
    

    优化后:

    FROM ubuntu:18.04
    RUN apt-get update && apt-get clean && rm -rf /var/lib/apt/lists/*
    
    1. 对于已经没有任何依赖的中间层镜像进行删除。
  • 相关阅读:
    毕业生的商业软件开发之路 C#语言简介
    [毕业生的商业软件开发之路]第一次使用VS.NET集成开发环境
    一种应用程序命令执行架构设计
    DCWriter 电子病历文档编辑器的 电子病历功能规范对照表
    [毕业生的商业软件开发之路]积累与创新
    WEB开发人员的微软技术战略
    PureMVC(AS3)剖析:吐槽
    走在网页游戏开发的路上(九)
    [服务器开发]可伸缩系统的设计模式(译)
    回合制页游
  • 原文地址:https://www.cnblogs.com/lixiaobin/p/dockerimage.html
Copyright © 2011-2022 走看看