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

How to deploy a Docker container using a CI/CD service (Codeship)?

我正处于 DevOps 旅程的开始,有些事情对我来说仍然很难理解。我目前的情况是这样的:

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

#!/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 化应用程序的不错选择。但我似乎找不到一个很好的教程来详细解释我的(简单?)用例,以便我可以实现它。

这是我目前的发现:

欢迎任何帮助+提示!

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

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

运行 或使用 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 你可能 运行ning与您预期不同的代码版本。 (同样,这在 Kubernetes 中几乎是必需的。)

我认为 Docker Swarm 不适合您所描述的内容,但您可能会考虑像 Chef 或 Ansible 这样的自动化工具,它们旨在进行配置更改并在远程启动服务主机而不是尝试手写 ssh 命令。