Docker配置Jenkins部署Springboot

  • Docker及Jenkins的安装参考 centos7安装docker及jenkins
  • Jenkins的配置参考 使用 Docker 安装 Jenkins 并实现项目自动化部署
  • Dockerfile启动参考 Docker+jenkins+springboot部署
  • docker not found解决参考 docker-in-docker出现docker: command not found的终极解决方案
  • Nginx反向代理Jenkins参考 Docker 安装 jenkins 并添加prefix为nginx配置反向代理

1.脚本式启动方式
  • Jenkins启动命令
docker run -itd -p 8080:8080 -p 50000:50000 
-v /usr/local/jenkins:/var/jenkins_home jenkins/jenkins:2.346.3
  • Shell脚本
#!/bin/bash
# 服务名称
SERVER_NAME=jenkins-demo
# 工程所在路径(根据自己情况进行调整)
APP_HOME=$(pwd)
# maven打包后的jar包名
JAR_NAME=jenkins-demo-0.0.1-SNAPSHOT.jar
# jar包的目录
JAR_PATH=${APP_HOME}/target
# 杀死之前的进程
PID_FILE="${APP_HOME}"/"${SERVER_NAME}".pid
if [ -f "${PID_FILE}" ];then
PID=`cat "$PID_FILE"` && kill -9 $PID && echo "kill process "${PID}" finished!"
fi
cd $JAR_PATH
# 修改文件权限
chmod 755 $JAR_NAME
# 启动服务
BUILD_ID=dontKillMe nohup java -jar $JAR_NAME &
# 将新进程ID写到文件中
JAVA_PID=$!
echo "${JAVA_PID}" > "${PID_FILE}"

Jenkins启动以后对项目进行构建,构建成功,但是docker ps命令发现容器内并没有多镜像,还是仅仅只有一个Jenkins,容器内curL访问项目接口可以访问到,但是宿主机上访问不到,除非docker run jenkins的时候添加端口映射,且Jenkins关闭的时候项目也会跟着被关闭


2.Dockerfile启动方式
  • Jenkins启动命令
docker run --name jenkins -u root --rm -d -p 8080:8080 -p 50000:50000 
-v /var/jenkins_home:/var/jenkins_home 
-v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins:2.346.3
  • Dockerfile
FROM jdk:8
VOLUME /tmp
ADD target/demo-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8888
ENTRYPOINT ["java", "-jar", "app.jar", "--spring.profiles.active=dev", 
"--server.port=8888", "> /log/app.log"]
  • Shell脚本
cd /var/jenkins_home/workspace/demo  //workspace后面跟的名字要和jenkins项目名一致
docker stop demo || true
docker rm demo || true
docker rmi demo || true
docker build -t demo .   //-t 指定新镜像名, '.'表示Dockerfile在当前路径
docker run -d -p 8888:8888 --name demo demo:latest

报错如下
[demo] /var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/maven3/bin/mvn clean install -Dmaven.test.skpi=true
The JAVA_HOME environment variable is not defined correctly
This environment variable is needed to run this program
NB: JAVA_HOME should point to a JDK not a JRE
Build step 'Invoke top-level Maven targets' marked build as failure
[demo] $ /bin/sh -xe /tmp/jenkins331387188918595394.sh

  • cd /var/jenkins_home/workspace/demo
  • docker stop demo
    /tmp/jenkins331387188918595394.sh: 3: docker: not found
  • true
  • docker rm demo
    /tmp/jenkins331387188918595394.sh: 4: docker: not found
  • true
  • docker rmi demo
    /tmp/jenkins331387188918595394.sh: 5: docker: not found
  • true
  • docker build -t demo .
    /tmp/jenkins331387188918595394.sh: 6: docker: not found
    Build step 'Execute shell' marked build as failure
    Finished: FAILURE
  • The JAVA_HOME environment variable is not defined correctly

我本以为是JAVA_HOME配错了,还去echo $JAVA_HOME看了一下,然后把echo到的地址配到了Jenkins全局变量里,结果错的离谱,因为我是yum安装的JDK,不需要配JAVA_HOME,而且容器内自带了JDK11,要配也是配容器内的JDK路径

  • /tmp/jenkins*.sh: 3: docker: not found

这个才是真正的报错,我无法在Docker容器内执行docker命令,解决办法:改Jenkins启动命令

docker run -itd -u root -p 8080:8080 -p 50000:50000 
--privileged=true     //真正获取root权限
-v /var/run/docker.sock:/var/run/docker.sock 
//重点是下面这行,因为我是用的Jenkins官方镜像,并非blueocean等,所以需要把二进制文件挂载进去
-v /usr/bin/docker:/usr/bin/docker     
-v /home/jenkins:/var/jenkins_home
jenkins/jenkins:2.346.3
  • FROM jdk:8 pull access denied for jdk, repository does not exist or may require 'docker login': denied: requested access to the resource is denied

这个问题改下Dockerfile就行了,因为Jenkins官方镜像自带的是JDK11,把Dockerfile的FROM jdk:8改成FROM openjdk:11就可以。
如果还是报错可能是因为Jenkins全局变量没配置,要配成容器内JDK地址,一般是/opt/java/openjdk,或者可以进容器内echo一下看看

项目启动部分结束

  • Jenkins配置Nginx反向代理

yum方式安装的nginx,一开始仅仅在nginx.conf文件下加了个location,页面无法加载,请求都是404

http{
     xxx
     xxx
     xxx
     server{
          listen        80;
          server_name   localhost;
          location /jenkins {
               proxy_pass  http://localhost:8080;
          }
     }
}

后来查了下应该在Jenkins启动命令上加上请求前缀,然后再改一下nginx.conf就好了

docker run -itd -u root 
-p 8080:8080 
-p 50000:50000 
--privileged=true 
-v /etc/localtime:/etc/localtime         //解决容器内时区不一致问题
-e TZ=Asia/Shanghai                      //解决容器内时区不一致问题
-e JENKINS_OPTS="--prefix=/jenkins"      //nginx反代配置
-v /var/run/docker.sock:/var/run/docker.sock 
-v /usr/bin/docker:/usr/bin/docker 
-v /home/jenkins:/var/jenkins_home 
jenkins/jenkins:2.346.3
http{
     xxx
     xxx
     xxx
     server{
          listen        80;
          server_name   localhost;
          location /jenkins {
               proxy_pass  http://localhost:8080/jenkins;
          }
     }
}
练习时长两天半,当然大部分时间在工作(摸鱼),总算是把项目跑起来了!

你可能感兴趣的:(Docker配置Jenkins部署Springboot)