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

通过Gitlab CI/CD将docker服务部署到自己的服务器的正确方法,docker,continuous-integration,gitlab,continuous-deployment,Docker,Continuous Integration,Gitlab,Continuous Deployment,我的应用程序是使用3个Docker服务构建的: 后端(反应) 前端(Node.js) nginx(路由流量) 到目前为止,我一直在手动登录到自己的Digital Ocean服务器,克隆存储库并使用docker compose build和&docker compose Up启动服务 从现在开始,我想自动化这个过程 考虑到Gitlab CI/CD管道和运行程序,自动将代码部署到Digital Ocean server的最佳方法是什么 [我当时的想法可能看起来非常“初学者”] 想法1:一旦提交被

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

  • 后端(反应)
  • 前端(Node.js)
  • nginx(路由流量)
到目前为止,我一直在手动登录到自己的Digital Ocean服务器,克隆存储库并使用
docker compose build和&docker compose Up启动服务

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

考虑到Gitlab CI/CD管道和运行程序,自动将代码部署到Digital Ocean server的最佳方法是什么

[我当时的想法可能看起来非常“初学者”]

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

想法2:在DO服务器上注册一个worker,这样当它从Gitlab中提取数据时,它就可以在DO服务器上保存代码。它只需要构建它们并运行。但这种方法是不可扩展的,而且看起来很粗糙


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

在生产部署场景中使用Docker的好处之一是,您不需要单独
scp
应用程序代码;您所需要的一切都已融入图像中

如果您使用的是像Ansible这样的自动化系统,那么这很简单。您的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进行任何操作。在您正在讨论的规模上,这可能比您需要的要重得多。

在生产部署场景中使用Docker的好处之一是,您不需要单独
scp
您的应用程序代码;您所需要的一切都已融入图像中

如果您使用的是像Ansible这样的自动化系统,那么这很简单。您的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进行任何操作。在你所讨论的天平上,这可能比你需要的重量要重得多。

事实上,库伯内特斯在这个阶段会做得过火。这个解决方案对我来说似乎很好,谢谢!事实上,库伯内特斯在这一阶段将被过度杀戮。这个解决方案对我来说似乎很好,谢谢!