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

时间:2019-06-20 12:44:04

标签: docker gitlab-ci devops

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

在我的服务器上,我希望拥有我的应用程序的正式版和登台版。他们两个都需要MongoDB连接。

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

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

将其传递给应用程序

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

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

2 个答案:

答案 0 :(得分:1)

这是我的配置,在不同的组织和项目规模中都能很好地工作:

要构建:

  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。我觉得,但是,在我的案子中并不能保证它的好处。

答案 1 :(得分:0)

我可以推荐的一件事是,我已经在生产中做过几次,就是部署带有TLS加密端点的Docker Swarm。 This link讨论了如何通过证书保护群。这是一项工作,但是它将允许您做的是为应用程序定义服务。

这些服务一旦联机,便可以具有多个副本,并且每当您更新一项服务(即IE部署新映像)时,这些群集都将确保所有服务始终在线。

docker service update <service name> --image <new image name>

某些VPS服务器实际上具有Kubernetes作为服务(如Digital Ocean),如果这样做,则更可取。 Gitlab实际上具有autodevops功能,并且可以远程管理Kubernetes集群,但是您也可以使用kubectl进行手动部署。