利用docker安装jenkins

1.基于公共jenkins镜像构建自定义镜像

创建jenkins资源相关目录
mkdir jenkins
cd jenkins
将之前下载好的maven、openjdk、nodejs的安装包放入此文件夹中,以及maven的setting.xml文件
创建Dockerfile文件
vim Dockerfile
内容如下
FROM jenkins/jenkins
EXPOSE 8080
 
# 将maven和jdk添加到容器中
# tar.gz添加进去后会自动解压,无需手动解压
ADD apache-maven-3.6.1-bin.tar.gz /usr/local
ADD openjdk-8u44-linux-x64.tar.gz /usr/local
ADD node-v14.0.0-linux-x64.tar.gz /usr/local
 
# 覆盖容器里的settings.xml
ADD settings.xml /usr/local/apache-maven-3.6.1/conf/
 
# 配置环境变量
ENV TZ=Asia/Shanghai
ENV M2_HOME=/usr/local/apache-maven-3.6.1
ENV NODE_HOME=/usr/local/node-v14.0.0-linux-x64
 
# 配置maven、node的环境变量
# jdk环境变量不可在这里配,会影响jenkins的运行
ENV PATH=$M2_HOME/bin:$NODE_HOME/bin:$PATH

执行构建自定义镜像命令
docker build -t jenkins-self .

2.创建Jenkins数据目录

在宿主机上创建一个目录用于持久化Jenkins的数据,并设置合适的权限:
mkdir -p /home/jenkins/data
chown -R 1000:1000 /home/jenkins/data

 3.启动Jenkins容器

使用以下命令启动Jenkins容器,映射端口和数据卷:

docker run -d --name jenkins-self -p 8080:8080 -p 50000:50000 \
  -v /home/jenkins/data:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v $(which docker):/usr/bin/docker \
  --restart=on-failure:3 \
  jenkins-self
  
命令解读 
1. docker run
功能:用于创建并启动一个新的Docker容器。
2. -d
功能:表示以守护进程模式运行容器,即在后台运行。
作用:容器不会在终端中阻塞,允许您继续在终端中执行其他命令。
3. --name jenkins-self
功能:为容器指定一个名称。
作用:方便您通过名称引用容器,而不是使用容器的ID。例如,您可以使用docker stop jenkins-self来停止该容器。
4. -p 8080:8080
功能:将容器的8080端口映射到宿主机的8080端口。
作用:允许您通过宿主机的IP地址和端口8080访问Jenkins的Web界面。例如,http://<宿主机IP>:8080。
5. -p 50000:50000
功能:将容器的50000端口映射到宿主机的50000端口。
作用:Jenkins使用50000端口进行与代理节点(如Jenkins Agent)的通信。如果您计划使用Jenkins的分布式构建功能,这个端口是必需的。
6. -v /home/jenkins/data:/var/jenkins_home
功能:将宿主机的/home/jenkins/data目录挂载到容器的/var/jenkins_home目录。
作用:/var/jenkins_home是Jenkins存储其配置文件、插件、作业定义和构建历史的地方。通过挂载卷,您可以将这些数据持久化到宿主机,即使容器被删除,数据也不会丢失。
7. -v /var/run/docker.sock:/var/run/docker.sock
功能:将宿主机的Docker套接字文件/var/run/docker.sock挂载到容器的相同路径。
作用:允许Jenkins容器直接与宿主机上的Docker守护进程通信,从而可以在Jenkins中直接管理宿主机上的Docker容器,例如构建Docker镜像、运行Docker容器等。
8. -v $(which docker):/usr/bin/docker
功能:将宿主机上的docker可执行文件路径挂载到容器的/usr/bin/docker路径。
作用:确保Jenkins容器内部可以使用宿主机上的docker命令。这对于在Jenkins Pipeline中直接调用Docker命令非常有用。
9. --restart=on-failure:3
功能:设置容器的重启策略。
作用:如果容器因错误退出(非正常退出),Docker将尝试重启容器,最多尝试3次。这有助于提高容器的可靠性,确保Jenkins服务在遇到问题时能够自动恢复。
10. jenkins-self
功能:指定要使用的Docker镜像。

 4. 查看初始密码

