如何使用 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 化应用程序的不错选择。但我似乎找不到一个很好的教程来详细解释我的(简单?)用例,以便我可以实现它。
这是我目前的发现:
可以通过 SSH 在远程主机上执行部署。但是教程只解释了如何移动文件,而不是容器。 [1]
似乎 Docker Swarm 是我可以使用的东西,但是教程没有解释我如何将 Codeship 指向我的远程主机 运行ning docker 群 [2]
我可以尝试推送到 (Docker) 注册表,然后在远程主机上启动 docker 以拉取映像并 运行 它。但不知何故,这感觉不像是最佳实践解决方案。还是我错了?
欢迎任何帮助+提示!
[1] https://documentation.codeship.com/pro/continuous-deployment/ssh-deploy/
[2] https://documentation.codeship.com/pro/continuous-deployment/docker-swarm/
运行 或使用 Docker 注册表几乎总是被认为优于 docker save
和 docker load
(如果可以的话)。您可以 run your own,或使用像 Docker Hub 或 Amazon 的 ECR 或 Google 的 GCR 或...这样的云托管的。要使用它,您需要
在你的镜像名称中到处包含注册表地址,docker build -t registry.example.com/my/image:tag
;
docker push
构建的镜像而不是保存它;和
只需docker run
镜像名称中包含注册表地址的镜像,Docker会为您拉取。
(如果您正在考虑迁移到像 Kubernetes 这样的集群解决方案,这基本上是必需的。)
让您的 CI 系统为每个构建使用唯一标签通常也是一个好主意;日期戳或源代码控制提交 ID 都是方便的选项。不要使用 latest
标签或任何其他固定字符串。如果你 docker run my/image:20190911
并且服务器还没有那个构建那么它会知道它需要拉它,但是如果你 运行 ...:latest
你可能 运行ning与您预期不同的代码版本。 (同样,这在 Kubernetes 中几乎是必需的。)
我认为 Docker Swarm 不适合您所描述的内容,但您可能会考虑像 Chef 或 Ansible 这样的自动化工具,它们旨在进行配置更改并在远程启动服务主机而不是尝试手写 ssh
命令。
我正处于 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 化应用程序的不错选择。但我似乎找不到一个很好的教程来详细解释我的(简单?)用例,以便我可以实现它。
这是我目前的发现:
可以通过 SSH 在远程主机上执行部署。但是教程只解释了如何移动文件,而不是容器。 [1]
似乎 Docker Swarm 是我可以使用的东西,但是教程没有解释我如何将 Codeship 指向我的远程主机 运行ning docker 群 [2]
我可以尝试推送到 (Docker) 注册表,然后在远程主机上启动 docker 以拉取映像并 运行 它。但不知何故,这感觉不像是最佳实践解决方案。还是我错了?
欢迎任何帮助+提示!
[1] https://documentation.codeship.com/pro/continuous-deployment/ssh-deploy/
[2] https://documentation.codeship.com/pro/continuous-deployment/docker-swarm/
运行 或使用 Docker 注册表几乎总是被认为优于 docker save
和 docker load
(如果可以的话)。您可以 run your own,或使用像 Docker Hub 或 Amazon 的 ECR 或 Google 的 GCR 或...这样的云托管的。要使用它,您需要
在你的镜像名称中到处包含注册表地址,
docker build -t registry.example.com/my/image:tag
;docker push
构建的镜像而不是保存它;和只需
docker run
镜像名称中包含注册表地址的镜像,Docker会为您拉取。
(如果您正在考虑迁移到像 Kubernetes 这样的集群解决方案,这基本上是必需的。)
让您的 CI 系统为每个构建使用唯一标签通常也是一个好主意;日期戳或源代码控制提交 ID 都是方便的选项。不要使用 latest
标签或任何其他固定字符串。如果你 docker run my/image:20190911
并且服务器还没有那个构建那么它会知道它需要拉它,但是如果你 运行 ...:latest
你可能 运行ning与您预期不同的代码版本。 (同样,这在 Kubernetes 中几乎是必需的。)
我认为 Docker Swarm 不适合您所描述的内容,但您可能会考虑像 Chef 或 Ansible 这样的自动化工具,它们旨在进行配置更改并在远程启动服务主机而不是尝试手写 ssh
命令。