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" &
相关推荐
野犬寒鸦2 分钟前
力扣hot100:旋转图像(48)(详细图解以及核心思路剖析)
java·数据结构·后端·算法·leetcode
phiilo28 分钟前
golang 设置进程退出时kill所有子进程
后端
花花无缺28 分钟前
python自动化-pytest-用例发现规则和要求
后端·python
程序员小假31 分钟前
我们来说一说 Cglib 与 JDK 动态代理
后端
摆烂工程师2 小时前
教你如何认证 Gemini 教育优惠的二次验证,薅个 1年的 Gemini Pro 会员
后端·程序员·gemini
绝无仅有3 小时前
未来教育行业的 Go 服务开发解决方案与实践
后端·面试·github
程序员爱钓鱼3 小时前
Go语言实战案例- 命令行参数解析器
后端·google·go
心在飞扬3 小时前
Redis 介绍与 Node.js 使用教程
后端
milanyangbo4 小时前
“卧槽,系统又崩了!”——别慌,这也许是你看过最通俗易懂的分布式入门
分布式·后端·云原生·架构
AAA修煤气灶刘哥4 小时前
MySQL 查文本查哭了?来唠唠 ES 这货:从 “啥是 ES” 到 Java 撸代码,一篇整明白!
java·后端·elasticsearch