spring-boot項目的docker集成化部署
前言
據說流行的微服務和docker一起,更配哦!接下來,使用簡單spring-boot項目演示docker的集成化部署的案例,在看過微笑的博客覺得不過癮,自己動手,下面的方案與Devops的方式比較接近;希望搭建理解這種思路。
基本思路與方案
- 開發者
push
到git服務器
- Jenkins通過
觸發器
收到通知 - Jenkins克隆工作區
- Jenkins創建一個Docker鏡像(注意:這是用
maven的docker插件
) Jenkins將鏡像推到Docker Hub
借鑑圖片
基本步驟
準備源碼
Github路徑:spring-boot_docker_demo
說明:這裏使用com.spotify的docker-maven-plugin的插件;用法參閱代碼註釋。
服務器和基礎環境
Linux下Java8安裝
1. 下載
wget --no-cookies \
--no-check-certificate \
--header "Cookie: oraclelicense=accept-securebackup-cookie" \
http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a2fad6ed6d1/jdk-8u181-linux-x64.tar.gz \
-O jdk-8-linux-x64.tar.gz
2. 解壓安裝
tar -zxvf jdk-8-linux-x64.tar.gz
mv jdk-8-linux-x64.tar.gz /usr/local
3. 配置環境變量
export JAVA_HOME=/usr/local/jdk1.8.0_181/
export PATH=$PATH:$JAVA_HOME
export JAVA_HOME=/usr/local/jdk1.8.0_181/
export JRE_HOME=$JAVA_HOME/jre #tomcat需要
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
4. 刷新環境變量
source /etc/profile #刷新環境變量
2.1.3.2.3 Linux下Manven安裝
maven的安裝
1. 下載maven
wget http://mirrors.cnnic.cn/apache/maven/maven-3/3.5.0/binaries/apache-maven-3.5.0-bin.tar.gz
2. 安裝
tar -zxvf apache-maven-3.5.0-bin.tar.gz
mv apache-maven-3.5.4 /usr/local/maven/apache-maven-3.5.4
3. 配置環境變量
export MAVEN_HOME=/usr/local/maven/apache-maven-3.5.4
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$MAVEN_HOME/bin:$PATH #注意這裏添加$MAVEN_HOME/bin
4. 刷新環境變量
source /etc/profile #刷新環境變量
安裝Jenkins
Jenkins安裝有三種方式
1. 基於Docker的安裝
docker run \
-u root \
--rm \
-d \
-p 8080:8080 \
-p 50000:50000 \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean
2. 基於war包方式
在官網下載,放入Tomcat的目錄中即可;打war,大家肯定十分熟悉的操作。
3. 使用yum方式直接安裝 (推薦)
1.下載
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
2.安裝
yum install jenkins
3. 配置
vi /etc/sysconfig/jenkins
可避免避免和
Tomcat
端口重複的問題
4. 啓動服務
service jenkins start
Jenkins的基本初始化
1. 登錄
2. 安裝Jenkins插件
3.安裝成功
基本按照推薦來
4. 配置jdk和maven配置
說明這裏其實
git
非必須,之前的插件安裝中安裝了
Pipeline語法
語法請自行查閱資料,這裏使用groovy的語法
Jenkins的項目配置
1. 新建pipeline的項目
2. 添加如下jekins的腳本內容:注意:使用pipeline的語言
#!groovy
pipeline{
agent any
environment {
REPOSITORY="https://gitee.com/will-we/spring-boot_docker_demo.git"
}
tools {
maven 'm3'
jdk 'java8'
}
stages {
stage('獲取代碼'){
steps {
echo "start fetch code from git:${REPOSITORY}"
//清空當前目錄
deleteDir()
//拉去代碼
git "${REPOSITORY}"
}
}
stage('代碼靜態檢查'){
steps {
//僞代碼檢查
echo "start code check"
}
}
stage('編譯+單元測試'){
steps {
echo "start compile"
//切換目錄
sh 'mvn -Dmaven.test.skip=true -U clean install'
}
}
stage('構建鏡像'){
steps {
echo "start build image"
//build鏡像
sh 'mvn clean package docker:build'
}
}
}
}
3. 立即構建”,查看運行的日子如下:
4. 如果看上面的恭喜你,構建鏡像成功;參看docker的鏡像,對你“so easy”
5. 啓動docker容器
# 最好添加--name參數
docker run --name= springboot/spring-boot_docker_demo -p 8081:8080 -t srping-demo
問題解決
1. Jenkins構建時出現:“mvn: command not found”
解決方案:
自己試着摸着石頭過河,只能藉助搜索引擎了;如下是解決的流程:
1) 安裝Pipeline Maven Integration插件
2) 檢查環境變量
上面安裝了插件後依舊不好使,繼續找原因吧,Maven not found in Jenkins【StackOverflow】有着這個題問題:原因如下:
The reason is that Jenkins is installed and run as a ‚system user‘ service. This means the process can‘t see the ENV variables and PATH of your user (user level). Setting up maven in PATH and ENV variables on system level makes the trick.
大體意思是:jekins的無法讀取系統的環境變量;於是分別查看了大致的服務器和jekins的變量。
Jenkins 服務器/bin/bash
3) Jenkins導入java和maven的權限
還記得之前配置Jdk和maven的“全局工具設置”,注意:這裏設置也是依舊不能直接讀取,需要如下方式引入;“m3”是配置時名稱,“java8”也是配置名稱。
tools {
maven 'm3'
jdk 'java8'
}
2. Linux中端口占用問題
#方式一:參看端口8080信息
netstat -lnp | grep 8080
#方式二:參看端口8080信息
lsof -i :808
#殺死進程
kill -9 pid號
結語
1. 本文總結:
我們使用了一個簡單的
spring-boot
項目部署到遠程服務器的操作流程,從而實現了推送代碼到Git遠程倉庫,使用jekins的集成化構建docker實現,自動化部署方式。
2. 後期優化:
演示spring-boot的簡單部署方式,其實該項目的還有很多地方優化,例如:
doker push
docker的倉庫、使用Jenkins
的觸發器git hook
等;以及後期;spring-boot的多模塊、以及docker compose
的使用等。由於篇幅的原因可能放在了後面的文章。
參考資料
- SpringBoot+Docker+Git+Jenkins實現簡易的持續集成和持續部署
- Spring Boot 2.0(四):使用 Docker 部署 Spring BootMaven 插件之 docker-maven-plugin 的使用
- 部署流水線搭建小記:Docker、Jenkins、Java和Couchbase
================================================================================
- 個人博客:will-we.com
- 我的掘金:weir
- 我的簡書:weir
================================================================================