k8s(五)Docker 镜像分析

98 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

回归到镜像本身,我们使用docker inspect [镜像 ID]来查看镜像属性。

[root@master ~]# docker inspect 74b0086fe7c6
......
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/990ec90661e0868c1fda29618916e4c5e3143a61394055de6e3f1333de9453fe/diff:/var/lib/docker/overlay2/69c24a49f77b361d64ddf7ce24051acee85d44cf27a62affee17203b9eb82d94/diff",
                "MergedDir": "/var/lib/docker/overlay2/d6f217c3a337c34b5189700a3f94e521b6bde6b0309119f62abe1b51efb024be/merged",
                "UpperDir": "/var/lib/docker/overlay2/d6f217c3a337c34b5189700a3f94e521b6bde6b0309119f62abe1b51efb024be/diff",
                "WorkDir": "/var/lib/docker/overlay2/d6f217c3a337c34b5189700a3f94e521b6bde6b0309119f62abe1b51efb024be/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:4fc242d58285699eca05db3cc7c7122a2b8e014d9481f323bd9277baacfa0628",
                "sha256:38413451f0dea7413dfa86b80c259d3e2aa3ac35c64982c5a0df1d5e2901477f",
                "sha256:499f9544bfdd5dcddab710c6fbbcc3915731ac3f1fe2e338e7217be7a6bd4737"
            ]
        },
......

其中有几个重点属性需要关注一下。

  1. RootFS属性,layers就是代表镜像的层级,其中有三层(三条数据)

    再使用docker history分析一下镜像的结构

    [root@master ~]# docker history 74b0086fe7c6 --no-trunc=true
    IMAGE                                                                     CREATED             CREATED BY                                                                                                       SIZE                COMMENT
    sha256:74b0086fe7c6316790a203895e879d387d00d7f733af9060dd9ff1058c39a068   6 days ago          /bin/sh -c #(nop)  CMD ["./demo-gin"]                                                                            0B                  
    <missing>                                                                 6 days ago          /bin/sh -c #(nop) COPY file:cd53aab436246ffa2e579600132d18c644f289099eced8fe82b285be3861eec9 in /app/demo-gin    9.19MB              
    <missing>                                                                 6 days ago          /bin/sh -c #(nop) WORKDIR /app                                                                                   0B                  
    <missing>                                                                 2 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/sh"]                                                                               0B                  
    <missing>                                                                 2 weeks ago         /bin/sh -c #(nop) ADD file:5d6753d25da3a14ce1f6cf66e4c7fd4f4b85a3759a9d93efb3fd9ff852b5b56e4 in /                 5.57MB              
    

    或者你在pull镜像的时候留意一下

    [root@master ~]# docker pull lomtom/demo-gin
    Using default tag: latest
    latest: Pulling from lomtom/demo-gin
    df9b9388f04a: Pull complete 
    2f0488c48942: Pull complete 
    06e8ee5ba102: Pull complete 
    Digest: sha256:3ea098ee7ec35c266092f94e5c90e1edceb64d91863c2533fc5869eb8c319581
    Status: Downloaded newer image for lomtom/demo-gin:latest
    docker.io/lomtom/demo-gin:latest
    

    不难发现,执行docker history之后,根据日期6 days ago,就能知道这三层就是我们自定义的dockerfile生成的三层。

    那么 2 weeks ago 的两层是哪里来的呢?

    去查看使用的基础镜像,不难发现他的最新更新恰好就是两周前。

    image-20220421100238179.png

    那么,这三层是怎么和Dockerfile对应的呢。

    会看我们真实用到的dockerfile文件

    FROM alpine
     
    WORKDIR /app
    COPY --from=builder /app/demo-gin /app/demo-gin
     
    CMD ["./demo-gin"]
    
    1. FROM选取基础镜像,也就是FROM alpine,构成了层级的第一层和第二层。
    2. WORKDIR /app对应了第三层,以及他的CREATE BY/bin/sh -c #(nop) WORKDIR /app
    3. ...
  2. 其次可以关注GraphDriver属性。

    • Name标明了该镜像的UnionFS,即overlay2文件系统。

    • Data属性中的LowerDir、MergedDir、UpperDir

      • LowerDir (只读):只读的 image layer,其实就是 rootfs, 在使用 Dockfile 构建镜像的时候就定好了

      • Upperdir (读写):upperdir 则是在 lowerdir 之上的一层, 为读写层。容器在启动的时候会创建, 所有对容 器的修改, 都是在这层。比如容器启动写入的日志文件,或者是应用程序写入的临时文件

      • MergedDir (展示):merged 目录是容器的挂载点,在用户视角能够看到的所有文件

本节稍微了解了一下Docker的镜像及其构成,下一节我们将从容器出发,了解容器的几个核心技术