云计算百科
云计算领域专业知识百科平台

24年最新 Docker安装jenkins并发布服务器,配置环境,最全,已成功验证。

Docker安装jenkins,配置环境,最全,已成功验证。

1、如上安装jdk和maven,并配置etc/profile

2、配置jenkins

docker pull jenkins/jenkins:2.346.1-lts
#docker run -d -p 8080:8080 -p 50000:50000 –name jenkin jenkins/jenkins:2.346.1-lts
docker run -d –name jenkin jenkins/jenkins:2.346.1-lts
mkdir -p /usr/docker/jenkins/jenkins_home
docker cp jenkin:/var/jenkins_home /usr/docker/jenkins/jenkins_home

## 1000:1000: 表示新的所有者和所属组。在这个例子中,1000 是用户的标识号(UID),1000 是组的标识号(GID)。通常,这些标识号对应于系统中的用户和组。 请注意,1000 只是一个示例标识号。
而容器中jenkins用户的 uid 为 1000。
chown -R 1000:1000 /usr/docker/jenkins
chown -R 777 /usr/docker/jenkins

chown 用于更改文件或目录的所有者和所属组。
chmod 用于更改文件或目录的权限。

docker rm -f jenkin

#修改镜像源
cd /usr/docker/jenkins/jenkins_home

vim hudson.model.UpdateCenter.xml

#将url内容修改为清华大学官方镜像
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

示例:
<url>https://updates.jenkins.io/update-center.json</url>
替换成:
<url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>

3、文件夹权限

修改文件夹权限
需要修改下目录权限,因为当映射本地数据卷时,/data/jenkins_home/目录的拥有者为root用户,

而容器中jenkins用户的 uid 为 1000。

我们创建一个jenkins目录

chown -R 1000:1000 /usr/docker/jenkins

docker rm -f jenkin

chmod -R 777 /usr/docker/jenkins

3、启动容器

docker run -u root -d -p 9095:8080 -p 50000:50000 \\
-v /usr/docker/jenkins/jenkins_home:/var/jenkins_home \\
-v $(which docker):/bin/docker \\
-v /var/run/docker.sock:/var/run/docker.sock \\
-v /usr/local/java/jdk1.8.0_401:/usr/local/java \\
-v /usr/local/maven/apache-maven-3.9.6:/usr/local/maven \\
-v /etc/localtime:/etc/localtime \\
–name jenkins jenkins/jenkins

4、获取登录密码

  • 日志查看

    docker logs jenkins

  • 获取密码文件(2选1)

    #容器文件
    docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
    #映射文件
    cat /usr/docker/jenkins/jenkins_home/secrets/initialAdminPassword

5、访问jenkins

本人云服务器地址:111.231.74.191

http://111.231.74.191:9095/

需要开放9095的端口

输入密码:之前获取的密码

28abb74d816b46818d0212d935df9e5a

创建用户

admin

3301359a

6、安装插件

推荐新手安装。

然后再安装一些固定的插件

Maven Integration : Maven 集成管理插件。
Docker : Docker集成插件。
GitLab : GitLab集成插件。
Publish Over SSH:远程文件发布插件。
SSH: 远程脚本执行插件。
Git server:可以直接插件安装git,避免本地挂载的宝贝
blue ocean:
Deploy to container:
dockerpip line:
git param :

