2

背景

我正在尝试从 VM 上的 Dockerfile 构建 docker 映像。VM 正在运行 Redhat 7.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

我的构建 VM 有大约16G可用空间

[root@xrh701 DockerImage]# df -h
Filesystem                                        Size  Used Avail Use% Mounted on
/dev/mapper/rhel-root                              18G  2.1G   16G  12% /
...

安装程序在3G左右,安装包在8G左右。这加起来最大为 11G,略高于 docker 默认的基本设备大小,即 10G。

因此,我手动启动了具有更大 dm.size ( 15G ) 的 docker daemon 来解决这个问题。

docker daemon --storage-opt dm.basesize=15G

由于 docker 是基于 Union FS 的,所以图像是相互叠加的。所以我的理解是

(1)我的镜像能得到的最大大小是11G(一层3G的Installer,上面加的包层8G)

(2)如果我wget安装程序,运行它,然后在同一个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

“docker inspect”显示<none>镜像是COPY授权文件后的中间镜像。

docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                         PORTS               NAMES
232245023f90        fa09e98656ba        "/bin/sh -c 'wget -O "   About an hour ago   Exited (0) About an hour ago                       lonely_curie

这个中间容器已经完成了 RUN 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

问题

  1. 为什么 docker 用完了所有的空间?根据计算,磁盘空间(16G)对于目标镜像(8G)应该是绰绰有余的。[我拥有这台虚拟机,因此我可以保证没有其他人或任何其他进程正在消耗硬盘空间]

  2. 在当前情况下,如何强制移除容器以便恢复空间?

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

4

1 回答 1

1

TL;博士

假设安装程序为3G,安装包为8G。

如果我发布 Dokcerfile,则构建此映像的最低磁盘要求至少为 22 G [ (3+8)*2 = 22 ]。

如果我发布镜像并推送到 Dockerhub,那么用户只需要 11 G 即可拉取镜像并运行基于它的容器。

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

建造

我得到了一台大约 50G 的机器来重新运行构建并监控磁盘消耗。

在构建开始之前

# 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 = 22 G。所以我想以供将来参考,我应该保留理论计算的图像大小的两倍,因为该层似乎是复制而不是共享将正在运行的容器提交到映像时。[构建 Dockerfile 本质上与手动运行容器并提交镜像相同。]

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

并跟进,在我提交图像并删除容器后,可以回收磁盘

# 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% /
...
于 2016-03-15T16:16:53.723 回答