微服务之一键部署git+maven+jenkins+docker

第一章 流程及原理

流程梳理:

    微服务一键部署实现后只需要将测试好的代码提交至版本管理工具(如:git、SVN),程序会自动实现更新代码并打包发布等后面的流程,省心省力。

第二章 实现过程

前置环境:

默认已经装好Jenkins、maven、docker和git。

关于Jenkins我多说一点,我的Jenkins也在docker容器中运行的,由于在Jenkins容器中默认无法使用docker命令,所以在Jenkins启动时需要加入以下参数:

-v /var/run/docker.sock:/var/run/docker.sock

-v $(which docker):/usr/bin/docker

或者直接使用下面的Dockfile自己做一个jenkins镜像:

FROM jenkins

 

USER root

#清除了基础镜像设置的源,切换成阿里云的jessie

RUN echo'' > /etc/apt/sources.list.d/jessie-backports.list \

  && echo"deb http://mirrors.aliyun.com/debian jessie main contrib non-free" > /etc/apt/sources.list \

  && echo"deb http://mirrors.aliyun.com/debian jessie-updates main contrib non-free" >> /etc/apt/sources.list \

  && echo"deb http://mirrors.aliyun.com/debian-security jessie/updates main contrib non-free" >> /etc/apt/sources.list

#更新源并安装缺少的包

RUN apt-get update && apt-get install -y libltdl7

 

ARG dockerGid=999

 

RUN echo"docker:x:${dockerGid}:jenkins" >> /etc/group \

USER jenkins

启动Jenkins:

$ docker run --name jenkins -p 7080:8080 -p 50000:50000 -v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime -v /var/docker_data/jenkins/jenkins_home:/var/jenkins_home -v /var/docker_data/jenkins/settings:/var/settings -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker -d my-jenkins

正式开始:

1、 在程序的Pom.xml文件中加入docker-maven-plugin插件,主要就是靠这个插件,编译项目打包成docker镜像。

<plugin>
   <groupId>com.spotify</groupId>
   <artifactId>docker-maven-plugin</artifactId>
   <version>1.0.0</version>
   <configuration>
      <dockerHost>http://dockerip地址:2375</dockerHost>
      <imageName>${project.artifactId}</imageName>
      <dockerDirectory>src/main/docker</dockerDirectory>
      <resources>
         <resource>
            <targetPath>/</targetPath>
            <directory>${project.build.directory}</directory>
            <include>*.jar</include>
         </resource>
      </resources>
   </configuration>
</plugin>

需要说明的是

dockerHost指定的是docker 服务主机的地址和端口。(如何打开docker监听端口在第三章 常见错误里面有写)

dockerDirectory指定了你的Dockerfile所在的位置。

2、 在项目的根目录下新建一个restart.sh脚本,脚本内容就是重新启动docker。用于打完包后重启容器。

#!/bin/bash
IMAGE=hyd-digital-center

docker stop myapp && docker rm myapp

sleep 3s

docker run -d -p 8085:8085 --name myapp ${IMAGE}:latest

3、 在Jenkins中新建项目,点击“配置”,源码管理选择git并填写项目的git地址。构建触发器选择Poll SCM,填写“*/1 * * * *”,意思是一分钟去查询一次git源码如果有更新则会自动构建。其他随意。

5、 构建环节:选择Invoke top-level Maventargets(中文插件翻译名“调用顶层Maven目标”),选择maven版本,Goals填写clean package -e docker:build -DskipTests -DdockerImageTags=latest,意思是使用maven的插件构建镜像,具体参数可以百度。

6、 构建环节:接着第五步,再增加一个构建步骤放下面,选择Executeshell,Command填写:

sh restart.sh脚本,表示构建完之后重启程序。注意和第5步的顺序不能错。

8、点击 “立即构建” (后面由Jenkins定时任务自动构建),完成后发现已经发布上去了,容器也重启了,圆满结束!

 

第三章 常见错误

 docker server的监听端口必须打开,找到docker.service文件,在“ExecStart参数”后面加上“ -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock”,命令如下:

vim /usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

systemctl daemon-reload

systemctl restart docker

1、Caused by:com.spotify.docker.client.exceptions.DockerException: java.util.concurrent.ExecutionException:com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException:java.io.IOException: Permission denied

解决:权限问题,表明Jenkins容器中无法使用docker命令。参考第二章的“前置环境”解决。

2、[ERROR]Failed to execute goal com.spotify:docker-maven-plugin:0.4.11:build(default-cli) on project springboot: Exception caught: Request error: POSTunix://localhost:80/build?t=springboot: 400: HTTP 400 Bad Request

解决:两个问题,一是docker的监听端口可能没配置或配置不成功;而是docker-maven-plugin版本问题,建议升级至1.0.0版本。

第四章 参考资料

       配置docker服务监听 spring boot docker 初尝试 - 每天一点 - 博客园

       Jenkins容器使用docker Jenkins(Docker容器内)使用宿主机的docker命令 - leolztang - 博客园

       插件问题Failed to com.spotify:docker-maven-plugin:HttpHostConnectException:Connect to localhost:2375_Java & Basketball-CSDN博客

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值