如何使用CI / CD服务(Codeship)部署Docker容器?

时间:2019-09-11 18:58:25

标签: docker deployment devops docker-swarm codeship

我正处在DevOps旅程的开始,我仍然很难理解某些事情。我目前的情况是:

我有一个非常简单的dockerized应用程序(只有一个端点,没有状态)。我目前使用带有如下所示部署脚本的服务器将其部署到一台服务器:

#!/usr/bin/env bash

# build docker image
docker build -t my/image .

# save docker image (to tmp)
docker save -o /tmp/my-image.tar my/image

# upload docker image
scp /tmp/my-image.tar user@xxx.xxx.xxx.xxx:~/

# load docker container
ssh -t user@xxx.xxx.xxx.xxx "sudo docker load -i /tmp/my-image.tar"

# stop docker container on remote host
ssh -t user@xxx.xxx.xxx.xxx "sudo docker stop image"

# start docker container
ssh -t user@xxx.xxx.xxx.xxx "sudo docker run -d --rm -p 8081:8081 --name myimage --restart always --env-file ~/.env.prod my/image"

现在,我想为该服务构建适当的自动化CI / CD管道。它应该可以部署到不同的环境。我想运行自动化测试。等等

我研究了一下,发现Codeship(Pro)似乎是Docker化应用程序的不错选择。但是我似乎找不到一个很好的教程来详细说明我的(简单?)用例,以使我可以实现它。

这是我到目前为止发现的内容:

  • 可以通过SSH在远程主机上执行部署。但是本教程仅说明如何移动文件,而不是容器。 [1]

  • 似乎可以使用Docker Swarm,但本教程并未说明如何将Codeship指向运行docker swarm的远程主机[2]

  • 我可以尝试推送到(Docker)注册表,然后在远程主机上启动docker来拉取映像并运行它。但是以某种方式,这似乎并不是最佳实践的解决方案。还是我错了?

欢迎任何帮助+提示!

[1] https://documentation.codeship.com/pro/continuous-deployment/ssh-deploy/

[2] https://documentation.codeship.com/pro/continuous-deployment/docker-swarm/

1 个答案:

答案 0 :(得分:1)

运行或使用Docker注册表几乎总是被认为比docker savedocker load更可取。您可以run your own,或使用云托管的服务,例如Docker Hub或Amazon的ECR或Google的GCR或...。要使用此功能,您需要

  1. 在您的映像名称中到处都有注册表地址docker build -t registry.example.com/my/image:tag;

  2. docker push构建的图像,而不是保存它;和

  3. docker run映像名称中包含注册表地址的映像,Docker就会为您拉取。

(如果您正在考虑使用Kubernetes之类的集群解决方案,那么这是必不可少的。)

让您的CI系统为每个版本使用唯一的标记通常也是个好主意;日期戳或源控件提交ID都是方便的选择。请勿使用latest标记或任何其他固定字符串。如果您使用docker run my/image:20190911并且服务器还没有该版本,则它将知道需要将其拉出,但是如果您运行...:latest,则可能运行的代码版本与预期不同。 (同样,这在Kubernetes中几乎是必需的。)

我认为Docker Swarm与您所描述的不是很好的匹配,但是您可能会看到诸如Chef或Ansible之类的自动化工具,该工具旨在进行配置更改并在远程主机上启动服务,而不是尝试手动操作-编写ssh命令。