在 CI/CD 管道中推送图像的目的是什么?

What is the purpose of pushing an image in a CI/CD pipeline?

上下文:通读 this 博客 post。

将图像推送到注册表似乎是 "right thing to do" ... 但我不明白为什么。

这样做的目的是什么?是因为我 ssh 进入的服务器需要有图像的本地副本吗?要做到这一点,一种方法是从注册表中提取图像?

在这种情况下,注册表是唯一的真实来源。这意味着,您可以拥有多个节点(服务器)、集群,并且可以从一个地方获取图像。此外,如果您的节点下拉 - 您可以在新节点中快速启动图像。您还可以使用注册表的 webhook 自动更新图像,例如,当您添加新版本的图像注册表时,会将 webhook 发送到任何可以将容器升级到最新版本的服务。

将 docker 图像视为一种将软件分发到服务器的新方式,并将 docker-registry 视为共享图像的集中存储(例如 npm.org 用于 js, maven.org java).

例如 如果您在 docker 年前开发 java 应用程序 ,您可以使用 .jar 文件来完成它。 docker 图像更好的方式是还包括所有 OS 级别的依赖项,如 JDK/JRE 和系统配置。所以这可以帮助您避免 "it works on my machine" 效果。

要分发 docker image,您也可以仅使用 docker 文件并始终在每台机器上构建它。 Docker-Repository 允许您集中存储预构建映像。

推送到 CI/CD 中的 docker-repository 允许构建您的分布式一次并进一步在集成和生产环境中使用相同的分布式。

仅使用 Dockerfile 并不能保证每时每刻每个构建的状态都相同,因为您可能会在可能会更新的 Dockerfile 脚本中安装外部依赖项甚至在两个顺序构建之间删除。

通常,当您想要简化您的构建/测试/部署过程时,您会使用 CICD 管道,如果您要维护对您的业务实际上至关重要的生产基础架构,通常会发生这种情况.

如果您只是在玩弄/制作 IMO 原型,则不需要 CI/CD 管道,在这种情况下,您可以直接在机器上构建 docker 图像,或通过 ssh 获取图像超过。太有道理了。

将 'registry' 视为您的二进制映像的存储库(即,理想情况下,您的代码的固定版本是版本化的,并且您知道它可以工作)

然后部署就像告诉您的服务器从任何地方拉取图像并 运行 它一样简单。

在灵活的架构中,您可能随时都有节点启动或关闭,它们需要能够从某处提取最新代码以自动备份并 运行ning,在任何时候,无需干预。

What purpose does this serve? Is it because the server I ssh into needs to have a local copy of the image? And to do that, one approach is to pull an image from a registry?

从 CI/CD 的角度来看,docker 注册表相当于图像的工件存储库。当你从一个 docker 主机到另一个主机时,你希望这些图像的中央源下载,因为你的构建服务器很可能不同于你的开发和生产服务器。

Couldn't I just upload an image from one machine (say a CI/CD server) via ssh? using dockerhub seems needlessly ceremonious to me. Like in this example (I know this api is deprecated but it illustrates my point).

可以将 save/load 图像直接发送到 docker 主机,但存在一些主要缺点。首先,您将失去 docker 的分层文件系统的任何好处。在 CI/CD 中构建应用程序时,大多数时候只有最后几层需要根据您的应用程序更改进行重建。应该有相同的先前基础图像和各种公共层来构建保持相同的应用程序。使用注册表,可以看到这些公共层,只有不同之处被推送和拉取,从而使您的部署更快并节省磁盘空间 space。使用 save/load 命令,每次都会发送所有图层,因为当您 运行 保存时您不知道远程服务器的状态。

其次,当您将主机添加到 运行 图像时,这不会扩展。如果您想 运行 它在该主机上的机会,每个主机都需要复制图像,例如处理故障转移或负载平衡。如果您移动到群模式或 kubernetes,它也将不起作用,因为您可以轻松地将新节点添加到没有您的图像的集群中。 Swarm 模式默认在注册表中查找图像的 sha256,以保证始终使用相同的图像,即使在初始部署后在注册表中修改了标签。

请记住,您可以 运行 您自己的注册服务器(有一个 docker 图像并且 api 是打开的)。许多工件存储库(例如 artifactory 和 nexus)包括对 docker 注册表的支持。许多云提供商在其容器产品中包含一个注册表。因此,您无需推送到远程 docker 集线器即可在本地部署。

最后一点是,注册服务器对开发人员很有用,他们现在可以拉取在开发和生产中使用的相同镜像,以针对他们在本地编写的其他微服务进行测试,而无需在本地构建所有内容或通过 ssh 连接到 CI/CD 服务器甚至 prod 将图像保存并 scp 回他们的笔记本电脑。