docker+jenkins+gitee 部署maven项目(1)

环境:移动云申请的免费一个使用
坑:移动云 的80、443 … 要备案才能公网访问
目标: docker-compose 一次性部署基础组件,jenkins 一键发布
下篇通过jenkins部署前端vue项目
docker+jenkins+gitee 部署maven项目(1)_第1张图片

一、安装docker

1.1、删除之前安装的docker(若之前未安装过,此步骤省略…)

进入centos根目录执行以下命令(\ 是linux系统种命令换行符,如果命令过长,可以用\来换行)
**

yum remove docker \
docker-client \
docker-client-latest \
docker- common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-sqlinux \
docker-engine-selinux \
docker-engine \
docker-ce

1.2、虚拟机联网,安装yum工具 (可省略)

在新主机首次安装 Docker Engine-Community之前,需要设置Docker仓库,之后,您可以从仓库安装和更新 Docker。
设置仓库,需要安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
Device Mapper 是 Linux2.6 内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
LVM(Logical Volume Manager)逻辑卷管理。
它是对磁盘分区进行管理的一种机制,建立在硬盘和分区之上的一个逻辑层,用来提高磁盘管理的灵活性。通过LVM可将若干个磁盘分区连接为一个整块的卷组(Volume Group),形成一个存储池。可以在卷组上随意创建逻辑卷(Logical Volumes),并进一步在逻辑卷上创建文件系统,与直接使用物理存储在管理上相比,提供了更好灵活性。
device-mapper-persistent-data 和 lvm2 两者都是Device Mapper所需要的。
在这之前还可以更新下 yum linux 版本,毕竟docker 、及其他组件都是比较新的

yum update

执行以下命令

yum install -y yum-utils device-mapper-persistent-data lvm2

1.3、设置docker镜像源

执行一下命令

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

可以先更新下yum 软件包最新

 yum makecache fast

执行以下命令加粗样式

1.4、安装docker

默认安装最新版

yum -y install docker-ce

也可以指定版本

yum -y install docker-ce-18.06.3.ce-3.el7 

1.5、启动docker前准备

(docker应用需要用到各种端口,逐一设置比较麻烦,建议直接关闭防火墙) 重要的事请说三遍:启动docker前,一定要关闭防火墙、启动docker前,一定要关闭防火墙、启动docker前,一定要关闭防火墙(关闭前可通过查看查看防火墙状态来检验是否关闭)

#关闭
systemctl stop firewalld
#禁止开机启动防火墙
systemctl disable firewalld

1.6、启动docker

systemctl start docker

设置开机启动docker

systemctl enable docker.service

查看是否启动成功有多种方法

 #查看状态:
 systemctl status docker
 #查看版本
 docker -v

1.7、设置国内镜像

docker官方镜像仓库网速较差,设置国内镜像,首选阿里云参考阿里云的镜像加速文档: https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
我们这里选择centOS(如下图,执行图片中命令即可)

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://ds56c2e4.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

1.8.安装docker-compose

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

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

大概率失败
可以看这里去取
程序猿一枚
https://blog.csdn.net/zhaozhiqiang1981/article/details/129227141
授权

chmod +x /usr/local/bin/docker-compose

检查版本2.2.2

docker-compose version

二、通过docker-compose 安装redis、mysql、jenkins、nginx

备注:一个一个按太麻烦了;后续还要部署前端vue项目 这里一并把nginx部署
mysql 下面文件都要赋予权限

2.1在根目录下创建 相应文件夹 如下图

docker+jenkins+gitee 部署maven项目(1)_第2张图片

2.2 给docker分配文件夹权限

重点注意: 一定要确保目录 /docker 及其所有子目录 具有写权限 如果后续出现权限异常问题 重新执行一遍分配权限,每个服务的文件夹都弄下

chmod -R 777 /docker

2.3 jenkins、redis 、mysql 、nginx 配置文件自己找吧

附上1: nginx nginx.conf
之所以监听端口配置81,主要是移动云 安全规则如此,也是摧残人啊

