docker + jenkins 自动化部署

jenkins自动部署

1. docker安装

以下命令均以root权限执行

卸载docker旧版本

java 复制代码
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine

安装相关工具类

java 复制代码
yum install -y yum-utils device-mapper-persistent-data lvm2

配置docker仓库

java 复制代码
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

aliyun源

java 复制代码
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装docker

java 复制代码
yum install docker-ce
java 复制代码
Installed:
  docker-ce.x86_64 0:18.03.0.ce-1.el7.centos
 
Dependency Installed:
  audit-libs-python.x86_64 0:2.7.6-3.el7 checkpolicy.x86_64 0:2.5-4.el7   container-selinux.noarch 2:2.42-1.gitad8f0f7.el7 libcgroup.x86_64 0
  libtool-ltdl.x86_64 0:2.4.2-22.el7_3   pigz.x86_64 0:2.3.3-1.el7.centos policycoreutils-python.x86_64 0:2.5-17.1.el7     python-IPy.noarch
 
Complete!

验证docker

启动docker

java 复制代码
systemctl start docker

验证docker

java 复制代码
docker run hello-world

出现以下内容则表示安装成功

java 复制代码
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
9bb5a5d4561a: Pull complete
Digest: sha256:f5233545e43561214ca4891fd1157e1c3c563316ed8e237750d59bde73361e77
Status: Downloaded newer image for hello-world:latest
 
Hello from Docker!
This message shows that your installation appears to be working correctly.
 
To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.
 
To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash
 
Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/
 
For more examples and ideas, visit:

设置开机自启

java 复制代码
chkconfig docker on

升级docker ce

java 复制代码
yum -y upgrade

卸载docker

java 复制代码
yum remove docker-ce
 
rm -rf /var/lib/docke

配置国内镜像和存储目录

java 复制代码
vim /etc/docker/daemon.json

registry-mirrors 为镜像地址

docker 版本<20 graph 为存储目录 建议不要使用默认的 否则空间会不够用

docker 版本>20 graph已经弃用 需使用 data-root

java 复制代码
{
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com",
    "https://dockerproxy.com",
    "http://hub-mirror.c.163.com"
  ],
  "data-root": "/home/docker"
}
java 复制代码
systemctl daemon-reload
systemctl restart docker

2. docker-compose安装

github安装

版本查询 地址: github地址

选择自己想要安装的版本 修改以下语句版本号

java 复制代码
curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

检查版本

1.27.4

java 复制代码
docker-compose -version

2.2.2

java 复制代码
docker-compose version

3. linux安装JDK 17 为例

cd 进入/usr/local 创建jdK17文件夹 进入jdk17文件夹

下载jdk17

java 复制代码
wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz

安装wget命令

java 复制代码
yum -y install wget 

解压jdk压缩包

java 复制代码
tar -zxvf  jdk-17.0.1_linux-x64_bin.tar.gz

vim/etc/profile 配置环境变量

java 复制代码
export JAVA_HOME=/usr/lib/jdk17/jdk-17.0.1

export CLASSPATH=.:$JAVA_HOME/lib/

export PATH=.:$JAVA_HOME/bin:$PATH

source /etc/profile 重启环境变量

java -version 查看版本号

4. git安装

java 复制代码
yum install -y git

5. 安装maven

查找版本

maven.apache.org/download.cg...

下载maven

解压maven

java 复制代码
 tar -zxvf apache-maven-3.8.8-bin.tar.gz

配置环境变量

java 复制代码
JAVA_HOME=/root/software/jdk/jdk1.8.0_371
CLASSPATH=.:$JAVA_HOME/lib
MAVEN_HOME=/usr/local/software/maven/apache-maven-3.8.8
PATH=$MAVEN_HOME/bin:$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH MAVEN_HOME PATH

配置生效

java 复制代码
source /etc/profile

输入mvn -version查看安装版本

6. 安装jenkins

在usr/local下创建jenkins文件夹 官方下载jenkins.war包,放入该文件夹下

安装字体等程序插件

java 复制代码
sudo yum install dejavu-sans-fonts
sudo yum install fontconfig
sudo yum install xorg-x11-server-Xvfb

