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" &
相关推荐
bobz96511 分钟前
QT 中的三种基本UI类型:Main Window | Widget | Dialog
后端
zhoupenghui16822 分钟前
golang实现支持100万个并发连接(例如,HTTP长连接或WebSocket连接)系统架构设计详解
开发语言·后端·websocket·golang·系统架构·echo·100万并发
咸甜适中37 分钟前
Rust语言序列化和反序列化vec<u8>,serde库Serialize, Deserialize,bincode库(2025年最新解决方案详细使用)
开发语言·后端·rust
JiaHao汤1 小时前
Java 虚拟机之双亲委派机制
java·jvm·后端
哈基米喜欢哈哈哈2 小时前
Uber的MySQL实践(一)——学习笔记
数据库·笔记·后端·mysql
姑苏洛言3 小时前
扫码点餐小程序产品需求分析与功能梳理
前端·javascript·后端
Java技术小馆3 小时前
PromptPilot打造高效AI提示词
java·后端·面试
陈陈陈同学243 小时前
Vercel迁移到Dokploy自部署,每月立省20刀
后端·node.js
倔强的皮皮虾4 小时前
sharding proxy 实战读写分离,分库分表
后端
ONE_Gua4 小时前
魔改chromium源码——解除 iframe 的同源策略
前端·后端·浏览器