前言
coding介绍
coding和portainer CICD构建
docker镜像更新问题
通过Watchtower 实现镜像自动更新
部署架构
前言
随着Devops的兴起,CICD也越来越成熟,即持续集成(Continuous Integration)、持续交付(Continuous Delivery) 、持续部署(Continuous Deployment)。目前大家在公司里想必都用的很熟练了,今天教大家如何薅一波羊毛,搭建属于自己的CICD。
1.搭建portainer
1.1 portainer 介绍
官网对portainer的描述是:Powerful container management for platform teams,devs …
Deploy, configure, troubleshoot and secure containers in minutes on Kubernetes, Docker, Swarm and Nomad in any cloud, data center or device.
翻译过来就是强大的容器管理平台,可以在几分钟内部署、配置、故障排除在任何云、数据中心或设备中的 Kubernetes、Docker、Swarm 和 Nomad 上。
最重要的一点是它可以免费试用,相比于openshift等容器管理平台,更加轻便简单。
1.2 portainer 搭建
docker run -d --name portainer -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v /app/portainer_data:/data --restart always --privileged=true portainer/portainer-ee:latest
必要条件是要安装docker-compose,而且版本要对应上docker的版本。
这里示例一份compose文件
version: '3'
services:
portainer:
image: portainer/portainer-ee:latest
command: -H unix:///var/run/docker.sock
restart: always
ports:
9000:9000
8000:8000
volumes:
/var/run/docker.sock:/var/run/docker.sock
portainer_data:/data
volumes:
portainer_data:
1.3 portainer版本
portainer/portainer 和 portainer/portainer-ce,企业版有一个portainer-ee。
portainer/portainer 是 1.X版本(老版本)镜像。官方现在已弃用此镜像。
不过目前网上教程都是以此镜像为准。我刚开始也没注意,结果被坑到了。
如果要使用一些收费功能,比如webhook等,最好建议使用portainer-ee企业版。
1.4 免费lincense申请
然后输入个人信息,你就会收到发送到你私人邮箱的linsence地址。
薅完一波portainer的羊毛,接下来我们薅一波腾讯云coding的羊毛。
2.Coding
2.1 Coding介绍
打开coding 官网 https://coding.net/
直接免费注册一个。
对于我们个人研究其实很强大了。
3.coding和portainer CICD构建
3.1 Portainer 配置
点击add stack
前提是保证docker-compose存在于你的项目根路径下。不然deploy stack会失败。
成功后会生成一个webhook链接。copy链接在postman工具就可以直接调通,启动好程序。
例
3.2 coding配置
Git仓库普通支持webhook机制,一般的工作原理是
4.docker镜像更新问题
问题: docker不会自动更新正在运行的容器的镜像
up --force-recreate --build -d
docker image prune -f
这样就和CD事与愿违了。
解决方案:
翻墙后看到的方案有:
4.1 pull_policy
Since 2020-05-07, the docker-compose spec also defines the "pull_policy" property for a service:
Possible values are (tl;dr, check spec for more details):
always: always pull
never: don't pull (breaks if the image can not be found)
missing: pulls if the image is not cached
build: always build or rebuild
将docker-compose更改成这样
然后重新出发CICD,发现镜像并未更新
查看docker-compose官方说明,并更新了docker-compose版本https://docs.docker.com/compose/compose-file/
发现并未起作用。
不知道大家有没有遇到同样的问题,给我一点指导,万分感谢。
4.2 portainer wehook
既然我们是通过portainer来实现CD,那我们查查portainer是否有解决方案。
当webhook 调用后,它不会检查stack用的镜像是否是最新的。
然后有人推荐使用portainer 企业版,事实上我也是用的企业版。
所以从目前来看,用portainer的stack的webhook来实现CD时机尚未成熟。
5.通过Watchtower 实现镜像自动更新
Watchtower 是一款自由开源的应用,用来监控运行中的 Docker 容器,并且当它发现基础镜像被更改后,可以自动的更新容器。
若 Watchtower 发现一个运行中的容器需要更新,它会以发送 SIGTERM 信号的方式,优雅的结束运行中容器的运行。
它会下载新镜像,然后以最初部署时使用的方式,重启容器。所有文件会在后台自动下载,因此不需要用户的介入。
5.1 创建私有库registry配置文件
官方地址:https://containrrr.dev/watchtower/private-registries/
{
"auths": {
"<REGISTRY_NAME>": {
"auth": "XXXXXXX"
}
}
}
REGISTRY_NAME 就是你的私有registry的地址,这里我们用的coding,对应的就是coding的私有库地址
接下来生成auth token
echo -n 'username:password' | base64
这也是通用的生成base 64 token的方法,也可以通过postman来生成
5.2 部署watchtower
准备挂载文件目录
这里我们自己生成的,按照自己的目录习惯放置即可
mkdir -p /etc/watchtower/config
chmod -R 777 /etc/watchtower/config
启动watchtower
docker run -d
--name watchtower
-v /etc/watchtower/config/config.json:/config.json
-v /var/run/docker.sock:/var/run/docker.sock
--restart unless-stopped containrrr/watchtower
-c container tag name
--interval 100
参数介绍:
-c 自动清除旧镜像 ,不然很多none的镜像出现
–interval 100(-i 100):设置自动更新检查频率(秒)我这里是设置的100s,如果不指定,则默认24小时后执行
container tag name:需要更新的容器名称,多个用逗号分隔
--restart=unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器。
查看日志
测试:
当我们更新代码,然后coding自动会编译部署打包,并将新的镜像推送到制品库,然后watchtower 发现有新的镜像,然后重新拉取新镜像,构建新的容器。这样面向个人开发者CICD部署系统即完成.
6.部署架构
最终我们部署架构变成下面这样,用watchtower去自动更新镜像,portainer作为容器管理的web ui界面。

因为你的分享、点赞、在看


原文始发于微信公众号(小李的源码图):如何用Coding和portainer构建自己的CICD
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/145377.html