启动jenkins.war

java 复制代码
nohup java -jar /usr/local/jenkins/jenkins.war > /usr/local/jenkins/jenkins.out &

如:/root/.jenkins/secrets/initialAdminPassword,/root/.jenkins 就是 jenkins 的工作目录,在 jenkins 的工作目录 .jenkins 中,找到 hudson.model.UpdateCenter.xml 文件打开

进入到 updates 目录下,编辑 default.json 文件,将该文件中国外的地址全部替换成国内的

  • https://www.google.com 全部替换成 https://www.baidu.com
  • https://updates.jenkins.io/download 全部替换成 https://mirrors.tuna.tsinghua.edu.cn/jenkins

安装jenkins插件和管理用户

命令 cat /root/.jenkins/secrets/initialAdminPassword 获取管理员密码

配置git,maven,jdk

创建项目配置项目构建环境

dockerfile 文件,镜像生成

java 复制代码
#FROM findepi/graalvm:java17-native
FROM openjdk:17.0.2-oraclelinux8

MAINTAINER hykj-server

RUN mkdir -p /hykj-admin/server/logs \
    /hykj-admin/server/temp \
    /hykj-admin/skywalking/agent

WORKDIR /hykj-admin/server

ENV SERVER_PORT=8091 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="-Dname=hykj-admin.jar  -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps  -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC"

EXPOSE ${SERVER_PORT}

ADD ./target/hykj-admin.jar ./app.jar

ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \
           # 应用名称 如果想区分集群节点监控 改成不同的名称即可
           #-Dskywalking.agent.service_name=scountry-server \
           #-javaagent:/scountry/skywalking/agent/skywalking-agent.jar \
           -jar app.jar \
           -XX:+HeapDumpOnOutOfMemoryError -Xlog:gc*,:time,tags,level -XX:+UseZGC ${JAVA_OPTS}

jenkins构建脚本

java 复制代码
#!/bin/sh
# maven打包
mvn clean package -Dmaven.test.skip=true
echo "maven打包成功"
cd ./hykj-admin
service_name="hykj-admin"
service_port=8091
# 查看镜像id
image_id=$(docker images | grep $service_name | awk '{print $3}')
echo "镜像id为:$image_id"
if [ -n "$image_id" ]
then
  echo "镜像已存在,删除镜像"
  docker rmi $image_id
  echo "镜像删除成功"
  # 重新构建镜像
  docker build -t $service_name .
  echo "镜像构建成功"
else
  echo "镜像不存在,开始构建镜像"
  # 构建镜像
  docker build -t $service_name .
  echo "镜像构建成功"
fi
# 查看容器
container_id=$(docker ps -a | grep $service_name | awk '{print $1}')
if [ -n "$container_id" ]
then
    echo "容器已存在,删除容器"
    # 停止容器
    docker stop $container_id
    # 删除容器
    docker rm $container_id
    echo "容器删除成功"
else
    echo "容器不存在,开始运行容器"
fi
# 回到文件上层目录
cd ..
# 通过docker-compose运行容器
docker-compose up -d hykj-admin-server
#docker run -d --name $service_name --net=host -p $service_port:$service_port $service_name
# 打印日志
docker logs -f $service_name

docker-compose 脚本

java 复制代码
version: '3'

