在将应用程序部署到服务器上时,应用程序与其自身捆绑的内容与它期望平台(操作系统和已安装的软件包)提供的内容之间通常存在分离。其中一点是平台可以独立于应用程序进行更新。例如,当需要将安全更新紧急应用到平台提供的包而不重建整个应用程序时,这很有用。
传统上,安全更新只需执行包管理器命令即可在操作系统上安装更新版本的包(例如 RHEL 上的“yum update”)。但是随着容器技术(如 Docker)的出现,容器镜像基本上将应用程序和平台捆绑在一起,保持容器系统最新的规范方法是什么?主机和容器都有自己的、独立的包集,需要在主机上更新和更新,不会更新容器内的任何包。随着 RHEL 7 的发布,Docker 容器特别突出,听听 Redhat 推荐的处理容器安全更新的方法会很有趣。
关于几个选项的想法:
- 让包管理器更新主机上的包不会更新容器内的包。
- 必须重新生成所有容器映像以应用更新似乎打破了应用程序和平台之间的分离(更新平台需要访问生成 Docker 映像的应用程序构建过程)。
- 在每个正在运行的容器中运行手动命令似乎很麻烦,并且下次从应用程序发布工件更新容器时,更改有被覆盖的风险。
因此,这些方法似乎都不令人满意。
Docker 映像捆绑了应用程序和“平台”,这是正确的。但通常镜像是由基础镜像和实际应用组成的。
因此,处理安全更新的规范方法是更新基础映像,然后重建您的应用程序映像。
这些容器应该是轻量级和可互换的。如果您的容器存在安全问题,您可以重建已修补的容器版本并部署新容器。(许多容器使用标准基础镜像,使用标准包管理工具,如 apt-get 来安装它们的依赖项,重建将从存储库中提取更新)
虽然您可以在容器内部打补丁,但这并不能很好地扩展。
这在 SUSE Enterprise Linux 中使用 zypper-docker(1) 自动处理
SUSE/zypper 码头工人
Docker 快速入门
首先,您过去运行的许多更新将根本不在容器本身内。容器应该是您过去习惯看到的完整文件系统的一个相当轻量级的小子集。您应该更新的包将是 DockerFile 的一部分,并且由于您拥有 DockerFile,您应该能够跟踪需要更新的那些包和容器 ID。Cloudstein 即将发布的 UI 会为您跟踪这些 DockerFile 成分,以便可以构建最适合其容器的更新方案。希望这可以帮助