7、使用若依项目作为前后端发布

  • 下载现在开始准备前后端分离的项目, 以RuoYi-Vue为例进行部署, 下载zip包
  • 解压, 然后将ruoyi-ui剪切出来放在外面, 形成前后端分离的两个项目
  • 在RuoYi-Vue-master项目中编写Dockerfile和Jenkinsfile两个文件, Dockerfile是将jar包生成镜像, Jenkinsfile是执行流水线的脚本
  • 1.后端

    dockerfile

    # FROM java:8
    FROM anapsix/alpine-java:8_server-jre_unlimited
    # 将当前目录下的jar包复制到docker容器的/目录下
    COPY *.jar /app.jar
    # 运行过程中创建一个xx.jar文件
    RUN touch /app.jar

    ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms128m -Xmx256m -Djava.security.egd=file:/dev/./urandom"
    ENV PARAMS="–spring.profiles.active=prod"

    # 声明服务运行在8080端口
    EXPOSE 8080
    # 指定docker容器启动时运行jar包
    ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -jar /app.jar $PARAMS" ]

    jenkisfile

    pipeline{
    agent any
    environment {
    IMAGE_NAME = "ruoyi-admin"
    WS = "${WORKSPACE}"
    }

    //定义流水线的加工流程
    stages {
    //流水线的所有阶段
    stage('1.环境检查'){
    steps {
    sh 'pwd && ls -alh'
    sh 'printenv'
    sh 'docker version'
    sh 'java -version'
    sh 'git –version'
    }
    }

    stage('2.编译'){
    agent {
    docker {
    image 'maven:3-alpine'
    args '-v maven-repository:/root/.m2'
    }
    }
    steps {
    sh 'pwd && ls -alh'
    sh 'mvn -v'
    sh 'cd ${WS} && mvn clean package -s "/usr/local/maven/conf/settings.xml" -Dmaven.test.skip=true'
    }
    }

    stage('3.打包'){
    steps {
    sh 'pwd && ls -alh'
    sh 'echo ${WS}'
    // sh 'mv ${WS}/${IMAGE_NAME}/target/*.jar ${WS}/${IMAGE_NAME}.jar && pwd && ls -alh && docker build -t ${IMAGE_NAME} .'
    sh 'docker build -t ${IMAGE_NAME} -f Dockerfile ${WS}/${IMAGE_NAME}/target/'
    }
    }

    stage('4.部署'){
    // 删除容器和虚悬镜像
    steps {
    sh 'pwd && ls -alh'
    sh 'docker rm -f ${IMAGE_NAME} || true && docker rmi $(docker images -q -f dangling=true) || true'
    sh 'docker run -d -p 8888:8080 –name ${IMAGE_NAME} -v /mydata/logs/${IMAGE_NAME}:/logs/${IMAGE_NAME} ${IMAGE_NAME}'
    }
    }
    }
    }

    redis

    redis:
    host: 111.231.74.191 # 地址
    port: 6379 # 端口
    database: 1 # 数据库索引
    password: 123456 # 密码,建议生产环境开启

    创建数据库ry-vuw,执行初始化sql

    2.前端配置

    1、在前端项目ruoyi-ui中编写Dockerfile和Jenkinsfile两个文件, 并创建两个环境的nginx的配置文件(前端项目要在nginx中运行), 案例演示两个nginx的配置文件除了名字不同, 里面的内容是一相同

    Dockerfile

    FROM nginx:1.22

    # 构建参数,在Jenkinsfile中构建镜像时定义
    ARG PROFILE

    # 将dist文件中的内容复制到 `/usr/share/nginx/html/` 这个目录下面
    COPY dist/ /usr/share/nginx/html/

    # 用本地配置文件来替换nginx镜像里的默认配置
    COPY nginx/nginx-${PROFILE}.conf /etc/nginx/nginx.conf

    EXPOSE 80

    # 以前台形式持续运行
    CMD ["nginx", "-g", "daemon off;"]

    jenkinsfile

    pipeline{
    agent any
    environment {
    // 镜像名称
    IMAGE_NAME = "ruoyi-ui"
    // 工作目录
    WS = "${WORKSPACE}"
    // 后台项目镜像名称
    API_IMAGE_NAME = "ruoyi-admin"
    // 自定义的构建参数
    PROFILE = "prod"
    }

    //定义流水线的加工流程
    stages {
    //流水线的所有阶段
    stage('1.环境检查'){
    steps {
    sh 'pwd && ls -alh'
    sh 'printenv'
    sh 'docker version'
    sh 'git –version'
    }
    }

    stage('2.编译'){
    agent {
    docker {
    image 'node:12-alpine'
    }
    }
    steps {
    sh 'pwd && ls -alh'
    sh 'node -v'
    sh 'cd ${WS} && npm install –registry=https://registry.npmmirror.com –no-fund && npm run build:prod'
    }
    }

    stage('3.打包'){
    steps {
    sh 'pwd && ls -alh'
    sh 'docker build –build-arg PROFILE=${PROFILE} -t ${IMAGE_NAME} .'
    }
    }

    stage('4.部署'){
    // 删除容器和虚悬镜像
    steps {
    sh 'pwd && ls -alh'
    sh 'docker rm -f ${IMAGE_NAME} || true && docker rmi $(docker images -q -f dangling=true) || true'
    sh 'docker run -d -p 8889:80 –name ${IMAGE_NAME} –link ruoyi-admin:ruoyi-admin ${IMAGE_NAME}'
    }
    }
    }
    }

    nginx

    worker_processes 1;

    events {
    worker_connections 1024;
    }

    http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;

    server {
    listen 80;
    server_name localhost;

    location / {
    root /usr/share/nginx/html;
    try_files $uri $uri/ /index.html;
    index index.html index.htm;
    }

    location /prod-api/{
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    #访问容器地址
    proxy_pass http://ruoyi-admin:8080/;
    #访问外网地址, 后台容器端口映射8888:8080
    #proxy_pass http://47.114.186.174:8888/;
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root html;
    }
    }
    }

    8、将前后端两个项目上传到私人gitlab

    gitlab安装:

    上传过程忽略。这个比较简单。

    ruoyi-ui

    ruoyi

    9、jenkins全局工具配置(这个过程可以忽略,貌似没用上)

    1、maven配置

    /usr/local/maven/conf/setting.xml

    image-20240428143942578

    2、JDK安装

    jdk配置 JAVA_HOME

    1.使用jdk8

    /usr/local/java

    image-20240428145323594

    2.也可以使用默认的jdk11

    在这里插入图片描述

    3.输入以下命令进行docker自带的jdk的查找

    # which java
    /opt/java/openjdk/bin/java

    image-20240428143637941

    3、maven安装

    /usr/local/maven

    注意空格问题!!

    4、docker安装

    docker info

    Docker Root Dir: /var/lib/docker
    ##将这个映射到docker路径

    /usr/local/docker
    ##参考
    https://blog.csdn.net/yprufeng/article/details/136320990
    https://blog.csdn.net/weixin_43202160/article/details/134416447

    信息说明

    在您提供的信息中,/usr/bin/docker 是 Docker 的可执行文件所在的位置,它通常被认为是 Docker 的安装目录。

    虽然 /var/lib/docker 是 Docker 的根目录,其中包含 Docker 的数据、镜像和容器等,但一般情况下,/usr/bin/docker 被认为是 Docker 的可执行文件的安装路径。

    请注意,具体的安装目录可能因不同的系统和安装方式而有所不同。上述解释是一般情况下的情况,具体结果可能会因不同的系统和配置而有所不同。如果您使用了特定的安装方式,请提供更多的详细信息以便我们给出更准确的答案。

    开启docker服务器的远程访问链接

    • 在docker所在服务器上的/usr/lib/systemd/system/docker.service文件中开启docker远程访问

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

    在jenkins中配置该docker服务

    • – 在系统管理->节点和云管理中配置docker服务
    • – 可在系统管理->docker组件中查看已经启动的容器和安装的镜像
    • ** jenkins凭据中配置docker harbor凭据,用于将镜像推送到harbor仓库以及拉取镜像使用,关于harbor仓库的安装,这里不做介绍,可查看作者往期博客内容**

    可以了。要映射完成才行。

    image-20240428153351648

    harbor的参考地址:https://blog.51cto.com/wst021sh/7245687

    docker inspect OR

    image-20240428144349452

    5、配置jenkins的系统配置

    image-20240429091629817

    6、配置好构建后操作

    image-20240429091716794

    会把SSH Server自动带入过来。

    6.1、本机构建

    #执行shell
    APP_NAME=test-project
    APP_PORT=8083
    RUN_ENV=prod
    cd /var/jenkins_home/workspace/$APP_NAME
    docker stop $APP_NAME || true
    docker rm $APP_NAME || true
    docker rmi $APP_NAME || true
    docker build -f src/docker/Dockerfile -t $APP_NAME .
    docker run -d -p $APP_PORT:$APP_PORT -e "SPRING_PROFILES_ACTIVE=$RUN_ENV" –name $APP_NAME $APP_NAME:latest

    6.2、部署到指定服务器 jar包版本

    cd /data/test
    ps -ef | grep uht-sf-express-center-0.0.1-SNAPSHOT.jar | grep -v grep | awk '{printf $2}' | xargs kill -9
    nohup java -jar uht-sf-express-center-0.0.1-SNAPSHOT.jar –spring.profiles.active=prod > uht-sf-express-center.log 2>&1 &

    6.3、使用pipLine

    https://www.cnblogs.com/juelian/p/17782048.html

    pipeline语法

    pipeline语法有两种

    • Declarative Pipeline(声明式),推荐使用。
    • Scripted Pipeline(脚本式),旧版,很少用了。

    7、git配置

    http://111.231.74.191:9980//my-group/ruoyi.git
    root
    3301359a

    8、配置下maven 环境变量

    docker cp /opt/etc/profile jenkins:/etc/profile
    进入容器内
    source /etc/profile

    修改/etc/profile

    9、远程服务器执行的脚本

    echo '================拉取最新镜像================'
    docker pull $docker_registry/docker_storage/$JOB_NAME

    echo '================删除清理容器镜像================'
    if [ -n "$(docker ps -a -f name=$JOB_NAME –format '{{.ID}}' )" ]
    then
    #删除之前的容器
    docker rm -f $(docker ps -a -f name=$JOB_NAME –format '{{.ID}}' )
    fi
    # 清理镜像
    docker image prune -f

    echo '===============启动容器================'
    docker run -d –net=host -e PARAMS="–spring.profiles.active=prod" –name $JOB_NAME $docker_registry/docker_storage/$JOB_NAME

    10、关键插件安装。

    dockerpip line,Jenkinsfile 其中的agent docker需要用到。

    11、开始配置项目

    1.新建任务–多分支流水线

    image-20240429171526238

    2.配置下git源

    image-20240429171748503

    3.运行就可以了,成功!!

    image-20240429170931860

    在这里插入图片描述

    tips:

    #要为其添加挂载卷(volume)
    docker container update –mount source=/host/path,target=/container/path,readonly=false container_name_or_id

    又是一个错误。

    我的jenkins是docker部署的

    需要在jenkins的容器里 执行以下命令访问git上的仓库地址,把git的主机添加到/root/.ssh/known_hosts(执行命令前known_hosts这个文件是不存在的,执行后就有了)

    root@80b05f3c5097:~/.ssh# git ls-remote -h git@gitee.com:XXXXX/autotest.git HEAD
    The authenticity of host 'gitee.com (212.64.63.215)' can't be established.
    ECDSA key fingerprint is SHA256:FQGC9Kn/eye1W8icdBgrQp+KkGYoFgbVr17bmjey0Wc.
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
    Warning: Permanently added 'gitee.com,212.64.63.215' (ECDSA) to the list of known hosts.
    root@80b05f3c5097:~/.ssh#
    root@80b05f3c5097:~/.ssh#
    root@80b05f3c5097:~/.ssh# pwd
    /root/.ssh
    root@80b05f3c5097:~/.ssh# ls -al
    total 12
    drwx—— 2 root root 57 Oct 25 03:55 .
    drwx—— 1 root root 71 Sep 28 04:49 ..
    -rw——- 1 root root 2602 Oct 25 02:42 id_rsa
    -rw-r–r– 1 root root 571 Oct 25 02:42 id_rsa.pub
    -rw-r–r– 1 root root 444 Oct 25 03:55 ls

    然后jenkins就不报错了

    ssh <用户名>@<节点服务器IP>

    ssh root@<节点服务器IP>

    ssh git@111.231.74.191:9922

    image-20240429151521090

    1.先切换到jenkins用户下(此时在jenkins安装目录下)

    sudo su -s /bin/bash jenkins
    cd ~

    ssh-keygen -m PEM -t rsa -f id_rsa
    # ssh-keygen -t rsa(这个不行)

    cat .ssh/id_rsa.pub
    或者
    cat id_rsa.pub

    ssh://git@111.231.74.191:9922/my-group/ruoyi.git
    main

    http://111.231.74.191:9980/my-group/ruoyi.git
    root
    3301359a
    gitlab

    maven配置的问题

    /usr/local/maven/conf/settings.xml

    package -s “/usr/local/maven/conf/settings.xml” -Dmaven.test.skip=true’

    10、终于成功了!!走了一天的歪路。。。纯纯的一个人瞎琢磨。

    然后就运行就行了。!

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 24年最新 Docker安装jenkins并发布服务器,配置环境,最全,已成功验证。
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!