我正处在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/
答案 0 :(得分:1)
运行或使用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
,则可能运行的代码版本与预期不同。 (同样,这在Kubernetes中几乎是必需的。)
我认为Docker Swarm与您所描述的不是很好的匹配,但是您可能会看到诸如Chef或Ansible之类的自动化工具,该工具旨在进行配置更改并在远程主机上启动服务,而不是尝试手动操作-编写ssh
命令。