【问题标题】:Why the virtual size still the same after delete a file from container with rm?为什么用 rm 从容器中删除文件后虚拟大小仍然相同?
【发布时间】:2015-06-05 12:09:32
【问题描述】:

我想了解更多关于 Docker 的信息。我是初学者,对这个和 linux 很陌生。 我的英语不完美,因此我复制了终端输出。 我有一个 516MB 虚拟大小的图像。 我在一个容器中启动了 bash,并使用 wget 将一些 26MB 数据下载到其中。下载后,我通过提交从容器的更改中创建一个图像。之后虚拟大小为 542.5MB。那是正确的。 提交后,我再次启动 bash,并删除了该文件。 当我提交更改时,图像虚拟大小为 542.8MB。

这个大小没有减少,而是增加了。 能告诉我原因吗?

本地图片:

[fedora_user@fedora-vm ~]$ docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
tester/mytestfedora   latest              c0ca83567bdd        4 seconds ago       516 MB
fedora                 latest              834629358fe2        3 months ago        241.3 MB

使用最小的并下载文件:

[fedora_user@fedora-vm ~]$ docker run -i -t tester/mytestfedora /bin/bash
bash-4.3# su dockeres
[dockeres@05ef6e284e32 /]$ cd /home/dockeres/downloads/    
[dockeres@05ef6e284e32 downloads]$ wget https://dl.dropboxusercontent.com/u/827503/0_TEMP/Riverbed.zip
--2015-03-31 19:24:47--  https://dl.dropboxusercontent.com/u/827503/0_TEMP/Riverbed.zip
Resolving dl.dropboxusercontent.com (dl.dropboxusercontent.com)... 54.243.97.104, 54.243.80.193, 50.16.185.28, ...
Connecting to dl.dropboxusercontent.com (dl.dropboxusercontent.com)|54.243.97.104|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 26177252 (25M) [application/zip]
Saving to: 'Riverbed.zip'
Riverbed.zip                      100%[==============================================================>]  24.96M  3.66MB/s   in 14s    
2015-03-31 19:25:03 (1.78 MB/s) - 'Riverbed.zip' saved [26177252/26177252]
[dockeres@05ef6e284e32 downloads]$ exit
bash-4.3# exit

列出活动的并根据容器的更改创建新图像:

[fedora_user@fedora-vm ~]$ docker ps -all
CONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS                     PORTS               NAMES
05ef6e284e32        tester/mytestfedora:latest   "/bin/bash"         2 minutes ago       Exited (0) 6 seconds ago                       sick_einstein       
[fedora_user@fedora-vm ~]$ docker commit 05ef6e284e32 tester/mytestfedora
f122b12e94a32d477f2f2f18c5a5190a9ad5d349109933da65a0cfeff448c822
[fedora_user@fedora-vm ~]$ docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
tester/mytestfedora   latest              f122b12e94a3        5 seconds ago       542.5 MB
fedora                 latest              834629358fe2        3 months ago        241.3 MB

再次访问它并删除下载的文件:

[fedora_user@fedora-vm ~]$ docker run -i -t tester/mytestfedora /bin/bash
[dockeres@fb5ba36692f0 /]$ cd /home/dockeres/downloads/             
[dockeres@fb5ba36692f0 downloads]$ rm -f Riverbed.zip              
[dockeres@fb5ba36692f0 downloads]$ ls
[dockeres@fb5ba36692f0 downloads]$ exit
bash-4.3# exit

再次列出活动的,并根据容器的更改创建一个新图像:

[fedora_user@fedora-vm ~]$ docker ps -all
CONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS                     PORTS               NAMES
fb5ba36692f0        tester/mytestfedora:latest   "/bin/bash"         51 seconds ago      Exited (0) 5 seconds ago                       goofy_yalow         
[fedora_user@fedora-vm ~]$ docker commit fb5ba36692f0 tester/mytestfedora
f744e248576d7fa434768a1e1d25625a9654020fe77e12306f304ff5d5ad3e3b
[fedora_user@fedora-vm ~]$ docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
tester/mytestfedora   latest              f744e248576d        3 seconds ago       542.8 MB
fedora                 latest              834629358fe2        3 months ago        241.3 MB

提前感谢您提供的任何帮助。

埃德

