使用 Docker 在 VPS 上部署应用程序的最佳实践是什么?

Luc*_*ild 5 docker gitlab-ci devops

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

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

我的计划是在 GitLab 上自动构建应用程序并将其推送到 GitLab 的 Docker 注册表。如果我想将应用程序部署到暂存或生产环境,我会执行docker pull,docker rmdocker run

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

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

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

fjc*_*fjc 4

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

构建:

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

部署:

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

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