【问题标题】:How to deploy an application running in docker - best practice?如何部署在 docker 中运行的应用程序 - 最佳实践?
【发布时间】:2018-01-05 12:32:21
【问题描述】:

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

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

所以我们讨论的选项是:

  1. 构建包含应用程序代码的映像
  2. 使用卷并将应用程序代码存储在服务器上

最佳做法是什么?为什么?

【问题讨论】:

  • 所以,如果我理解得很好,您可以将应用程序“编译”在版本控制之下。您的结果没有某种类型的存储库吗?

标签: docker deployment dockerfile pipeline


【解决方案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 容器、重建和运行新容器来查看变化。

    这是一个公平的观点。我建议制作一个“开发”映像(也将派生自您的基础映像),以便通过卷而不是您在测试和部署映像中的源代码安装步骤来安装代码。

【讨论】:

    【解决方案2】:

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

    如果要将应用程序保留在已安装的卷中,您必须牢记以下问题:

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

    安装的卷更适合以下情况:

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

    要完全自动化,您可以:

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

    【讨论】:

      【解决方案3】:

      我认为您应该遵循第一种方法,即每次代码发生更改时都重新构建 docker 映像。原因是——

      1. 首先,如果你使用volume,每次你必须管理干净关闭和删除以前版本的应用程序,并检查新版本的应用程序是否运行正常。您的新应用程序可能会受到以前版本的应用程序的依赖项的影响。这也需要注意。
      2. 其次,安装的框架可能会有一些版本更新,并且一些新的框架将与当前应用程序一起安装。在这种情况下,第一种方法似乎是唯一的选择。
      3. 第三,当您使用 docker volume 时,您将删除 docker 最重要的功能,即从外部环境中抽象出来。此外,图像可能会因此变得依赖于机器,这可能会影响您是否要在多个环境中发布应用程序。

      我的建议是使用一些持续集成工具创建一个管道,并完全自动化从代码构建、构建 docker 映像并将其部署到您的环境的过程。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-03
        • 1970-01-01
        • 1970-01-01
        • 2011-05-19
        • 2015-08-05
        • 1970-01-01
        • 2014-10-12
        • 1970-01-01
        相关资源
        最近更新 更多