【问题讨论】:

    标签: linux bash docker fedora


    【解决方案1】:

    Docker 为其层使用union file system。每个 RUN 命令都会创建一个新层,来自正在运行的容器的提交也是如此。图像由特定层及其所有祖先层组成。这是虚拟大小。因此,虚拟大小在层中单调增加。您的 wget 创建了一个新层。您的 rm 创建了一个新层,即使文件联合(例如 du -hs /)的大小较小。

    【讨论】:

    • 这就是为什么我从不在运行命令中添加大的临时文件的原因——我在同一个命令中下载、解包和删除文件——我的大多数 dockerfile 都有一个运行命令。
    • 您在文件添加后提交。之后您所做的任何事情都不会使图像变小。 [fedora_user@fedora-vm ~]$ docker commit 05ef6e284e32 tester/mytestfedora f122b12e94a32d477f2f2f18c5a5190a9ad5d349109933da65a0cfeff448c822
    • 亲爱的 seanmcl,感谢您给我的启发,我明白为什么会这样。我在文件添加后提交。然后我在文件删除后再次提交。我应该怎么做才能使图像变小?亲爱的 ISanych,感谢您的建议。我喜欢得到一个 jboss zip 解压它并删除 zip。我试过这个“cd /usr/etc/ && wget download.jboss.org/jboss.../jboss-as-7.1.1.Final.zip && unzip jboss-as-7.1.1.Final.zip && rm -f jboss-as-7.1.1.Final.zip”但我得到了当我在容器中一步一步做时,尺寸相同。我应该如何将我的命令连接到一个命令中?
    • 你需要重建镜像。使用提交进行构建不能很好地扩展。使用命令创建一个 Dockerfile。然后重建很容易。
    • @edfromhadria,你的命令很好,但在其他地方做错了,我用测试添加了答案,因为它太大而无法评论
    【解决方案2】:

    回复评论,因为它太大而无法评论。

    单个命令

    FROM ubuntu
    
    RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections \
     && apt-get -qq update \
     && apt-get -qq -y install wget unzip \
     && mkdir /usr/etc \
     && cd /usr/etc \
     && wget -nv -O /tmp/jboss.zip http://download.jboss.org/jbossas/7.1/jboss-as-7.1.1.Final/jboss-as-7.1.1.Final.zip \
     && unzip /tmp/jboss.zip \
     && apt-get clean \
     && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
    

    小文件:

    $ docker build -t test1 .
    $ docker images | grep test1
    test1 356 MB
    

    单独的命令:

    FROM ubuntu
    
    RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections && apt-get -qq update && apt-get -qq -y install wget unzip
    RUN wget -nv -O /tmp/jboss.zip http://download.jboss.org/jbossas/7.1/jboss-as-7.1.1.Final/jboss-as-7.1.1.Final.zip
    RUN mkdir /usr/etc
    RUN cd /usr/etc && unzip /tmp/jboss.zip
    RUN apt-get clean
    RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
    

    更大的图像:

    $ docker build -t test2 .
    $ docker images | grep test2
    test2 510 MB
    

    【讨论】:

    • 亲爱的 ISanych!作为您的示例,我创建了这个:FROM fedora RUN su -c 'yum -y install unzip' \ && su -c 'yum -y install wget' \ && mkdir /usr/etc \ && cd /usr/etc \ && wget -nv -O /tmp/jboss.zip http://download.jboss.org/jbossas/7.1/jboss-as-7.1.1.Final/jboss-as-7.1.1.Final.zip \ && unzip /tmp/jboss.zip \ && yum clean all \ && rm -rf /var/cache/yum/x86_64/21/* /tmp/* /var/tmp/* 现在有了这个代码,我已经达到了 442.6 MB!这是最佳的,因为在 wget 之后,解压缩安装而不下载 jboss,大小为 281.3 MB。 JBoss 解压后的大小为:~160MB(+280=440)!谢谢 ISanych,seanmcl!
    • 顺便说一句,Dockerfile(和容器中的命令)从 root 执行,除非您将创建并指定用户,所以而不是: su -c 'yum -y install unzip' \ && su -c ' yum -y install wget' 更好用:yum -y install unzip wget
    • 还有一点:440Mb 是所有层的全尺寸。 fedora 图像是 240Mb - 所以你的层是 200Mb。如果您要基于 Fedora 创建不同的图像,这个 240Mb 的图像将在所有图像之间共享。此外,如果您将基于此创建几个其他容器 - 它们也将共享所有层。 Docker 真的很酷——祝你好运。
    • 我明白了!在此信息之后,我开始一个接一个地创建一个基础、一个 jdk 和一个 jboss 映像。很高兴知道这一点!非常感谢!
    猜你喜欢
    • 2020-06-09
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多