Jenkins首次启动时,需要使用初始密码进行登录。可以通过以下命令查看初始密码:

docker logs -f jenkins
在日志中找到类似以下的输出,即为初始密码:
复制
*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

<initialAdminPassword>

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************

5. 访问Jenkins Web界面

在浏览器中访问 http://<宿主机IP>:8080,输入初始密码,按照提示完成Jenkins的初始化配置。

 

6. 安装推荐插件

在Jenkins的初始化过程中,可以选择安装推荐的插件。
后续到系统设置-插件管理里面去下载
Subversion
Maven Integration
Publish Over SSH 进行远程文件传输,命令执行
Subversion Plug-in 集成svn进行代码检出

7. 配置Jenkins

安装Docker插件:在Jenkins的管理界面中,选择“系统管理”->“插件管理”,搜索并安装Docker插件。
配置Docker环境:在“系统管理”->“配置系统”中,配置Docker主机地址(通常是unix:///var/run/docker.sock)。
配置全局工具:在“系统管理”->“全局工具配置”中,配置JDK、Maven、Git等工具的路径。

8.jenkins使用宿主机的docker

除了上面运行镜像时,映射docker相关文件 还要设置宿主机docker.sock权限

sudo chown root:root /var/run/docker.sock
sudo chmod o+rw /var/run/docker.sock

9.下载相关插件

 点击 【系统管理】->【插件管理】->【available plugins 】 

搜索第六步中的相关清单插件,进行安装,安装完成后,在http://<宿主机IP>:8080/restar 进行重启,或者直接重启jenkins-self容器,重启命令如下

docker restart jenkins-self

10. 配置maven、jdk信息

点击【系统管理】->【全局工具配置】

在此页面中配置maven、jdk相关信息

11.构建后端Java项目

点击【新建任务】,输入项目名称,选择自由风格的软件项目,填写相关信息

 12.最后构建成功后可以写一个脚本进行镜像的打包,推送至kuboard进行发布

cd 到有Dockerfile文件的目录

docker build -f Dockerfile -t harbor服务器IP:port/public/self-server:1.0 .
# 登录harbor
docker login harbor服务器IP:port -u admin -p 密码
# 推送镜像到haobor
docker push harbor服务器IP:port/public/self-server:1.0

# 搭建一个nginx 用于jar包下载,下面的ip,port是nginx访问的地址
project="self-server.jar"
mkdir -p /var/jenkins_home/workspace/docker-images/jar
rm -rf /var/jenkins_home/workspace/docker-images/jar/$project
mv target/$project /var/jenkins_home/workspace/docker-images/jar/$project
echo "jar包下载地址:http://ip:port/docker-images/jar/$project"

# 下面的ip是kuboard的访问ip,KuboardAccessKey的值需要到kuboard的个人设置-访问密码里面去创建
curl -X PUT \
    -H "Content-Type: application/yaml" \
    -H "Cookie: KuboardUsername=admin; KuboardAccessKey=*******.*******" \
    -d '{"kind":"deployments","namespace":"default","name":"self-server"}' \
    "http://ip/kuboard-api/cluster/default/kind/CICDApi/admin/resource/restartWorkload"

13.构建vue前端项目

14.构建成功后也可以写一个脚本进行镜像打包,推送至kuboard部署

# 设置npm仓库源
npm config set registry http://ip:port/repository/npm/
npm install
npm run build-comp
# 清除有问题的镜像
docker images | grep 'none' | awk '{print $3}' | while read id; do docker rmi $id; done
# 删除本地对应镜像
docker rmi ip:port/public/self-frontend:1.0 || true
# 构建镜像,这里的ip:port/public/self-frontend:1.0 之所以这样命名,为了推送给harbor,所以ip:port是harbor的访问ip和端口
docker build -f build/docker/Dockerfile -t ip:port/public/self-frontend:1.0 .
# 登录harbor
docker login ip:port -u admin -p 密码
# 推送镜像至harbor
docker push ip:port/public/self-frontend:1.0

# 打包程序到nginx目录下方便进行下载,ip:port是nginx的访问地址
project="self-pc"
mkdir -p $project
cp -r dist $project
mkdir -p /var/jenkins_home/workspace/docker-images/frontend
rm -rf /var/jenkins_home/workspace/docker-images/frontend/$project.tar.gz
tar -zcvf $project.tar.gz $project
mv $project.tar.gz /var/jenkins_home/workspace/docker-images/frontend/$project.tar.gz
echo "压缩包下载地址:http://ip:port/docker-images/frontend/$project.tar.gz"

# 下面的ip是kuboard的访问ip,KuboardAccessKey的值需要到kuboard的个人设置-访问密码里面去创建
curl -X PUT \
    -H "Content-Type: application/yaml" \
    -H "Cookie: KuboardUsername=admin; KuboardAccessKey=*******.*******" \
    -d '{"kind":"deployments","namespace":"default","name":"self-pc"}' \
    "http://ip/kuboard-api/cluster/default/kind/CICDApi/admin/resource/restartWorkload"

15.构建后端,前端的Dockerfile文件内容

后端dockerfile文件内容如下:

# 基于openjdk-alpine
FROM openjdk:8-jdk-alpine

# 将本地文件夹挂在到当前容器,指向了一个/tmp的目录,由于 Spring Boot 使用内置的Tomcat容器,Tomcat默认使用/tmp作为工作目录。
# 这个命令的效果是:在宿主机的/var/lib/docker目录下创建一个临时文件并把它链接到容器中的/tmp目录
VOLUME /tmp


# 解决时差8小时问题
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 复制文件到容器,表示把文件拷入docker ,并改名成 app.jar
ADD /target/self-server-1.0-SNAPSHOT.jar app.jar
#JAVA_OPTS中可以加一些参数,如果配置了多环境,可以加"-Dspring.profiles.active=prod"
ENV JAVA_OPTS=""
#表示使用指定命令在镜像运行时执行,启动jar。表示使用指定命令在镜像运行时执行,启动jar。
#另一种写法
#ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
# 加入探针之前
#ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "-Duser.timezone=Asia/Shanghai","app.jar"]
#ENTRYPOINT ["java","-javaagent:/agent/skywalking-agent.jar", "-Djava.securisplitty.egd=file:/dev/./urandom", "-jar", "-Duser.timezone=Asia/Shanghai","app.jar"]
#ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "-Duser.timezone=Asia/Shanghai","app.jar"]
ENTRYPOINT ["java","-Xms1024m", "-Xmx3072m","-Djava.security.egd=file:/dev/./urandom","-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:8601", "-jar", "-Duser.timezone=Asia/Shanghai","app.jar"]

前端Dockerfile文件内容如下:

FROM nginx:stable-alpine-perl
RUN rm -f /etc/nginx/nginx.conf \
    && rm -f /etc/nginx/conf.d/default.conf
COPY build/docker/nginx.k8s.conf /etc/nginx/nginx.conf

# 解决时差8小时问题
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

EXPOSE 80

COPY ./dist /home/frontend

ENTRYPOINT ["nginx", "-g", "daemon off;"]

里面的nginx配置文件nginx.k8s.conf文件内容如下:


user  root;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    client_max_body_size 100m;
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    #include /etc/nginx/conf.d/*.conf;

    upstream gateway_server{
         server ip:port weight=1;
    }

    server {
      listen       80;
      server_name  web;

      location / {
	   alias /home/frontend;
		index index.html;
		autoindex on;
		add_header Cache-Control no-cache;
		add_header Pragma no-cache;
		add_header Expires 0;
      }

      location /self-pc {
          alias /home/frontend;
          index index.html;
          autoindex on;
          add_header Cache-Control no-cache;
          add_header Pragma no-cache;
          add_header Expires 0;
      }

      #后台服务
      location /gateway-k8s/ {
          client_max_body_size 1000m;
          proxy_pass http://gateway_server/;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "upgrade";
          proxy_set_header Host $host:$server_port;
          proxy_set_header X-Real-IP  $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      }

      # 工作流前台
      location /workplatform/ {
          proxy_pass http://self-workplatform:80/workplatform/;
          proxy_set_header Host $host:31080;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "upgrade";
          proxy_set_header X-Real-IP  $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          absolute_redirect on;
      }



    }
}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