首页 > 解决方案 > 使用 Docker 在我的 VPS 上部署我的应用程序的最佳实践是什么?

问题描述

我确实有一个(Python Flask)应用程序,我想使用 GitLab CI 和 Docker 将它部署到我的 VPS。

在我的服务器上,我想拥有我的应用程序的生产版本和暂存版本。它们都需要 MongoDB 连接。

我的计划是在 GitLab 上自动构建应用程序并将其推送到 GitLab 的 Docker Registry。如果我想将应用程序部署到登台或生产中,我会执行docker pull,docker rmdocker run.

计划是将配置(例如secret_key)存储在.production.env(和.staging.env)中并使用docker run --env-file ./env.list

我已经在我的服务器上安装了 MongoDB,应用程序的两个环境都应使用相同的 MongoDB 实例,但数据库名称不同(在 中配置.env)。

这是部署我的应用程序的最佳实践吗?你有什么建议?谢谢!

标签: dockergitlab-cidevops

解决方案


这是我的配置,在不同的组织和项目规模中运行良好:

构建:

  1. 这些应用程序位于git 存储库中(在您的情况下为 GitLab)。每个应用程序都有自己的 Dockerfile。
  2. 我使用Jenkins进行构建,当然,您可以使用任何其他 CD 工具。Jenkins 拉取应用程序的存储库,构建 docker 映像并将其发布到私有 Docker 存储库(在我的例子中是Nexus)。

部署:

  1. 我有一个独立于应用程序的中央存储库,其中包含一个 docker-compose 文件(或可能为不同环境扩展一个中央文件的多个文件)。此文件包含所有服务定义并引用我的 Nexus 存储库中的 docker 映像。
  2. 如果我使用秘密,我将它们存储在 HashiCorp Vault 实例中。詹金斯拉出它们,并将它们写入一个.env文件。docker-compose 文件可以引用各个环境变量。
  3. Jenkins 拉取 docker-compose 存储库,在我的情况下,通过 scp 将 docker-compose 文件和 .env 文件上传到我的服务器。
  4. 然后它会触发一个docker-compose up(对于较小的应用程序)或将一个 docker 堆栈重新部署到一个 swarm 中(对于较大的应用程序)。
  5. Jenkins 从目标服务器中删除所有内容。

如果你喜欢它,你可以通过 Docker Machine 执行第 3 步。然而,我觉得它的好处并不值得在我的案例中使用。


推荐阅读