纯编程语言映像和OS plus编程语言docker映像之间到底有什么区别?

纯编程语言映像和OS plus编程语言docker映像之间到底有什么区别?,docker,docker-image,Docker,Docker Image,在上次使用Docker很长一段时间后,我刚刚重新使用了它,我注意到Docker Hub上的这两个变体,您可以从编程语言图像(如node:11)和编程语言加linux发行版图像(如node:11 alpine)中选择,所以我想知道这两个在运行时的区别是什么,我的意思是,仅限编程语言的映像将依赖于主机操作系统来运行?或者我必须始终下载附带操作系统的图像,以使其正常运行?让我们使用 当您对一些没有-linux发行版前缀的节点:版本执行docker pull操作时,这并不意味着它没有操作系统(或工作环境

在上次使用Docker很长一段时间后,我刚刚重新使用了它,我注意到Docker Hub上的这两个变体,您可以从编程语言图像(如node:11)和编程语言加linux发行版图像(如node:11 alpine)中选择,所以我想知道这两个在运行时的区别是什么,我的意思是,仅限编程语言的映像将依赖于主机操作系统来运行?或者我必须始终下载附带操作系统的图像,以使其正常运行?

让我们使用

当您对一些没有
-linux发行版前缀的
节点:版本
执行
docker pull
操作时,这并不意味着它没有操作系统(或工作环境),并且只有“包含操作系统的映像”才能正常运行。这通常只是意味着,作为此映像的用户,您不关心基本映像是什么或基本Linux发行版是什么,您只想在不做额外工作的情况下尽可能快地将您的工作应用程序封装起来(例如,要安装的额外内容等)

如果查看的支持的标记和相应的Dockerfile链接部分,您会发现
节点:版本
图像仍然只是特定
节点:版本linux发行版
的别名。例如,对于
节点:14.15.4

如果您尝试拉动它们,它们会指向相同的图像:

~$docker拉节点:14.15.4
14.15.4:从库/节点拉出
2587235a7635:拉动完成
953fe5c215cb:拉动完成
....
摘要:sha256:04a33dac55af8d3170bffc91ca31fe8000b96ae1bab1a090deb920ca2ca2a38e
状态:已下载节点14.15.4的较新映像
docker.io/library/node:14.15.4
~$docker拉动节点:14.15.4-拉伸
14.15.4-拉伸:从库/节点拉出
摘要:sha256:04a33dac55af8d3170bffc91ca31fe8000b96ae1bab1a090deb920ca2ca2a38e
状态:已下载节点的较新映像:14.15.4-stretch
docker.io/library/node:14.15.4-stretch
节点:14.15.4
节点:14.15.4-stretch
具有相同的摘要

04a33dac55af8d3170bffc91ca31fe8000b96ae1bab1a090deb920ca2ca2a38e
…而且它们都是从中生成的。您也可以尝试:

~$docker inspect--format='{{.RootFS}}'节点:14.15.4>node.14.15.4.txt
~$docker-inspect--format='{{.RootFS}}'节点:14.15.4-stretch>node.14.15.4-stretch.txt
~$diff--brief node.14.15.4.txt node.14.15.4-stretch.txt
…没有区别。如果您仍然认为
节点:14.15.4
没有操作系统,请运行它并检查:

~$docker运行-it节点:14.15.4 bash
root@942ea36068d9:/#cat/etc/os发行版
PRETTY_NAME=“Debian GNU/Linux 9(扩展)”
NAME=“Debian GNU/Linux”
VERSION_ID=“9”
VERSION=“9(拉伸)”
版本\代号=拉伸
ID=debian
主页地址=”https://www.debian.org/"
支持URL=”https://www.debian.org/support"
错误报告URL=”https://bugs.debian.org/
~$docker运行-it节点:14.15.4-stretch bash
root@d504a57244eb:/#cat/etc/os发行版
PRETTY_NAME=“Debian GNU/Linux 9(扩展)”
NAME=“Debian GNU/Linux”
VERSION_ID=“9”
VERSION=“9(拉伸)”
版本\代号=拉伸
ID=debian
主页地址=”https://www.debian.org/"
支持URL=”https://www.debian.org/support"
错误报告URL=”https://bugs.debian.org/"
…并查看它们的
节点:14.15.4
也是以Debian Stretch作为其基本映像构建的(如果您检查Dockerfile,从技术上讲,它是
buildpack deps:Stretch

这适用于其他“编程语言”映像,如和。因此,为了回答您的问题,当您在没有指定Linux发行版的情况下使用映像时,应该没有任何区别。它适用于那些不想关心Linux发行版使用了什么,并且希望立即获得可用内容的人

对于这些名称中包含Linux发行版的图像,更相关的问题是“我应该使用哪个Linux发行版?”

对于
节点
图像,在它们的图像变体部分中进行了解释。引用
节点的图像:
,(没有Linux发行版的图像):

这是“事实”图像。如果您不确定自己的需求是什么,您可能希望使用此图像。它被设计为既可以用作一次性容器(装载源代码并启动容器以启动应用程序),也可以用作构建其他图像的基础

此标记基于buildpack deps。buildpack deps是为Docker的普通用户设计的,他们的系统上有许多映像。通过设计,它有大量非常常见的Debian软件包。这减少了从它派生的映像需要安装的软件包数量,从而减少了系统上所有映像的总体大小系统

请注意关于预装许多软件包的部分。通常,这意味着如果您不基于此映像构建和发布自己的应用程序映像,或者您不关心映像的最终大小(例如,磁盘空间不是问题),或者如果您没有CI/CD管道将映像拉入或推送到某个位置,则始终可以从此类映像开始


-alpine
-slim
通常在您希望减小图像大小时使用,但它们通常需要更多的工作来安装所需的内容(在其他图像中预先安装的内容)。再次查看图像变体部分,了解您需要它们的原因和时间。您还可以查看此相关的SO帖子:。

对于节点图像,它们在dockerhub页面的图像变体部分提供解释:。最流行的图像也提供了解释(例如python图像)。没错,但我仍然不确定如果我只是在没有操作系统的情况下拉取节点映像会发生什么,不知道是否仍然可以尝试:)它通常是构建一些Linux发行版作为基础,或者作为node的情况,它是“基于buildpack deps”。如果它没有指定任何内容,我