如何以相对较小的磁盘空间消耗构建大型docker映像?

如何以相对较小的磁盘空间消耗构建大型docker映像?,docker,dockerfile,docker-build,Docker,Dockerfile,Docker Build,背景 我正在尝试从虚拟机上的Dockerfile构建docker映像。VM运行的是Redhat7.1(内核3.10),Docker运行的是1.10.2 Dockerfile包含以下内容 FROM rhel MAINTAINER MyName<me@email.com> RUN #yum install wget and other tools (less than 500 MB) COPY entitlementfile /opt/entitlementfile RUN wget

背景

我正在尝试从虚拟机上的Dockerfile构建docker映像。VM运行的是Redhat7.1(内核3.10),Docker运行的是1.10.2

Dockerfile包含以下内容

FROM rhel
MAINTAINER MyName<me@email.com>
RUN #yum install wget and other tools (less than 500 MB)
COPY entitlementfile /opt/entitlementfile
RUN  wget -O /opt/installer.bin https://installer.com/installer.bin \ 
    && chmod +x /opt/* \
    && /opt/installer.bin --quiet \
    && rm -f /opt/*.bin
USER admin
安装程序大约为3G,安装的软件包大约为8G。这加起来最大为11G,略微超过docker默认的基本设备大小(10G)

因此,我手动使用更大dm.size(15G)的docker守护进程来解决这个问题

docker daemon --storage-opt dm.basesize=15G
因为docker是基于Union FS的,所以图像是层叠在一起的。 所以我的理解是

(1) 我的图像可以得到的最大尺寸是11G(安装在一层3G中,包层添加在顶部8G中)

(2) 如果我设置安装程序,运行它,然后在同一个run命令中删除安装程序,图像应该只有8G(因为3G安装程序被删除)

无论如何,底线是,16G的空间应该足够了

问题

但我目前的观察是,在我的docker构建过程中, 它将始终挂起,因为它已占用所有可用空间

[root@xrh701 DockerImage]# df -h
Filesystem                                        Size  Used Avail Use% Mounted on
/dev/mapper/rhel-root                              18G   18G   20K 100% /
...
我可以看到两幅图像

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              fa09e98656ba        About an hour ago   258.1 MB
rhel                latest              32f8a1d5f019        9 days ago          203.2 MB
此中间容器已完成运行wget行,已成功退出,但由于空间不足,未提交docker映像

更糟糕的是,我无法删除容器,也无法删除/var/lib/docker来恢复空间

# docker rm -f lonely_curie
Failed to remove container (lonely_curie): Error response from daemon: Driver devicemapper failed to remove root filesystem 232245023f90b42a4dbd19a78bf32836f9f8618d7dbcba54159c3df029b5b114: mount still active
问题

  • 为什么docker把所有的空间都用光了?根据计算,磁盘空间(16G)应足以容纳目标映像(8G)。[我拥有此VM,因此我可以保证没有其他人或任何其他进程占用硬盘空间]

  • 在我目前的情况下,如何强制移除容器,以便恢复空间

  • 我应该如何在一个16G虚拟机上构建这个8G映像(或11G映像,如果你算上安装程序的话)?如果不可能,成功构建的最小空间是多少?我目前正在实验室申请32G虚拟机

  • TL;DR

    假设安装程序是3G,安装的软件包是8G

    如果我释放Dokcerfile,那么构建此映像的最低磁盘需求将至少为22g[(3+8)*2=22]

    如果我释放图像并推送到Dockerhub,那么用户只需要11G就可以拉取图像并运行基于它的容器

    ==================================================================

    构建

    我买了一台50克大小的机器来重新运行构建并监控磁盘消耗

    在构建开始之前

    # df -h
    Filesystem                 Size  Used Avail Use% Mounted on
    /dev/mapper/vg_01-lv_root   59G   6G   53G  9% /
    ...
    
    安装完成后

    # df -h
    Filesystem                 Size  Used Avail Use% Mounted on
    /dev/mapper/vg_01-lv_root   59G   19G   38G  34% /
    ...
    
    提交图像后

    # df -h
    Filesystem                 Size  Used Avail Use% Mounted on
    /dev/mapper/vg_01-lv_root   59G   27G   30G  48% /
    ...
    
    因此,回答我自己的问题: (1) 它耗尽了所有磁盘,因为它至少需要那么多磁盘空间。之前的计算假设正在运行的容器和要构建的图像将共享同一层

    (2) 我还没弄明白这部分。现在,我只是扔掉虚拟机,让它回收

    (3) 所需的最小磁盘数为(3G+8G)*2=22g。因此,我想作为将来的参考,我应该保留理论计算的图像大小的两倍,因为在将运行的容器提交到图像时,层似乎是复制的,而不是共享的。[构建Dockerfile与手动运行容器并提交到映像基本相同。]

    =================================================================

    跑步

    接下来,在我提交映像并删除容器后,可以回收磁盘

    # df -h
    Filesystem                 Size  Used Avail Use% Mounted on
    /dev/mapper/vg_01-lv_root   59G   15G   42G  26% /
    ....
    
    从那时起,启动一个正在运行的容器不会显著增加磁盘消耗


    嗯,看来《孤独的居里》被删除了,因为我在《docker ps-a》中再也看不到它了。。。但我仍然无法删除/var/lib/docker,因为它仍然抱怨设备和资源繁忙
    # df -h
    Filesystem                 Size  Used Avail Use% Mounted on
    /dev/mapper/vg_01-lv_root   59G   27G   30G  48% /
    ...
    
    # df -h
    Filesystem                 Size  Used Avail Use% Mounted on
    /dev/mapper/vg_01-lv_root   59G   15G   42G  26% /
    ....
    
    # df -h
    Filesystem                 Size  Used Avail Use% Mounted on
    /dev/mapper/vg_01-lv_root   59G   15G   42G  26% /
    ...