原文链接

在这里插入图片描述

如果您像我一样,第一次创建Dockerfile并从DockerHub页面中选择镜像时,您会彻底困惑。有时候,像这样的选择会让我们的行动停滞不前,所以也许我们只是用标准的镜像,避免深入研究,这样我们就可以继续我们的项目。

但最好了解Docker镜像类型之间的差异,以便为应用程序或脚本选择正确的Docker镜像。要知道这个决定不是永久的。您可以随时更改Dockerfile中的镜像,并重建镜像。请确保在部署到生产环境之前进行彻底的测试。

简而言之,docker镜像之间的区别在于底层的操作系统。以下是每种类型的介绍

full official image

我将使用python和node作为例子,因为这些是我最常用的docker镜像,这也同样适用于任何镜像。根据DockerHub,这是事实上的标准镜像,如果你不确定,你应该使用它。

  • python:3.8.3
  • node:14.1.1

这些镜像基于最新的稳定Debian操作系统发行版。 当我试图让一个项目快速启动和运行时,我通常会从其中的一个开始,我并不关心最终镜像的大小。完整镜像是最安全的选择

buster/stretch/jessie

  • buster:Debian 10
  • stretch:Debian 9
  • jessie:Debian 8

带有stretch、buster或jessie标签的镜像是不同Debian发行版的代号。

在撰写本文时,稳定的Debian发行版是10.4,它的代号是“buster”。 “stretch”是所有版本9变种的代号,“jessie”是所有版本8变种的代号。

正在开发的未来版本是“bullseye ”和“bookworm”,但还不稳定。你可能会在DockerHub上的镜像版本列表中看到这些标签。

如果您的代码与Debian操作系统的特定版本兼容,请选择其中一个镜像。在开始一个新项目时,你很少需要使用旧版本的Debian。

slim

slim的镜像是完整镜像的配对版本。这个镜像通常只安装运行特定工具所需的最小包。以python为例,就是运行python的最小包,node.js同理。

通过省去较少使用的工具,镜像会更小。如果有空间限制且不需要完整版本,请使用此镜像。

**但是,在使用这个镜像时,一定要进行彻底的测试!**如果您遇到无法解释的错误,请尝试切换到完整的镜像,看看是否能够解决问题。

alpine

alipine镜像基于alpine linux项目,这是一个专门为容器内部使用而构建的操作系统。在很长一段时间里,这些是最受欢迎的镜像变体,因为它们的尺寸很小。

然而,一些团队正在弃用alpine镜像,因为这些镜像可能会导致难以调试的兼容性问题。具体来说,如果使用python镜像,一些 wheels将被构建成与Debian兼容,并且需要重新编译,才能与基于apline的镜像一起工作。

使用alpine镜像的主要原因是使你得到的镜像尽可能小。基础镜像将小于5MB。python基础镜像(将python添加到基础alpine镜像)目前是78.9MB。这仍然很小。

如果考虑到空间问题,强烈推荐使用此镜像。

它的缺点是不包含一些你可能会需要的包。主要是,它使用了一个更小的musl lib代替glibc。如果您的应用程序有特定的libc需求,您可能会遇到问题。

如果你发现Alpine镜像缺少你需要的东西,你可以直接在Dockerfile中安装它,这样能确保镜像只包含你需要的内容。需要注意,如果您正在安装外部包,您的Dockerfile将会更改。主要的区别是,您将使用apk而不是apt-get来安装包。

对alpine镜像的使用有很多担心之处,所以你需要充分了解它。需要充分阅读文档并研究。 同样,如果您在构建Dockerfile时遇到了无法解释的问题,请尝试切换到完整的镜像,看看是否能解决问题。

windowsservercore

我很少使用windows,我现在坚定地站在Mac / Linux阵营,但如果你的应用程序只运行在windows或windows Server上,这就是为你准备的镜像。

综述 如何选择镜像

以下是我使用的通用准则:

  • 如果我需要快速启动并运行项目,没有空间限制,并且没有时间进行太多测试,那么我就使用实际的标准镜像。 我最关心的是镜像有我需要的所有东西,镜像大小并不关心。

  • 如果空间是一个问题,并且我知道我只需要最小的包来运行特定的语言,如python,我会选择slim

  • 对于一些我有时间彻底测试的项目,并且有极端的空间限制,我将使用alpine镜像。但是要注意,这可能会导致更长的构建时间和不确定的bug。 如果您在将docker容器移植到新环境时遇到了困难,或者在添加新包时出现了故障,这可能是因为Alpine镜像。

  • 最后,滚动到特定镜像的DockerHub页面底部,阅读有关选择镜像的建议。

关于版本的说明

不要在生产系统Dockerfile中使用<image>:latest。这样做将总是获取最新的镜像,并且应用程序的依赖项可能与未来的版本不兼容。

当开始一个新项目时,我通常会从最近标记的版本开始,进行彻底的测试,然后根据需要升级,在投入生产之前进行彻底的测试。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