文章目录
- 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 环境准备
- 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
最低的需求配置
上传下载的软件,并解压
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
修改一下三个部分信息
启动脚本
./install.sh
等启动成功,输入网址
http://121.37.175.163/
如果默认80 网址,有服务,即可修改端口信息
4.1.4 Harbor 使用
创建harbor项目
创建镜像,给镜像把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
添加受信任名单
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
如果报错
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)
解决方案
- 检查是否添加信任名单,
- 检查是否填写外网网址
- 检查用户名和密码
- 检查端口号,是否填写正确
- 检查防火墙和安全组是否开放
最后试试以下内容
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.2.3 打包镜像,并上传服务器
可以使用阿里云的镜像容器服务,或者自己的harbor私人镜像仓库
使用流水线语法,进行上传服务
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 所在服务器下生成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
2) 添加远程服务器
系统配置->添加远程服务器
修改公钥权限,复制公钥值jenkins目录下,以防没有权限访问
mkdir /var/lib/jenkins/.ssh
cp /root/.ssh/* /var/lib/jenkins/.ssh/
点击测试
3) 上传代码
使用流水线语法生成器
创建流水线语法
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 出现的错误如下
- 找不到打包插件
更换maven 镜像
<mirror>
<id>
alimaven
</id>
<mirrorOf>
*
</mirrorOf>
<name>
aliyun maven
</name>
<url>
https://maven.aliyun.com/repository/public
</url>
</mirror>
- 无法创建maven包
修改maven 仓库权限
chmod 777 /var/lib/res
- 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
要关闭selinux
vi /etc/selinux/config
永久关闭 SELINUX=disabled
启动ngnix
systemctl start nginx
4.3.2 安装nodejs 插件
搜索插件NodeJS
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
4.3.4 创建项目
一定要修改连接的根目录,不然会出现问题
创建一个Vue的项目。vue-cli3 脚手架创建项目。然后创建Jenkinsfile 文件
在流水线语法生成器,生成语法
4.3.5 Jenkinsfile 代码
4.4 SpringCloud 打包服务
注意点
- common 工程中,不能够使用springboot 的打包插件,必须移除common 父工程的打包插件
使用,-f 指定特定工程进行打包
mvn -f common clean install
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