通过Jenkins + Docker实现antdPro自动化推送私服、自动容器化部署功能

Docker与Docker私服

1. 安装docker

https://docs.docker.com/install/

2. 配置docker镜像加速

https://www.daocloud.io/mirror

3. 安装启动docker私服

https://docs.docker.com/registry/deploying/

# 启动docker私服
docker run -d -p 5000:5000 --restart=always --name registry registry:2

4. docker配置私服地址,并且加入http访问私服名单

# 方案1
vim /etc/docker/daemon.json
# 添加配置`"insecure-registries":["172.18.123.72:5000"],`到json对象中
systemctl reload-daemon
systemctl restart docker

# 方案2
# 修改docker启动命令,注入配置参数 
vim /usr/lib/systemd/system/docker.service
# ExecStart=/usr/bin/dockerd后添加配置:” --insecure-registry 172.16.48.129:5000“
systemctl reload-daemon
systemctl restart docker

5. docker施一公ubuntu镜像验证私服功能

拉取镜像发送到私服,使用ubuntu:16.04镜像,并且重新打tagmy-ubuntu, 然后推送到私人仓库. 最后镜像
ubuntu:16.04my-ubuntu镜像从本地删除my-ubuntu镜像从私服中拉取。

$ docker pull ubuntu:16.04
$ docker tag ubuntu:16.04 localhost:5000/my-ubuntu
$ docker push localhost:5000/my-ubuntu
$ docker image remove ubuntu:16.04
$ docker image remove localhost:5000/my-ubuntu
$ docker pull localhost:5000/my-ubuntu

6. docker私服api操作参考文档

https://docs.docker.com/registry/spec/api/#detail

配置自动化集成环境

1. 安装jenkins

# 先安装java环境:参考百度
# 获取官方jar包
wget http://ftp-nyc.osuosl.org/pub/jenkins/war-stable/2.164.2/jenkins.war
# 使用命令行直接启动,配置文件生成在home目录中的.jenkins目录中
java -jar jenkins.war --httpPort=8080 &
# 日志中含有启动验证秘钥,或者在文件中
cat /var/jenkins_home/secrets/initialAdminPassword
# 默认配置安装,设定管理员账号,进入jenkins

2. fork antd-design-pro项目到自己的github仓库

git clone https://github.com/fly-piglet/ant-design-pro.git

3. 添加编译脚本

docker-publish.sh记得赋予可执行权限

# 设定私服地址
registryhosts="localhost:5000"
# 设定项目名称
imageName="project"
# 设定容器启动名称
containerName="project"
# 设定tag,默认使用latest、实际按照生产版本进行使用
tag="latest"
# 拼接镜像的名字
allImageNmae="${registryhosts}/${imageName}:${tag}"
echo "1. 安装依赖 + 编译项目"
npm install && npm run build
echo "2. 编译镜像 + 标签镜像"
docker build  -f Dockerfile.hub -t ${allImageNmae} ./
echo "3. 推送镜像"
docker push ${allImageNmae}

4. 添加启动脚本

docker-start.sh启动镜像脚本,可以在部署目标机器执行

# 设定私服地址
registryhosts="localhost:5000"
# 设定项目名称
imageName="project"
# 设定容器启动名称
containerName="project"
# 设定tag,默认使用latest、实际按照生产版本进行使用
tag="latest"
# 拼接镜像的名字
allImageNmae="${registryhosts}/${imageName}:${tag}"
# 启动的端口地址
port="8060"
echo "1. 停止容器 + 删除容器 + 删除镜像"
docker stop ${containerName} && docker rm ${containerName} && docker rmi ${allImageNmae}
echo "2. 拉取镜像"
docker pull ${allImageNmae}
echo "3. 启动镜像"
docker run -d -p ${port}:80 --name=${containerName} --restart=always ${allImageNmae}
echo "4. 部署完毕: http://localhost:${port}/"

最佳实践

Ci流程:通过git的webhook + jenkins自动化编译 + 自动化ssh远端机器 + 自动化部署。
环境区分:默认的配置文件为开发环境的配置,生产环境通过-v外挂配置文件实现环境切换
使用配置文件进行区分,方便保证镜像经过开发环境的测试,只是配置不同,保证一致性。
版本区分:tag:无或者默认为latest,需要管理版本按照1.0.0的顺序递增修改版本号即可
前端docker镜像,暂时没哟版本管理的需求,使用最新版,需要则启用。

后续优化

使用Jenkinsfile以及管道的形式配置,内置docker容器进行打包编译

引入docker-compose.yml配置环境启动,通过配置文件进行环境配置

npm中引入命令体系,直接进行打包和发布

后端引入docker部署

  1. 配置中心:默认一套jar包配置实现一个项目不同环境固定部署,基于这个条件在通过-e、或者-v修改配置文件实现配置修改,项目暂时不引入配置中心
  2. 日志中心:引入elk服务,后续入口集成redis或者kafka进行缓存
  3. 工程化流程:
    1. 使用maven插件进行镜像的打包和推送,通过命令进行服务的启动
    2. 优化内部jar包名称,在dockerfile进行处理的时候,统一化外部端口映射,保证启动脚本的统一抽象。

遇到的问题

  1. jenkins使用docker部署的使用,出现既需要node环境,🈶需要docker环境的情况,使用容器部署无法解决
  2. jenkins改用war包部署,含有node和docker环境,但是使用容器中进行publish的时候,无法推送到本地端口,容器网络的问题

参考命令

查看镜像

curl http:/localhost:5000/v2/_catalog

查看镜像版本

curl http:/localhost:5000/v2/project/tags/list

清理镜像
删除所有镜像,-f "dangling=true"过滤没有打标签的:默认是有打标签,-q:只显示ids编号

docker rmi $(docker images -f "dangling=true" -q)

停止容器 删除容器

docker stop <contrinerId> && docker rm <contrinerId>

推送和拉取每次都会更新最新的镜像,只要私服有更新本地就会更新

posted @ 2019-04-16 13:52  努力编程的小猪  阅读(1937)  评论(0编辑  收藏  举报