通过 Gitlab CI/CD 将 docker 服务部署到自己的服务器的正确方法

Proper way to deploy docker services via Gitlab CI/CD to an own server

我的应用程序是使用 3 个 Docker 服务构建的:

到目前为止,我一直手动 登录自己的 Digital Ocean 服务器,克隆存储库并使用 docker-compose build && docker-compose up 启动服务。

我想从现在开始自动化这个过程。

鉴于 Gitlab CI/CD 管道和 运行 人员,将代码自动部署到 Digital Ocean 服务器的最佳方法是什么

[我在想什么,可能看起来非常 "beginner"]

想法 1:一旦提交被推送到 master -> Gitlab 运行ner 将构建服务,然后通过 scp 将其复制到 DO 服务器。问题:你如何启动服务?您是否通过 运行ner 的 ssh 连接到 DO 服务器,然后 运行 那里的启动脚本?

想法 2:在 DO 服务器上注册一个 worker,这样当它从 Gitlab 拉取数据时,它就拥有 DO 服务器本身的代码。它只需要构建它们和 运行。但这种方法不可扩展,而且看起来很老套。

我正在寻找一些思考指南或循序渐进的方法。

在生产部署场景中使用 Docker 的好处之一是您无需单独 scp 您的应用程序代码;您需要的一切都内置在图像中。

如果您使用的是像 Ansible 这样可以 directly run containers on remote hosts 的自动化系统,那么这很简单。您的 CI 系统构建 Docker 图像,用一些独特的版本标记标记它们,并将它们推送到存储库(Docker Hub,由您的云提供商提供的东西,您 运行 你自己)。然后它会触发自动化系统告诉它使用您构建的图像启动容器。 (就 Ansible 而言,它 运行 优于 ssh,因此这或多或少等同于其他基于 ssh 的选项;Chef 或 Salt Stack 等工具需要目标系统上的专用代理。)

如果您没有这样的自动化系统,但您在目标系统上安装了 ssh 和 Docker Compose,那么您可以只 复制docker-compose.yml 文件到目标主机,然后启动它。

TAG=...
docker push myname/myimage:$TAG
scp docker-compose.yml root@remote:
ssh root@remote env TAG=$TAG docker-compose up -d

另一种选择是使用像 Kubernetes 这样的专用集群管理器,并与其对话 API;然后集群将自己拉取更新的容器,你不需要 ssh 任何东西。在您讨论的规模上,这可能比您需要的重量要重得多。