如何用Coding和portainer构建自己的CICD


前言
portainre介绍
coding介绍

coding和portainer CICD构建
docker镜像更新问题
通过Watchtower 实现镜像自动更新
部署架构



前言

        

        随着Devops的兴起,CICD也越来越成熟,即持续集成(Continuous Integration)、持续交付(Continuous Delivery) 、持续部署(Continuous Deployment)。目前大家在公司里想必都用的很熟练了,今天教大家如何薅一波羊毛,搭建属于自己的CICD。

   

1.搭建portainer

1.1 portainer 介绍

Portainer 官网地址:https://www.portainer.io/

官网对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等容器管理平台,更加轻便简单。

如何用Coding和portainer构建自己的CICD

1.2 portainer 搭建

Portainer使用docker搭建方式很简单,官方搭建指引:https://docs.portainer.io/start/install
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,而且版本要对应上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版本

通过访问docker 镜像地址 https://hub.docker.com/

如何用Coding和portainer构建自己的CICD

可以发现,目前portainer官方提供的社区版主要有两个镜像
portainer/portainer 和 portainer/portainer-ce,企业版有一个portainer-ee。

portainer/portainer 是 1.X版本(老版本)镜像。官方现在已弃用此镜像。
不过目前网上教程都是以此镜像为准
。我刚开始也没注意,结果被坑到了。
如果要使用一些收费功能,比如webhook等,最好建议使用portainer-ee企业版。

如何用Coding和portainer构建自己的CICD

1.4 免费lincense申请

访问portainer官网,点击get started free

如何用Coding和portainer构建自己的CICD


然后输入个人信息,你就会收到发送到你私人邮箱的linsence地址。

如何用Coding和portainer构建自己的CICD

     然后访问ip:9000,输入该lincense地址即可。

如何用Coding和portainer构建自己的CICD

    可以看到有效期有三年,portainer还是很给力的。
薅完一波portainer的羊毛,接下来我们薅一波腾讯云coding的羊毛。

2.Coding

2.1 Coding介绍

打开coding 官网 https://coding.net/


如何用Coding和portainer构建自己的CICD

直接免费注册一个。

如何用Coding和portainer构建自己的CICD

对于我们个人研究其实很强大了。

如何用Coding和portainer构建自己的CICD

3.coding和portainer CICD构建

3.1  Portainer 配置

如何用Coding和portainer构建自己的CICD

点击add stack

如何用Coding和portainer构建自己的CICD


如何用Coding和portainer构建自己的CICD

前提是保证docker-compose存在于你的项目根路径下。不然deploy stack会失败。
成功后会生成一个webhook链接。copy链接在postman工具就可以直接调通,启动好程序。

如何用Coding和portainer构建自己的CICD

如何用Coding和portainer构建自己的CICD

3.2  coding配置

Git仓库普通支持webhook机制,一般的工作原理是

如何用Coding和portainer构建自己的CICD

这种方式是基于git 事件来触发的。这里想实现的是通过pipeline的方式去tigger,所以这整个流程变成下面这样。

如何用Coding和portainer构建自己的CICD

所以需要在CI流程将镜像打包推到dockerhub后(coding叫制品仓库),tigger portatiner webhook实现服务自动部署更新。这样就能真正“解放”devops双手了。

如何用Coding和portainer构建自己的CICD

Portainer shell脚本很简单,配置potainer webhook脚本地址即可。

如何用Coding和portainer构建自己的CICD

这样每当我们push代码到git仓库后,整套CICD流程就会自动编译打包并部署我们微服务了。

4.docker镜像更新问题


问题: docker不会自动更新正在运行的容器的镜像


无法动态更新docker-compose.yml 的镜像,所以将镜像名tage更改为latest,但是当docker中存在latest镜像时,docker-compose不会从registry更新镜像。需要手动去停止容器,删除旧镜像,重新pull镜像。

如何用Coding和portainer构建自己的CICD

docker-compose up --force-recreate --build -ddocker 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更改成这样

如何用Coding和portainer构建自己的CICD

然后重新出发CICD,发现镜像并未更新

查看docker-compose官方说明,并更新了docker-compose版本https://docs.docker.com/compose/compose-file/

如何用Coding和portainer构建自己的CICD

发现并未起作用。

不知道大家有没有遇到同样的问题,给我一点指导,万分感谢。

4.2 portainer wehook 

既然我们是通过portainer来实现CD,那我们查查portainer是否有解决方案。

如何用Coding和portainer构建自己的CICD

当webhook 调用后,它不会检查stack用的镜像是否是最新的。


如何用Coding和portainer构建自己的CICD

然后有人推荐使用portainer 企业版,事实上我也是用的企业版。

所以从目前来看,用portainer的stack的webhook来实现CD时机尚未成熟。


如何用Coding和portainer构建自己的CICD


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

准备挂载文件目录


如果是自动生成,对应的config文件地址是root/.docker/config.json
这里我们自己生成的,按照自己的目录习惯放置即可
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守护进程启动时就已经停止了的容器。


查看日志


同样我们通过portainer来管理watchtower,查看watchtower日志。


如何用Coding和portainer构建自己的CICD

测试:
   当我们更新代码,然后coding自动会编译部署打包,并将新的镜像推送到制品库,然后watchtower 发现有新的镜像,然后重新拉取新镜像,构建新的容器。这样面向个人开发者CICD部署系统即完成.


6.部署架构

    最终我们部署架构变成下面这样,用watchtower去自动更新镜像,portainer作为容器管理的web ui界面。


如何用Coding和portainer构建自己的CICD

如何用Coding和portainer构建自己的CICD

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

我足足的精气神儿!
如何用Coding和portainer构建自己的CICD


如何用Coding和portainer构建自己的CICD
关注我的你,是最香哒!




原文始发于微信公众号(小李的源码图):如何用Coding和portainer构建自己的CICD

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/145377.html

(0)
青莲明月的头像青莲明月

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!