services:
  mysql:
    image: mysql:8.0.33
    container_name: mysql
    environment:
      # 时区上海
      TZ: Asia/Shanghai
      # root 密码
      MYSQL_ROOT_PASSWORD: jzkj@123
      # 初始化数据库(后续的初始化sql会在这个库执行)
      MYSQL_DATABASE: jzkj_admin
    ports:
      - "3306:3306"
    volumes:
      # 数据挂载
      - /docker/mysql/data/:/var/lib/mysql/
      # 配置挂载
      - /docker/mysql/conf/:/etc/mysql/conf.d/
    command:
      # 将mysql8.0默认密码策略 修改为 原先 策略 (mysql8.0对其默认策略做了更改 会导致密码无法匹配)
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
    privileged: true
    network_mode: "host"

  nginx-web:
    image: nginx:1.23.4
    container_name: nginx-web
    environment:
      # 时区上海
      TZ: Asia/Shanghai
    ports:
      - "80:80"
      - "443:443"
    volumes:
      # 证书映射
      - /docker/nginx/cert:/etc/nginx/cert
      # 配置文件映射
      - /docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      # 页面目录
      - /docker/nginx/html:/usr/share/nginx/html
      # 日志目录
      - /docker/nginx/log:/var/log/nginx
    privileged: true
    network_mode: "host"

  redis:
    image: redis:6.2.12
    container_name: redis
    ports:
      - "6379:6379"
    environment:
      # 时区上海
      TZ: Asia/Shanghai
    volumes:
      # 配置文件
      - /docker/redis/conf:/redis/config:rw
      # 数据文件
      - /docker/redis/data/:/redis/data/:rw
    command: "redis-server /redis/config/redis.conf"
    privileged: true
    network_mode: "host"

  minio:
    image: minio/minio:RELEASE.2023-04-13T03-08-07Z
    container_name: minio
    ports:
      # api 端口
      - "9000:9000"
      # 控制台端口
      - "9001:9001"
    environment:
      # 时区上海
      TZ: Asia/Shanghai
      # 管理后台用户名
      MINIO_ROOT_USER: zkjs147258
      # 管理后台密码,最小8个字符
      MINIO_ROOT_PASSWORD: zkjs147258+
      # https需要指定域名
      #MINIO_SERVER_URL: "https://xxx.com:9000"
      #MINIO_BROWSER_REDIRECT_URL: "https://xxx.com:9001"
      # 开启压缩 on 开启 off 关闭
      MINIO_COMPRESS: "off"
      # 扩展名 .pdf,.doc 为空 所有类型均压缩
      MINIO_COMPRESS_EXTENSIONS: ""
      # mime 类型 application/pdf 为空 所有类型均压缩
      MINIO_COMPRESS_MIME_TYPES: ""
    volumes:
      # 映射当前目录下的data目录至容器内/data目录
      - /docker/minio/data:/data
      # 映射配置目录
      - /docker/minio/config:/root/.minio/
    command: server --address ':9000' --console-address ':9001' /data  # 指定容器中的目录 /data
    privileged: true
    network_mode: "host"

  hykj-admin-server:
    image: hykj-admin
    container_name: hykj-admin
    environment:
      # 时区上海
      TZ: Asia/Shanghai
      SERVER_PORT: 8091
    volumes:
      # 配置文件
      - /docker/server1/logs/:/hykj/server/logs/
      # skywalking 探针
    #      - /docker/skywalking/agent/:/scountry/skywalking/agent
    privileged: true
    network_mode: "host"

7. 节点部署添加

新建节点

java 复制代码
// 节点服务器执行以下命令:
nohup java -jar agent.jar -url http://192.168.21.130:8080/ -secret 18c4f1bef7cba3c5ad4cee1d74ead35444b734a8ab6dbd125a5e5fdcda154311 -name node22 -workDir "/usr/local/jenkins" &
相关推荐
callJJ37 分钟前
从 0 开始理解 Spring 的核心思想 —— IoC 和 DI(2)
java·开发语言·后端·spring·ioc·di
你的人类朋友3 小时前
JWT的组成
后端
北风朝向3 小时前
Spring Boot参数校验8大坑与生产级避坑指南
java·spring boot·后端·spring
canonical_entropy4 小时前
一份关于“可逆计算”的认知解码:从技术细节到哲学思辨的完整指南
后端·低代码·deepseek
趙卋傑4 小时前
项目发布部署
linux·服务器·后端·web
数据知道5 小时前
Go基础:Go语言能用到的常用时间处理
开发语言·后端·golang·go语言
不爱编程的小九九6 小时前
小九源码-springboot048-基于spring boot心理健康服务系统
java·spring boot·后端
龙茶清欢6 小时前
Spring Boot 应用启动组件加载顺序与优先级详解
java·spring boot·后端·微服务
235167 小时前
【LeetCode】3. 无重复字符的最长子串
java·后端·算法·leetcode·职场和发展
可观测性用观测云7 小时前
解锁DQL高级玩法——对日志关键信息提取和分析
后端