如何部署在docker中运行的应用程序-最佳实践?
我们正在讨论如何部署在docker容器中运行的应用程序。目前,我们在包含应用程序代码的管道中构建应用程序映像。这意味着我们必须在每次应用程序更新时构建docker映像如何部署在docker中运行的应用程序-最佳实践?,docker,deployment,dockerfile,pipeline,Docker,Deployment,Dockerfile,Pipeline,我们正在讨论如何部署在docker容器中运行的应用程序。目前,我们在包含应用程序代码的管道中构建应用程序映像。这意味着我们必须在每次应用程序更新时构建docker映像 我们考虑的另一种方法是将应用程序代码放在服务器上的卷中。然后,我们在服务器上使用git发布最新版本。因此,图像不必重建 因此,我们讨论的选项是: 构建包含应用程序代码的映像 使用卷并将应用程序代码存储在服务器上 最佳做法是什么?为什么?每次使用新应用程序构建映像时,您都可以轻松地在以后将其部署到客户或生产服务器上。docker映像
我们考虑的另一种方法是将应用程序代码放在服务器上的卷中。然后,我们在服务器上使用git发布最新版本。因此,图像不必重建
因此,我们讨论的选项是:最佳做法是什么?为什么?每次使用新应用程序构建映像时,您都可以轻松地在以后将其部署到客户或生产服务器上。docker映像准备好后,可以将其保存在存储库中。此外,您可以完全控制docker处理当前应用程序的情况 如果要将应用程序保留在已装入的卷中,您必须记住以下问题:
- 应用程序的生命周期—当您必须更新应用程序时,如何处理容器—轻轻停止、覆盖并再次运行
- 如何部署您的应用程序?您必须通过SSH手动部署,或者您只想运行简单的命令docker run,它从您的存储库中运行您的最新版本
- 您希望容器具有外部公开的设置-这也不是一个好主意
- 您希望从外部访问应用程序生成的数据,如日志、数据库等
- 为每个应用程序生成映像并推送到存储库
- 例如,用于自动更新生产服务器上的系统
我的建议是使用一些持续集成工具创建一个管道,并完全自动化从代码构建、docker映像构建到部署到您的环境的过程。这里的其他答案解释了将代码构建到您的映像中的要点,我想更进一步,向您展示如何在遵循此最佳实践的同时获得两个世界的好处 Docker最佳实践要求在部署之前将源代码构建到映像中,而不是部署安装了依赖项的映像,然后将源代码作为卷装入 这为您提供了一个自包含、可移植的容器,可以直接进行测试、部署或回滚 我可以试一下你为什么要考虑热安装代码吗 热安装代码之所以吸引人,有几个原因——它们都很容易实现,而不必牺牲构建自包含映像的最佳实践:
- 构建Docker映像可能会很慢,所以当您可以热装载代码时,为什么要重新构建以进行小的更改呢
一个补充的最佳实践是使用一个安装所有依赖项的“基本映像”——通常是构建docker映像的缓慢部分。关键是这个基本图像不会经常改变
但是从它派生的映像--安装源代码的应用程序映像--将随着您要部署的每次提交而改变。这一衍生图像的构建速度将非常快。Dockerfile可以简单到:
FROM myapp/base . # all dependencies installed in base image ADD code.tar.gz /src # automatic untaring! CMD [...] # whatever it takes to run your app
- 热安装可以加快开发周期,因为开发人员不需要刷新docker容器、重建和运行新容器就可以看到更改 这是一个公平的观点。我建议创建一个“dev”映像(它也将从基本映像派生),通过卷而不是测试和部署映像中的源代码安装步骤来实现代码装载