0
点赞
收藏
分享

微信扫一扫

jenkins教程_4 Docker+SpringCloud



文章目录

  • 4. Docker+SpringCloud
  • 4.1 环境准备
  • 4.1.1 docker的安装
  • centos 7
  • centos 8
  • 容器镜像加速
  • 4.1.2 docker-compose 安装
  • 4.1.3 harbor 安装
  • 4.1.4 Harbor 使用
  • 4.2 使用DockerFile插件生成镜像
  • 4.2.1添加打包插件
  • 4.2.2 编写Dockerfile 文件
  • 4.2.3 打包镜像,并上传服务器
  • 4.2.4 拉取镜像并部署
  • 1) 安装插件
  • 2) 添加远程服务器
  • 3) 上传代码
  • 4.2.5 出现的错误如下
  • 4.2.6 流水线的总代码
  • 4.3 部署静态网站
  • 4.3.1 安装ngnix
  • 4.3.2 安装nodejs 插件
  • 4.3.3 安装nodejs
  • 4.3.4 创建项目
  • 4.3.5 Jenkinsfile 代码
  • 4.4 SpringCloud 打包服务
  • 4.4.1 修改配置
  • 4.4.2 安装插件


4. Docker+SpringCloud

4.1 环境准备

jenkins教程_4 Docker+SpringCloud_jenkins

  • docker
  • jenkins
  • maven
  • harbor 私有的镜像仓库

4.1.1 docker的安装

centos 7

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
yum install -y yum-utils
yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum install docker-ce docker-ce-cli containerd.io -y
systemctl start docker
docker version

centos 8

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
yum install -y yum-utils
yum makecache 
yum install -y wget
wget -O /etc/yum.repos.d/CenOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo
yum clean all
yum install -y https://download.docker.com/linux/centos/8/x86_64/stable/Packages/containerd.io-1.4.3-3.1.el8.x86_64.rpm
yum install docker-ce docker-ce-cli -y
systemctl start docker
docker version

容器镜像加速

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

4.1.2 docker-compose 安装

compose 网址

https://github.com/docker/compose/releases

安装docker-compose

sudo curl -L "https://gitee.com/fakerlove/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version

centos7 可以选择如下安装

yum -y install python-pip
pip install --upgrade pip
pip install docker-compose
docker-compose -version

4.1.3 harbor 安装

在github 上找到适合自己的版本

https://github.com/goharbor/harbor/tags

最低的需求配置

jenkins教程_4 Docker+SpringCloud_maven_02

上传下载的软件,并解压

tar -zxvf harbor-offline-installer-v2.2.2.tgz -C /usr/local/

复制yml

cd /usr/local/harbor/
cp harbor.yml.tmpl harbor.yml
vim harbor.yml

修改一下三个部分信息

jenkins教程_4 Docker+SpringCloud_maven_03

启动脚本

./install.sh

jenkins教程_4 Docker+SpringCloud_docker_04

等启动成功,输入网址

http://121.37.175.163/

jenkins教程_4 Docker+SpringCloud_docker_05

如果默认80 网址,有服务,即可修改端口信息

jenkins教程_4 Docker+SpringCloud_docker_06

4.1.4 Harbor 使用

创建harbor项目

jenkins教程_4 Docker+SpringCloud_jenkins_07

创建镜像,给镜像把tag

121.37.175.163 为Harbor的网址,jenkins为Harbor的用户信息,myjenkins 为镜像名字

注意点

80端口的话,打tag 时不能添加80,直接就是ip 地址即可,其中clock 为项目名。kk 为在仓库中镜像的名字

docker tag jenkins/jenkins:latest 121.37.175.163/clock/kk:1.0

jenkins教程_4 Docker+SpringCloud_jenkins_08

添加受信任名单

jenkins教程_4 Docker+SpringCloud_docker_09

vim /etc/docker/daemon.json

添加一下内容

{
  "registry-mirrors": ["https://ip92h4jn.mirror.aliyuncs.com"],
  "insecure-registries": ["121.37.175.163:80"]
}

使用Harbor 账户登录docker

systemctl daemon-reload
systemctl restart docker
docker login 121.37.175.163 -u admin -p 123456

上传镜像

docker push  121.37.175.163/clock/kk:1.0

