为什么Docker容器镜像如此庞大?[已关闭]

12 浏览
0 Comments

为什么Docker容器镜像如此庞大?[已关闭]

我通过Dockerfile从Fedora制作了一个简单的镜像(最初大小为320 MB)。\n添加了Nano(这个只有1MB大小的小编辑器),镜像的大小增加到了530 MB。我还在此基础上添加了Git(大约30MB),然后我的镜像大小飙升到了830 MB。\n这不是疯了吗?\n我尝试过导出和导入容器以删除历史/中间镜像。这个努力节省了25 MB的空间,现在我的镜像大小为804 MB。我还尝试了在一个RUN命令中运行多个命令,但仍然得到了相同的830MB初始大小。\n我开始怀疑是否值得使用Docker。我的意思是,我几乎什么都没安装,就已经超过了1GB。如果我必须添加一些严重的东西,比如数据库等等,我可能会用完磁盘空间。\n有人遇到过这种荒谬的镜像大小吗?你们是如何处理的?\n除非我的Dockerfile出了严重的问题?\n

FROM fedora:latest
MAINTAINER Me NotYou 
RUN yum -y install nano
RUN yum -y install git

\n但很难想象这里会出什么问题。

0
0 Comments

为什么Docker容器镜像这么大?

Docker容器镜像的大小通常会很大,这是由于以下原因:

1. Dockerfile中的每个命令都会创建一个新的容器层,这些层会叠加在一起形成最终的镜像。即使在后面的命令中使用了rm -rf命令删除文件,这些文件仍然存在于之前的中间层容器中,导致镜像变得庞大。

2. Docker容器中可能包含许多不必要的工具,如wget或git。这些工具只在下载或构建过程中使用,而在运行容器的过程中并不需要。因此,可以通过删除这些不必要的工具来减小镜像的大小。

为了解决这个问题,可以采取以下措施:

1. 尽量将多个RUN命令合并为一个命令,使用&&符号连接。这样可以将多个操作放在一个命令中,减少层的数量。

2. 清理不必要的工具,如wget或git。可以在构建过程中使用这些工具,但在运行容器时并不需要它们。

此外,从Docker v17.06开始,还可以使用多个FROM语句来减小镜像的大小。在一个Dockerfile中可以有多个FROM语句,最终镜像只包含最后一个FROM语句中的内容。

通过以上这些措施,可以显著减小Docker容器镜像的大小。

0
0 Comments

为什么Docker容器镜像如此庞大? [已关闭]

Docker镜像并不庞大,只是你在构建庞大的镜像。如果你能将代码编译成静态二进制文件,那么scratch镜像的大小为0B,你可以使用它来打包你的代码。例如,你可以编译你的Go程序,并scratch之上打包,以创建一个完全可用的镜像,其大小不到5MB。

关键是不要使用官方的Docker镜像,它们太庞大了。Scratch也不是特别实用,因此我建议使用Alpine Linux作为基础镜像。它的大小约为5MB,然后只添加你的应用程序所需的内容。这篇关于Microcontainers的文章展示了如何使用Alpine构建非常小的镜像。

更新:官方的Docker镜像现在基于Alpine,所以现在可以使用它们了。

值得庆幸的是,Docker官方镜像也在逐步转向使用Alpine作为基础,因此越来越多的情况下,你可以使用常规的镜像,而不是依赖于iron.io的版本。参见brianchristner.io/docker-is-moving-to-alpine-linux

文章整理完毕。

0
0 Comments

为什么Docker容器映像如此庞大?

Docker容器映像如此庞大的原因是,映像包括所有的层级,每个层级都包括所安装软件的所有依赖项。还需要注意的是,基本映像(如fedora:latest)往往非常简洁。你可能会对所安装软件的依赖项数量感到惊讶。

通过在每一行添加yum -y clean all,可以显著减小安装大小:

FROM fedora:latest
RUN yum -y install nano && yum -y clean all
RUN yum -y install git && yum -y clean all

在每个RUN之前执行清理操作很重要,以便在层级被提交之前删除数据。在联合/写时复制文件系统中,最后进行清理操作并不能真正减少文件系统使用量,因为实际数据已经提交给了较低层级。为了解决这个问题,必须在每个层级上进行清理。

通过$ docker history bf5260c6651d可以查看历史记录,然后可以删除旧的层级。具体来说,我想要完全删除(基于你的示例)这些映像:172743bd5d60、3f2fed40e4b0、fd241224e9cf、511136ea3c5a,以便我的虚拟映像大小与最终映像大小大致相同,即约260MB。

虚拟映像大小与实际硬盘上的映像大小是否无关?如果是这样的话,如何/在哪里检查我的映像的实际大小?

可以使用docker export导出然后再使用docker import导入。这样可以将层级合并。我不认为这会减小大小,但我可能错了。

是的,但导出并没有节省多少空间。不过我通过浏览网络得知,在Docker中,我所观察到的是虚拟映像大小。映像在硬盘上的实际大小对我来说似乎是个谜,因为根据官方信息,docker ps -s显示的是硬盘上的实际大小,而在我的情况下是-1B,听起来合理,减去1字节。我在硬盘上腾出了一些空间,似乎是合理的。

根据stackoverflow.com/questions/39223249/…的说法,使用连续的RUN 仅一次更好,对吗?

哇,今天我学到了这个。在使用Docker多年后,我终于知道了!非常感谢你,善良的陌生人!我成功将映像大小减半!

0