如何部署在docker中运行的应用程序 - 最佳实践?

时间:2018-01-05 12:32:22

标签: docker deployment dockerfile pipeline

我们正在讨论如何部署在docker容器中运行的应用程序。目前,我们在包含应用程序代码的管道中构建应用程序映像。这意味着每次应用程序更新时我们都必须构建docker镜像。

我们考虑的另一种方法是将应用程序代码放在服务器上的卷中。然后我们在服务器上使用git提取最新版本。所以图像不需要重建。

所以我们讨论的选项是:

  1. 构建包含应用程序代码的图像
  2. 使用卷并将应用程序代码存储在服务器上
  3. 最佳做法是什么?为什么?

3 个答案:

答案 0 :(得分:1)

虽然这里的其他答案已经解释了在您的图像中构建代码的重点,但我还想更进一步,向您展示如何获得两个世界的好处,同时遵循最佳状态实践。

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”图像(也将来自你的基本图像),它可以通过卷安装代码,而不是你在测试和部署映像中的源代码安装步骤。

答案 1 :(得分:0)

每次使用新应用程序构建映像时,您都可以轻松地将其稍后部署到客户或生产服务器上。当docker镜像准备就绪时,您可以将其保存在存储库中。此外,您可以完全控制Docker正在使用当前应用程序。

如果将应用程序保存在已安装的卷中,则必须记住以下问题:

  • 应用程序的生命周期 - 当您需要更新应用程序时如何处理容器 - 轻轻停止,覆盖并再次运行
  • 如何部署应用程序 - 您必须通过SSH手动执行,或者只想运行简单的命令docker run,并从存储库运行最新版本

安装的卷更适合跟随casses:

  • 您希望为容器提供外部曝光设置 - 这也不是一个好主意
  • 您希望从外部访问应用程序生成的数据,如日志,数据库等

要完全自动化,您可以:

  • 为每个应用程序构建映像并推送到存储库
  • 使用例如watchtower来自动更新生产服务器上的系统

答案 2 :(得分:0)

我相信你应该遵循第一种方法,即每次代码发生变化时重建docker镜像。原因是 -

  1. 首先,如果您正在使用卷,则每次必须管理干净关闭和删除以前版本的应用程序,并检查应用程序的新版本是否正确运行。您的新应用程序可能会受到以前版本的应用程序的依赖性影响。这也需要注意。
  2. 其次,可能会安装一些框架​​版本更新,并且会在当前应用程序中安装一些新框架。在这种情况下,第一种方法似乎是唯一的选择。
  3. 第三,当您使用docker volume时,您将删除docker最重要的功能,即从外部环境中抽象。此外,图像可能因此而变得依赖于计算机,如果您想在多个环境中发布应用程序,则可能会影响该图像。
  4. 我的建议是使用一些持续集成工具创建管道,并从代码构建,构建docker镜像并将其部署到您的环境中完全自动化流程。