Alpine 大小和 Docker 层

Vac*_*ano 5 containers docker alpine-linux

我正在公司设计应用程序的容器化。当我查看容器时,我看到很多关于 Alpine 的讨论。

讨论的基本内容围绕着 Alpine 的规模展开。Alpine 比其他 Linux 发行版小得多。Alpine 的大小为 5 MB(小得惊人),而 Ubuntu 的大小为 188 MB。

但我感到困惑的是为什么这真的很重要。包含操作系统的 docker 层应该只需要下载到机器一次(假设所有容器使用相同的基础镜像)。

例如,假设我有 50 个应用程序,每个应用程序放入 1 个容器中。它们每个都需要 50 MB,我在 docker 上运行它们。

  • 在 Alpine 上运行时,我的 50 个容器化应用程序将占用 2,505 MB 的磁盘空间。
  • 在 Ubuntu 上运行 50 个应用程序将占用 2,688 MB 磁盘空间。

这仅存在 7% 的差异。磁盘空间并不是很昂贵。因此,Ubuntu 运行所有容器所需的额外 183 MB 似乎并不重要。

但Alpine确实有很多人气。所以我不得不认为我错过了一些东西。也许它使用更少的内存?或者它更快?

Alpine Linux 发行版中的哪些功能促使 Docker 选择它作为其主要容器平台?

Ita*_*ing 2

这取决于您使用的编程语言;对于 Python 我觉得 Alpine 是一个坏主意:

  1. 没有二进制轮子,因此您需要重新编译所有内容,这意味着您需要安装编译器工具链,从而使较小的映像变得毫无意义。

  2. Alpine 使用的替代 libc musl 历史上存在一些细微的差异,这些差异会导致恼人的错误,例如,有一次 DNS 在 WeWork 办公室的 Minikube 中无法工作(!),因为 WeWork 当时的 DNS 设置不稳定,与公认的 DNS 交互不良。必须做出符合 RFC 的决定。

(较长版本:https://pythonspeed.com/articles/base-image-python-docker-images/

第一个问题与 Go 无关,而对于第二个问题,Go 主要绕过 libc 并直接执行系统调用。所以对于 Go 我认为基本上没问题。