我可以用来构建 Dockerfile 的最轻量级基础映像是什么?
What is the most light weight base image I can use to build a Dockerfile?
我通常使用 Ubuntu 或 Arch Linux 图像,但我最近发现有一个名为 CoreOS 的 OS 专门用于 docker容器。
由于我是 docker 的新手,我不确定哪一个是构建我的 Dockerfile 的最佳基础映像。这似乎是一个愚蠢的问题,但如果我 运行 多个容器上有很多微服务,那么容器应该尽可能轻。
试试alpine linux
基础镜像,它真的很小(5M)并且可以访问包存储库。我们正在使用它在我们的生产环境中构建我们的 JDK 基础映像,到目前为止 运行 很好。
这真的取决于您的要求:
FROM scratch
:如果您能够静态编译您的应用程序并且不需要任何其他二进制文件(库、shell 或任何其他命令期间),那么您正在使用完全空 "scratch"。你会看到它被用作其他基础镜像的起点,它也出现在很多预编译的 Go 命令中。
Busybox:我认为这与其说是一个基本图像,不如说是一个方便的实用程序容器。您可以在非常小的尺寸中获得许多常用命令。但是,您没有得到的是可以轻松安装其他组件的通用包管理器。当前大小不到1M.
Alpine:这是 docker 的流线型图像,它做得很好,体积小,但也给你一个包管理器。然而,小尺寸是有代价的,不包括 glibc 之类的东西。你会发现很多官方镜像都是基于 Alpine 的,所以在容器生态里面,这是一个非常流行的选择。在开始添加包之前,当前大小约为 2M。
Debian、Ubuntu 和 CentOS:这些都不是轻量级基础映像,每个大约 50M 左右。但是,他们因规模而失去的东西,他们获得了大量的包,你可以从中提取大量的包,还有很多人正在测试、修复错误,并为上游的事情做出贡献。它们还附带了一些库,某些应用程序可能希望预装这些库。
虽然最后一个选项有点大,但请记住,基本映像只能通过网络推送并存储在磁盘上一次。在那之后,除非您更改它们,否则在它们之上构建的任何图像只需要发送引用该基础图像中的层的清单,并且 docker 引擎将看到它已经下载了这些层。使用 union fs,即使您 运行 100 个容器都指向该图像,也无需复制这些层,它们每个都在磁盘上为所有图像层使用相同的只读层并写入它们的更改到他们的容器特定的 RW 层。
我通常使用 Ubuntu 或 Arch Linux 图像,但我最近发现有一个名为 CoreOS 的 OS 专门用于 docker容器。
由于我是 docker 的新手,我不确定哪一个是构建我的 Dockerfile 的最佳基础映像。这似乎是一个愚蠢的问题,但如果我 运行 多个容器上有很多微服务,那么容器应该尽可能轻。
试试alpine linux
基础镜像,它真的很小(5M)并且可以访问包存储库。我们正在使用它在我们的生产环境中构建我们的 JDK 基础映像,到目前为止 运行 很好。
这真的取决于您的要求:
FROM scratch
:如果您能够静态编译您的应用程序并且不需要任何其他二进制文件(库、shell 或任何其他命令期间),那么您正在使用完全空 "scratch"。你会看到它被用作其他基础镜像的起点,它也出现在很多预编译的 Go 命令中。Busybox:我认为这与其说是一个基本图像,不如说是一个方便的实用程序容器。您可以在非常小的尺寸中获得许多常用命令。但是,您没有得到的是可以轻松安装其他组件的通用包管理器。当前大小不到1M.
Alpine:这是 docker 的流线型图像,它做得很好,体积小,但也给你一个包管理器。然而,小尺寸是有代价的,不包括 glibc 之类的东西。你会发现很多官方镜像都是基于 Alpine 的,所以在容器生态里面,这是一个非常流行的选择。在开始添加包之前,当前大小约为 2M。
Debian、Ubuntu 和 CentOS:这些都不是轻量级基础映像,每个大约 50M 左右。但是,他们因规模而失去的东西,他们获得了大量的包,你可以从中提取大量的包,还有很多人正在测试、修复错误,并为上游的事情做出贡献。它们还附带了一些库,某些应用程序可能希望预装这些库。
虽然最后一个选项有点大,但请记住,基本映像只能通过网络推送并存储在磁盘上一次。在那之后,除非您更改它们,否则在它们之上构建的任何图像只需要发送引用该基础图像中的层的清单,并且 docker 引擎将看到它已经下载了这些层。使用 union fs,即使您 运行 100 个容器都指向该图像,也无需复制这些层,它们每个都在磁盘上为所有图像层使用相同的只读层并写入它们的更改到他们的容器特定的 RW 层。