jenkins教程_4 Docker+SpringCloud_maven_10

如果报错

Get http://harbor.phc-dow.com/v2/: Get http://harbor.phc-dow.com:180/service/token?account=admin&client_id=docker&offline_token=true&service=harbor-registry: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers) (Client.Timeout exceeded while awaiting headers)

解决方案

  1. 检查是否添加信任名单,
  2. 检查是否填写外网网址
  3. 检查用户名和密码
  4. 检查端口号,是否填写正确
  5. 检查防火墙和安全组是否开放

最后试试以下内容

vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 #最后一行写入
sysctl -p

4.2 使用DockerFile插件生成镜像

4.2.1添加打包插件

<plugin>
                <groupId>com.spotify</groupId>
                <artifactId>dockerfile-maven-plugin</artifactId>
                <version>1.4.13</version>
                <configuration>
                    <repository>${project.artifactId}</repository>
                    <buildArgs>
                        <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
                    </buildArgs>
                </configuration>
            </plugin>

4.2.2 编写Dockerfile 文件

FROM openjdk:8-jdk-alpine
EXPOSE 8081
ARG JAR_FILE
ADD ${JAR_FILE} /app.jar
ENTRYPOINT ["java", "-jar","/app.jar"]

jenkins教程_4 Docker+SpringCloud_maven_11

修改jenkins 信息

4.2.3 打包镜像,并上传服务器

可以使用阿里云的镜像容器服务,或者自己的harbor私人镜像仓库

使用流水线语法,进行上传服务

jenkins教程_4 Docker+SpringCloud_centos_12

pipeline {
    agent any
    environment {
        tag = 'latest'
        //阿里云的镜像存储空间
        harbor_url = 'registry.cn-shanghai.aliyuncs.com'
        //镜像存储的命名空间
        harbor_project_name = 'jokerak' //Harbor的凭证
        harbor_auth = 'ef499f29-f138-44dd-975e-ff1ca1d8c933'
        // 项目名
        project_name = 'clock'

        imageName = "${project_name}:${tag}"
    }

    stages {
        stage('拉取代码') {
            steps {
                checkout([
                            $class: 'GitSCM',
                            branches: [[name: '*/master']],
                            extensions: [],
                            userRemoteConfigs:
                            [[credentialsId:
                            '1527f9a8-f6ed-41b3-93a7-c05a88f36de9',
                            url: 'https://gitee.com/fakerlove/clock']
                            ]
                       ])
            }
        }
        stage('打包编译项目,创建镜像,上传镜像') {
            steps {
                // 打包编译项目
                sh 'mvn clean package dockerfile:build'

                // 给镜像打tag
                sh "docker tag ${imageName} ${harbor_url}/${harbor_project_name}/${imageName}"

                withCredentials([usernamePassword(credentialsId: '5b07edf3-bfb8-49e7-8b27-a6d600ef99d8', passwordVariable: 'password', usernameVariable: 'username')]) {
                    // 登录镜像
                    sh "docker login -u ${username} -p ${password} ${harbor_url}"
                    //上传镜像
                    sh "docker push ${harbor_url}/${harbor_project_name}/${imageName}"
                }
            }
        }
    }
    post {
        always {
            // 发送邮件
            emailext(
                subject: '构建通知:${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!',
                body: '${FILE,path="email.html"}',
                to: '203462009@qq.com' )
        }
    }
}

4.2.4 拉取镜像并部署

1) 安装插件

安装以下插件,可以实现远程发送Shell命令

jenkins教程_4 Docker+SpringCloud_maven_13

首先在jenkins 所在服务器下生成ssh ,2.277 版本一下不支持一下生成公钥。不知道现在2.932 还支不支持

ssh-keygen -o

可以试一下

ssh-keygen -m PEM -t rsa -b 4096

说明:

-m 参数指定密钥的格式,PEM是rsa之前使用的旧格式
 -b 指定密钥长度。对于RSA密钥,最小要求768位,默认是2048位。

拷贝公钥到服务器中

ssh-copy-id 121.37.175.163

jenkins教程_4 Docker+SpringCloud_docker_14

2) 添加远程服务器

系统配置->添加远程服务器

修改公钥权限,复制公钥值jenkins目录下,以防没有权限访问

