题 如何在Docker容器中处理安全更新?


在将应用程序部署到服务器上时,应用程序与自身捆绑的内容与它从平台(操作系统和已安装的软件包)提供的内容之间通常存在分离。其中一点是平台可以独立于应用程序进行更新。例如,当需要紧急地将安全更新应用于平台提供的包而不重建整个应用程序时,这很有用。

传统上,通过执行包管理器命令在操作系统上安装更新版本的包(例如RHEL上的“yum update”),已经应用了安全更新。但随着Docker等容器技术的出现,容器映像基本上捆绑了应用程序  平台,保持系统容器更新的规范方法是什么?主机和容器都有自己独立的软件包集,需要在主机上进行更新和更新,不会更新容器内的任何软件包。随着RHEL 7的发布,Docker容器特别受欢迎,听听Redhat推荐的处理容器安全更新的方法会很有趣。

关于一些选项的想法:

  • 让包管理器更新主机上的包不会更新容器内的包。
  • 必须重新生成所有容器映像以应用更新似乎打破了应用程序和平台之间的分离(更新平台需要访问生成Docker映像的应用程序构建过程)。
  • 在每个正在运行的容器内运行手动命令似乎很麻烦,并且在下次从应用程序发布工件更新容器时,更改可能会被覆盖。

所以这些方法都不令人满意。


103
2017-07-08 21:54




交交交件实件件件件件件实交似件件实件件件实实件件件实件件件实件件件实实交件件件实交交实件件件件件件件件件件似件件件件件实件件件件 项目原子。我认为不是 相当 准备好迎接黄金时间。 - Michael Hampton♦
交交交交件实似实实实实交件交件实实实交实实实实实实实实实似实实实实实交件实实实似件实交件实实实实交件实实实件似实似似件实交交件件我正在运行长期容器(例如托管php-cgi),到目前为止我发现的是: docker pull debian/jessie 更新图像,然后重建我现有的图像,然后停止容器并再次运行它们(使用新图像)。我构建的图像与之前的图像具有相同的名称,因此启动是通过脚本完成的。然后我删除“未命名”的图像。我一定会喜欢更好的工作流程。 - miha
交交件实实实实似实实实件实实实交交实实似实件实实交件实件交件实件实实交实件交实件实件实实实件实件实件件实件实件实件件实件实件件件作为制作新版本的一部分,基本上不断更新和重建所有图像。似实似交实实件实件 - Markus Hallmann
最好的答案 这里 帮助很大,因为有一个包含主要命令行的脚本,正是Johannes Ziemke所说的: - Hudson Santos


答案:


Docker镜像捆绑应用程序和“平台”,这是正确的。但通常图像由基本图像和实际应用程序组成。

因此,处理安全更新的规范方法是更新基本映像,然后重建应用程序映像。


43
2017-08-12 11:41



谢谢,这听起来很合理。仍然希望更新平台,以便不必触发重新打包整个应用程序(例如,考虑到由于单个基本映像获得更新而必须重建100个不同的应用程序映像)。但也许这是不可避免的,Docker的理念是将所有内容捆绑在一起。 - Markus Hallmann
@ValkoSipuli你总是可以编写一个脚本来自动化这个过程。 - dsljanus
为什么不在容器内进行apt-get升级,dnf升级,pacman -syu等等?件交交交实交似件似实似实件交似交交交交件实件实件实件实件实件实实实似实实实件件件似件实件实交似件件实件实件实实实件 然后 运行应用程序,然后将其用作容器的入口点,以便在启动/重新启动容器时升级其所有包。 - Arthur Kay
@ArthurKay有两个原因:1)您炸毁容器大小,因为升级后的所有包都将添加到容器层,同时将过时的包保留在映像中。 2)它击败了(容器)图像的最大优势:您运行的图像与构建/测试的图像不同,因为您在运行时更改了包。 - Johannes 'fish' Ziemke
有一件事我不明白:如果你是一家公司购买一个作为docker容器发布的软件,你是否必须等待软件的制造商在每次出现安全问题时重建应用程序包?哪家公司会以这种方式放弃对开放漏洞的控制? - Sentenza


容器应该是轻质且可互换的。如果容器存在安全问题,则重建已修补的容器版本并部署新容器。 (许多容器使用标准的基本映像,使用标准的包管理工具,如apt-get来安装它们的依赖项,重建将从存储库中提取更新)

虽然你可以修补容器内部,但这不会很好地扩展。


6
2017-10-03 19:44





使用zypper-docker(1)在SUSE Enterprise Linux中自动处理

SUSE / zypper的-泊坞窗

Docker快速入门


1
2018-05-08 17:05





首先,您过去传统上运行的许多更新都不会在容器内部。容器应该是您习惯于过去看到的完整文件系统的一个相当轻量级的小子集。您应该更新的软件包将是DockerFile的一部分,因为您拥有DockerFile,您应该能够跟踪那些需要更新的软件包和容器ID。即将发布的Cloudstein UI将为您跟踪这些DockerFile成分,以便您可以构建最适合其容器的更新方案。希望这可以帮助


0
2017-07-08 23:23