我正在使用Django,但我想这个问题适用于任何Web项目。
在我们的案例中,有两种类型的代码,第一种是python代码(在django中运行),其他是静态文件(html / js / css)
当任何代码更改时,我都可以发布新图像。
或者,我可以使用bind mounts
作为代码。 (对于django,我们可以将项目根目录和静态目录绑定安装)
如果我使用bind mounts
作为代码,则可以在代码更改时更新生产机器(可能使用git pull
)。
然后,docker映像将处理严格来说不是我们自己的代码更改的更新。 (例如库更新或新设置(例如设置elasticsearch))。
此方法是否暗示任何明显的缺点?
答案 0 :(得分:1)
出于安全方面的原因,建议使操作系统与最新的安全补丁保持最新,但是Docker映像将以不可变的方式发布,以便我们始终能够在生产之外重现生产问题,因此可以使用OS不会针对已发布的安全补丁进行自我更新。因此,这意味着我们需要经常重建和部署docker镜像,以保持安全。
因此,我宁愿使用我的代码和静态文件发布新的docker映像,因为它们必然会更频繁地更改,因此需要频繁发布,这意味着您可以在不使用安全补丁的情况下使OS保持最新状态需要在生产中重建docker映像,只是为了保持操作系统最新。
请注意,我在这里假设您至少每周发布一次新代码或静态文件,否则,我仍然建议每周至少一次更新docker镜像,以获取正在使用的所有软件的最新安全补丁。
答案 1 :(得分:0)
通常,对于这个问题,我所看到的更多面向Docker的解决方案可以将整个应用程序打包到Docker映像中。特别是其中包括应用程序代码。
我建议这样做的三个很好的理由:
如果您有通往docker build
独立图像的可复制路径,则任何人都可以构建和复制它。其中包括您的开发人员,他们可以在实际投入生产之前测试生产系统的几乎完全相同的副本。如果它是Docker映像,再加上此地方的代码,再加上其他地方的这些静态文件,则很难确定您有一个与生产环境相匹配的完美设置。
一些更高级的面向Docker的工具(Kubernetes,Amazon ECS,Docker Swarm,Hashicorp Nomad等)使得将容器和图像作为一流对象进行处理相当简单,但要处理起来却比较棘手。说“这张图片加上这张附加文件”。
如果您使用服务器自动化工具(Ansible,Salt Stack,Chef等)来推送代码,那么直接使用它们来推送正确的运行时环境也很简单。使用Docker打包运行时环境并不会给您带来太多的复杂性和安全隐患。 (您可以将Packer或Vagrant与该工具集一起使用,以模拟VM中的部署顺序以进行生产前测试。)
您还将在许多SO问题中看到一个序列,其中Dockerfile将应用程序代码复制到某个目录,然后使用docker-compose.yml
将当前主机目录绑定安装在该目录上。在此设置中,容器环境反映了开发人员的桌面环境,并没有真正测试Docker映像中内置的内容。
(“静态文件”在“是应用程序还是数据?”之间的灰色区域中结束。在这个问题的上下文中,我倾向于将它们打包到图像中,尤其是当它们从您的计算机中出来时。正常的构建过程。尤其是要包含正在运行的应用程序的主UI。如果您可以合理地将它们托管在完全独立的服务器上,例如大图像或视频资产,则将它们分开提供服务会更有意义。)< / p>