mkdir /var/lib/jenkins/.ssh
cp /root/.ssh/* /var/lib/jenkins/.ssh/

jenkins教程_4 Docker+SpringCloud_docker_15

点击测试

jenkins教程_4 Docker+SpringCloud_docker_16

3) 上传代码

使用流水线语法生成器

jenkins教程_4 Docker+SpringCloud_centos_17

创建流水线语法

sshPublisher(
                    publishers:
                [sshPublisherDesc(configName: '华为云服务器',
                transfers: [
                    sshTransfer(
                        cleanRemote: false,
                        excludes: '',
                        execCommand: "/opt/jenkins_shell/deploy.sh $harbor_url $harbor_project_name $project_name $tag $port",
                        execTimeout: 120000,
                        flatten: false,
                        makeEmptyDirs: false,
                        noDefaultExcludes: false,
                        patternSeparator: '[, ]+',
                        remoteDirectory: '',
                        remoteDirectorySDF: false,
                        removePrefix: '',
                        sourceFiles: '')],
                        usePromotionTimestamp: false,
                        useWorkspaceInPromotion: false,
                        verbose: false)])

在部署服务的服务器上创建deploy.sh

#! /bin/sh #接收外部参数 
harbor_url=$1 
harbor_project_name=$2 
project_name=$3 
tag=$4 
port=$5 
imageName=$harbor_url/$harbor_project_name/$project_name:$tag 
echo "$imageName" #查询容器是否存在,存在则删除 
containerId=`docker ps -a | grep -w ${project_name}:${tag} | awk '{print $1}'` 
if [ "$containerId" != "" ] ; then 
#停掉容器 
  docker stop $containerId 
#删除容器 
  docker rm $containerId 
  echo "成功删除容器"
fi
#查询镜像是否存在,存在则删除 
imageId=`docker images | grep -w $project_name | awk '{print $3}'`
if [ "$imageId" != "" ] ; then 
#删除镜像 
 docker rmi -f $imageId
 echo "成功删除镜像" 
fi
# 登录Harbor私服 
docker login -u itcast -p Itcast123 $harbor_url 
# 下载镜像 
docker pull $imageName 
# 启动容器 
docker run -di -p $port:$port -v /etc/localtime:/etc/localtime $imageName
echo "容器启动成功"

4.2.5 出现的错误如下

  1. 找不到打包插件
    更换maven 镜像

<mirror>
			<id>
				alimaven
			</id>
			
			<mirrorOf>
				*
			</mirrorOf>
			
			<name>
				aliyun maven
			</name>
			
			<url>
				https://maven.aliyun.com/repository/public
			</url>
		</mirror>

  1. 无法创建maven包
    修改maven 仓库权限

chmod 777 /var/lib/res

  1. Jenkins: unix://localhost:80: Permission denied

chmod 777 /var/run/docker.sock

4.2.6 流水线的总代码

pipeline {
    agent any
    environment {
        tag = 'latest'
        //阿里云的镜像存储空间
        harbor_url = 'registry.cn-shanghai.aliyuncs.com'
        //镜像存储的命名空间
        harbor_project_name = 'jokerak' //Harbor的凭证
        harbor_auth = 'ef499f29-f138-44dd-975e-ff1ca1d8c933'
        // 项目名
        project_name = 'clock'
        port = '8081'
        imageName = "${project_name}:${tag}"
    }

    stages {
        stage('拉取代码') {
            steps {
                checkout([
                            $class: 'GitSCM',
                            branches: [[name: '*/master']],
                            extensions: [],
                            userRemoteConfigs:
                            [[credentialsId:
                            '1527f9a8-f6ed-41b3-93a7-c05a88f36de9',
                            url: 'https://gitee.com/fakerlove/clock']
                            ]
                       ])
            }
        }
        stage('打包编译项目,创建镜像,上传镜像') {
            steps {
                // 打包编译项目
                sh 'mvn clean package dockerfile:build'

                // 给镜像打tag
                sh "docker tag ${imageName} ${harbor_url}/${harbor_project_name}/${imageName}"

                withCredentials([usernamePassword(credentialsId: '5b07edf3-bfb8-49e7-8b27-a6d600ef99d8', passwordVariable: 'password', usernameVariable: 'username')]) {
                    // 登录镜像
                    sh "docker login -u ${username} -p ${password} ${harbor_url}"
                    //上传镜像
                    sh "docker push ${harbor_url}/${harbor_project_name}/${imageName}"
                }
            }
        }
        stage('拉取镜像,部署服务') {
            steps {
                sshPublisher(
                    publishers:  [
                     sshPublisherDesc(
                     configName: 'cloud',
                     transfers: [
                      sshTransfer(
                        cleanRemote: false,
                        excludes: '',
                        execCommand: "/opt/jenkins_shell/deploy.sh $harbor_url $harbor_project_name $project_name $tag $port",
                        execTimeout: 120000,
                        flatten: false,
                        makeEmptyDirs: false,
                        noDefaultExcludes: false,
                        patternSeparator: '[, ]+',
                        remoteDirectory: '',
                        remoteDirectorySDF: false,
                        removePrefix: '',
                        sourceFiles: '')],
                        usePromotionTimestamp: false,
                        useWorkspaceInPromotion: false,
                        verbose: false)])
            }
        }
    }
    post {
        always {
            // 发送邮件
            emailext(
                subject: '构建通知:${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!',
                body: '${FILE,path="email.html"}',
                to: '203462009@qq.com' )
        }
    }
}

4.3 部署静态网站

4.3.1 安装ngnix

yum install epel-release
yum -y install nginx

修改配置文件,修改端口信息

vi /etc/nginx/nginx.conf

jenkins教程_4 Docker+SpringCloud_docker_18

要关闭selinux

vi /etc/selinux/config

永久关闭 SELINUX=disabled

jenkins教程_4 Docker+SpringCloud_centos_19

启动ngnix

systemctl start nginx

jenkins教程_4 Docker+SpringCloud_docker_20

4.3.2 安装nodejs 插件

搜索插件NodeJS

jenkins教程_4 Docker+SpringCloud_docker_21

4.3.3 安装nodejs

尽量使用自己的npm,因为需要配置镜像,自己的环境搭建起来

wget https://npm.taobao.org/mirrors/node/v14.16.1/node-v14.16.1-linux-x64.tar.xz
xz -d node-v14.16.1-linux-x64.tar.xz
tar -xvf node-v14.16.1-linux-x64.tar
mkdir -p  /var/lib/node 
rm -rf /var/lib/node/*
cp ~/node-v14.16.1-linux-x64/* /var/lib/node -r
chmod 777 -R /var/lib/node
ln -s /var/lib/node/bin/node /usr/bin/node
ln -s /var/lib/node/bin/npm /usr/bin/npm
npm config set registry https://registry.npm.taobao.org
vim /etc/profile
export PATH=/var/lib/node/bin:$PATH
source /etc/profile

jenkins教程_4 Docker+SpringCloud_maven_22

4.3.4 创建项目

一定要修改连接的根目录,不然会出现问题

jenkins教程_4 Docker+SpringCloud_centos_23

创建一个Vue的项目。vue-cli3 脚手架创建项目。然后创建Jenkinsfile 文件

在流水线语法生成器,生成语法

jenkins教程_4 Docker+SpringCloud_maven_24

4.3.5 Jenkinsfile 代码

4.4 SpringCloud 打包服务

注意点

  • common 工程中,不能够使用springboot 的打包插件,必须移除common 父工程的打包插件

使用,-f 指定特定工程进行打包

mvn -f common clean install

jenkins教程_4 Docker+SpringCloud_docker_25

4.4.1 修改配置

# 集群版
spring:
  application:
    name: EUREKA-HA
---
server:
  port: 10086
spring: # 指定profile=eureka-server1
  profiles: eureka-server1
eureka:
  instance: # 指定当profile=eureka-server1时,主机名是eureka-server1
    hostname: 192.168.66.103
  client:
    service-url: # 将自己注册到eureka-server1、eureka-server2这个Eureka上面去
      defaultZone: http://192.168.66.103:10086/eureka/,http://192.168.66.104:10086/eureka/
      
---

server:
 port: 10086
spring:
 profiles: eureka-server2
eureka:
 instance:
  hostname: 192.168.66.104
 client:
  service-url:
   defaultZone: http://192.168.66.103:10086/eureka/,http://192.168.66.104:10086/eureka/

4.4.2 安装插件

安装Extended Choice Parameter


举报

相关推荐

0 条评论