worker_processes  1;

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

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    # 限制body大小
    client_max_body_size 100m;

    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;

    upstream server {
        ip_hash;
        # gateway 地址
        server 127.0.0.1:8080;
        # server 127.0.0.1:8081;
    }

    server {
        listen       81;
        server_name  localhost;

        # https配置参考 start
        #listen       443 ssl;

        # 证书直接存放 /docker/nginx/cert/ 目录下即可 更改证书名称即可 无需更改证书路径
        #ssl on;
        #ssl_certificate      /etc/nginx/cert/xxx.local.crt; # /etc/nginx/cert/ 为docker映射路径 不允许更改
        #ssl_certificate_key  /etc/nginx/cert/xxx.local.key; # /etc/nginx/cert/ 为docker映射路径 不允许更改
        #ssl_session_timeout 5m;
        #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        #ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        #ssl_prefer_server_ciphers on;
        # https配置参考 end

        # 演示环境配置 拦截除 GET POST 之外的所有请求
        # if ($request_method !~* GET|POST) {
        #     rewrite  ^/(.*)$  /403;
        # }

        # location = /403 {
        #     default_type application/json;
        #     return 200 '{"msg":"演示模式,不允许操作","code":500}';
        # }

        # 限制外网访问内网 actuator 相关路径
        location ~ ^(/[^/]*)?/actuator(/.*)?$ {
            return 403;
        }

        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://server/;
        }

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

附件2:redis.conf

# redis 密码
requirepass 123456

# key 监听器配置
# notify-keyspace-events Ex

# 配置持久化文件存储路径
dir /redis/data
# 配置rdb
# 15分钟内有至少1个key被更改则进行快照
save 900 1
# 5分钟内有至少10个key被更改则进行快照
save 300 10
# 1分钟内有至少10000个key被更改则进行快照
save 60 10000
# 开启压缩
rdbcompression yes
# rdb文件名 用默认的即可
dbfilename dump.rdb

# 开启aof
appendonly yes
# 文件名
appendfilename "appendonly.aof"
# 持久化策略,no:不同步,everysec:每秒一次,always:总是同步,速度比较慢
# appendfsync always
appendfsync everysec
# appendfsync no

2.4 配置 docker-compose.yml

下载好的 docker-compose 一般是放在 /usr/local/bin 下
在同级目录下 创建 docker-compose.yml 内容如下

注意:network_mode: “host” 外网直接访问服务端口,如此 映射的端口 实际上无效的,直接访问容器配置文件的 端口,比如 -p 5767:80 实际上访问地址ip:80 而不是ip:5756 详细查询compose网络模式

(版本可以自选)

version: '3'

services:
  mysql:
    image: mysql:8.0.31
    container_name: mysql
    environment:
      # 时区上海
      TZ: Asia/Shanghai
      # root 密码
      MYSQL_ROOT_PASSWORD: 123456
      # 初始化数据库
      MYSQL_DATABASE: ry-vue-zhnc
    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
    

  jenkins:
    image: jenkins/jenkins:2.419
    container_name: jenkins
    restart: always
    user: root
    ports:
    - "8081:8080"
    - "50000:50000"
    volumes:
    - /docker/jenkins_home:/var/jenkins_home
    - /etc/localtime:/etc/localtime:ro
    - /usr/bin/docker:/usr/bin/docker 
    - /var/run/docker.sock:/var/run/docker.sock

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



  nginx:
    image: nginx:1.21.5
    container_name: nginx
    environment:
      # 时区上海
      TZ: Asia/Shanghai
    ports:
      - "81:81"
    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
  

2.5 在 /usr/local/bin 目录执行

 docker-compose up -d

成功如下图:
在这里插入图片描述

注意1:镜像版本尽可能指定,本人在测试安装jenkins 每次拉取最新的,但是 都是2.381的版本 这个版本在安装插件的时候 只有两三个成功,现在之所以选择2.4X 也是无意中拉取后 后续操作没有问题*

注意2:docker的运行包括以下三部分:
开始看别帖子 没有注意到这里要说明什么,直到后面遇到

Jenkins执行shell脚本报错:docker: command not found

1.docker-cli -------docker客户端
2.docker.sock --------docker中间件
3.docker-server ---------docker服务器
查看docker在宿主机的位置

which docker

docker在宿主机的位置:/usr/bin/docker
在这里插入图片描述
查看docker.sock在宿主机的位置

ls /var/run/docker.sock

在这里插入图片描述
使用docker的话,只需要docker-cli和docker.sock即可。如果要在jenkins容器内部使用宿主机的docker,只需要将宿主机中的/usr/bin/docker和/var/run/docker.sock挂载到jenkins容器即可。

进入jenkins容器内部

docker exec -it jenkins bash

验证执行docker 命令

docker ps -a

退出jenkins容器

exit

docker+jenkins+gitee 部署maven项目(1)_第3张图片
**

2.6 日志查看 然后copy下 密钥(后面要用密钥)

**

docker logs jenkins

docker+jenkins+gitee 部署maven项目(1)_第4张图片
查看容器

docker ps -a

访问Jenkins

在浏览器中输入:http://serverIp:port/访问jenkins,serverIp为docker宿主机的ip,port即为宿主机映射的端口
输入上面复制的密钥

安装推荐插件

docker+jenkins+gitee 部署maven项目(1)_第5张图片
因为网络原因,需要将插件源设置为国内的,这样才可以安装插件。进入宿主机目录 /home/jenkins_home/,编辑文件 hudson.model.UpdateCenter.xml

1.进入宿主机目录 /docker/jenkins_home/

cd /docker/jenkins_home/

2.查看 hudson.model.UpdateCenter.xml

cat hudson.model.UpdateCenter.xml 

docker+jenkins+gitee 部署maven项目(1)_第6张图片
3.编辑 hudson.model.UpdateCenter.xml

vim hudson.model.UpdateCenter.xml

docker+jenkins+gitee 部署maven项目(1)_第7张图片
输入E,进入编辑模式,将 url 内容修改为 https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json(清华大学官方镜像)

docker+jenkins+gitee 部署maven项目(1)_第8张图片

修改完成后,按ESC键,退出编辑模式,再输入: wq,强制保存并退出

3.重启容器及配置环境、插件

docker restart jenkins

访问Jenkins

在浏览器中输入:http://serverIp:port/访问jenkins,serverIp为docker宿主机的ip,port即为宿主机映射的端口
输入上面复制的密钥
docker+jenkins+gitee 部署maven项目(1)_第9张图片
安装推荐插件
docker+jenkins+gitee 部署maven项目(1)_第10张图片
docker+jenkins+gitee 部署maven项目(1)_第11张图片
插件安装完成,创建管理员用户
docker+jenkins+gitee 部署maven项目(1)_第12张图片
最后进入jenkins ui
docker+jenkins+gitee 部署maven项目(1)_第13张图片

3.1Jenkins插件安装、环境配置

Gitee
docker+jenkins+gitee 部署maven项目(1)_第14张图片
以及
Maven
docker+jenkins+gitee 部署maven项目(1)_第15张图片
SSH
docker+jenkins+gitee 部署maven项目(1)_第16张图片
NodeJs
docker+jenkins+gitee 部署maven项目(1)_第17张图片

以上个插件从Available plugins 中 install

docker+jenkins+gitee 部署maven项目(1)_第18张图片
重启jenkins 中文就来了

docker restart jenkins

配置maven (直接使用jenkins自带的,问题就是第一构建比较慢)
docker+jenkins+gitee 部署maven项目(1)_第19张图片
以及 nodejs(后面部署前端项目)
docker+jenkins+gitee 部署maven项目(1)_第20张图片

配置Gitee 凭证
docker+jenkins+gitee 部署maven项目(1)_第21张图片
docker+jenkins+gitee 部署maven项目(1)_第22张图片
docker+jenkins+gitee 部署maven项目(1)_第23张图片
docker+jenkins+gitee 部署maven项目(1)_第24张图片
以上基础配置差不多了

3.2新建一个maven项目

docker+jenkins+gitee 部署maven项目(1)_第25张图片
配置源码 gitee 项目
Credentials 还是需要填写GItee 账号密码
docker+jenkins+gitee 部署maven项目(1)_第26张图片
docker+jenkins+gitee 部署maven项目(1)_第27张图片
docker+jenkins+gitee 部署maven项目(1)_第28张图片Gitee WebHook 密码 去gitee里取
docker+jenkins+gitee 部署maven项目(1)_第29张图片
docker+jenkins+gitee 部署maven项目(1)_第30张图片
docker+jenkins+gitee 部署maven项目(1)_第31张图片
Build

pom.xml

clean package -Dmaven.test.skip=true

docker+jenkins+gitee 部署maven项目(1)_第32张图片
Post Steps
docker+jenkins+gitee 部署maven项目(1)_第33张图片
docker+jenkins+gitee 部署maven项目(1)_第34张图片

shell 脚本

 #!/bin/bash
 # 服务名称
 SERVER_NAME=zhnc
 # 镜像tag
 IMAGE_TAG=latest
 # 镜像名称
 IMAGE_NAME=$SERVER_NAME:$IMAGE_TAG
 echo "------ 开始构建镜像:${SERVER_NAME} ------"
 docker build -t ${IMAGE_NAME} .
 echo "------ 镜像构建结束:${IMAGE_NAME} ------"
 ISFLAG=$(docker ps -q -f "name=${SERVER_NAME}")
 if [ -n  "$ISFLAG" ];then
     echo "------ 容器正在运行:${SERVER_NAME} ------"
     echo "------ 停止容器:$SERVER_NAME ------"
     docker stop $SERVER_NAME
     echo "------ 删除容器:$SERVER_NAME ------"
     docker rm $SERVER_NAME
 else
     echo "------ 容器未在运行:${SERVER_NAME} ------"
 fi

 echo "------ 开始运行容器:$SERVER_NAME ------"
 docker run -d --name $SERVER_NAME -p 7530:7530 $IMAGE_NAME
 echo "------ 清理虚悬镜像 ------"
 if [ -n   "$(docker images | grep "none" | awk '{print $3}')" ];then
     docker rmi -f $(docker images | grep "none" | awk '{print $3}')
 fi

看不懂自己百度
保存

DockerFile
注意dockerfile位置
docker+jenkins+gitee 部署maven项目(1)_第35张图片

FROM anapsix/alpine-java:8_server-jre_unlimited

MAINTAINER Lion Li

RUN mkdir -p /ruoyi/server/logs \
    /ruoyi/server/temp \
    /ruoyi/skywalking/agent

WORKDIR /ruoyi/server

ENV SERVER_PORT=7530

EXPOSE ${SERVER_PORT}

ADD ruoyi-admin/target/*.jar ./app.jar

ENTRYPOINT ["java", \
            "-Djava.security.egd=file:/dev/./urandom", \
            "-Dserver.port=${SERVER_PORT}", \
            # 应用名称 如果想区分集群节点监控 改成不同的名称即可
#            "-Dskywalking.agent.service_name=ruoyi-server", \
#            "-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar", \
            "-jar", "app.jar"]

docker+jenkins+gitee 部署maven项目(1)_第36张图片
开始构建
docker+jenkins+gitee 部署maven项目(1)_第37张图片
docker+jenkins+gitee 部署maven项目(1)_第38张图片

看下面这个

数据库连接报错
docker报错:
docker+jenkins+gitee 部署maven项目(1)_第39张图片
或者
docker+jenkins+gitee 部署maven项目(1)_第40张图片

就是说jenkins中要能使用docker命令

参考及感谢
https://zhuanlan.zhihu.com/p/633777186
https://blog.csdn.net/qq_37312180/article/details/127717560
https://blog.csdn.net/zhaozhiqiang1981/article/details/129227157

你可能感兴趣的:(docker,jenkins,docker-compose,docker,jenkins,gitee,composer,容器,maven,spring,boot)