系列文章
相关源码:https://github.com/SkyChenSky/Sikiro
地基
在软件工程不少的思想、概念来源于建筑工程,大家也喜欢把开发软件比喻成建房子。那么如果说运维是软件的地基,那么框架就是承重墙。起房子就是先打地基,再建承重墙。地基打得越稳,房子才能起得更高。也等同于运维技术越扎实,系统才能更加健壮。
特别在微服务兴起得时代,运维越发的现得尤为得重要,DevOps也风靡全球。只要聊起DevOps与微服务,CI/CD总是不能避免的。CI/CD不一定限制于微服务,我认为无论在什么样风格的架构和怎么样组织架构的团队,自动化技术越早使用收效越高。
我认为IT人员更多是脑力大于体力的劳动者,一些重复的、错误率高的、无法对自己有增长的工作应该尽早交给自动化技术处理,节省了不需要浪费的时间与精力,这样才能更好的去完成有价值、有意义的工作。
2020-12-1更新,下文之前做的时候是使用了Docker部署Jenkins,在默认情况Jenkins容器是无法与宿主的Docker命令公用的,因此我使用了SSH从Jenkins容器调用宿主的方式解决。后来经过和同行沟通,使用了挂载docker.sock目录的方式,让Jenkinis容器调用宿主Docker指令的方式进行构建。为了保持原来文章的整体性,我打算在文章末尾额外加上新的方案。
部署图
以上是我在虚拟机环境的部署图:
一共三台服务器,每台服务器都装了Docker,Server B是docker swarm的Manger角色,A和C是worker。
在Server B装了Jenkins、Docker Registry、dotnet sdk,Server A装了Gitlab,Server C装了私有Nuget。
那么工作流程是:
- 迁入代码push到Gitlab
- Gitlab触发webhook的push触发事件并主动通知Jenkins构建
- Jenkins在Gitlab获取源码并通过配置好的规则与shell脚本进行构建
- 如果是工具库则dotnet push到192.168.88.139:8081的私有Nuget
- 如果是Web应用则通过dockerfile构建docker镜像并push到192.168.88.141:6000的Docker Registry,然后由docker swarm create多节点
安装Docker
安装最新版本Docker,并在所有需要使用docker的服务器节点根据以下步骤安装
升级yum并安装基础组件
yum upgrade -y
sudoyuminstall -y yum-utils device-mapper-persistent-data lvm2
添加安装源信息
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装docker-ce
yum makecache fast
yuminstall docker-ce -y
修改镜像源
vim /etc/docker/daemon.json
{ "registry-mirrors" : [ "http://ovfftd6p.mirror.aliyuncs.com", "http://registry.docker-cn.com", "http://docker.mirrors.ustc.edu.cn", "http://hub-mirror.c.163.com" ], "insecure-registries" : [ "registry.docker-cn.com", "docker.mirrors.ustc.edu.cn" ], "debug" : true, "experimental" : true }
启动docker
systemctl daemon-reload
systemctl enable docker
systemctl start docker
安装 Docker Registry(私有仓储)
选取一个服务器-Server B使用docker安装Registry
docker run -d -p 6000:5000 -v /root/docker_registry:/var/lib/registry --name private_registry registry
开放6000端口
firewall-cmd --permanent --add-port=6000/tcp
firewall-cmd --reload
以上就Registry安装完成了,但为了正常使用还需要做点配置修改
编辑所有需要docker registry使用的节点的daemon.json文件,确保能正常访问
vim /etc/docker/daemon.json
{ "insecure-registries":["192.168.88.141:6000"] } 重启docker systemctl daemon-reload service docker restart 如果需要推送镜像到私库确保标签(tag)前缀带有私库地址 docker push 192.168.88.141:6000/testdockerswarm
docker swarm的初始化
把相关涉及到docker swarm的节点端口开启
firewall-cmd --permanent --zone=public --add-port=2377/tcp
firewall-cmd --permanent --zone=public --add-port=4789/udp
firewall-cmd --permanent --zone=public --add-port=7946/udp
firewall-cmd --reload
选取Server B作为Manager节点,执行下面的指令后会出现docker swarm join的指令文本,复制保存下来
docker swarm init --advertise-addr 192.168.88.141
Server A和Server C为Worker节点,执行刚刚保存下来指令
docker swarm join --token SWMTKN-1-0odogegq3bwui4o76aq5v05doqqvuycb5jmuckjmvzy4bfmm59-ewht2cz6fo0r39ky44uv00aq5 192.168.88.141:2377
查看节点信息
docker node ls
私有Nuget的安装
选择Server C基于docker的Nuget安装 docker run -d \ -p 8081:80 \ --env NUGET_API_KEY=chengong \ -v /root/nuget/database:/var/www/db \ -v /root/nuget/packages:/var/www/packagefiles \ --name nuget-server \ sunside/simple-nuget-server 开放相关8081端口 firewall-cmd --permanent --add-port=8081/tcp firewall-cmd --reload 上传包指令,注意包名有中文会导致上传出现bad request dotnet nuget push --source http://192.168.88.139:8081/ -k chengong TestPackage.1.0.0.nupkg 删除包指令 dotnet nuget delete --source http://192.168.88.139:8081/ -k chengong TestPackage 1.0.0 如果在Windowsx系统可以通过工具上传 https://github.com/NuGetPackageExplorer/NuGetPackageExplorer
Gitlab的安装
在Server A服务器上基于docker安装
sudo docker run -d \
--hostname192.168.88.138 \
-p 443:443 -p 8080:80 -p 2222:22 \
--name gitlab \
--restart always \
-v /root/gitlab/config:/etc/gitlab:Z \
-v /root/gitlab/logs:/var/log/gitlab:Z \
-v /root/gitlab/data:/var/opt/gitlab:Z \
gitlab/gitlab-ce
开放端口
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload