該demo基於centos7環境
說明:
- 准備2台以上服務器,該demo准備了master和node兩台服務器192.168.10.17(master) 192.168.10.16(node)
- 所有服務器均安裝docke
- jenkins portainer安裝在master節點上
- eureka和zuul網關部署在master節點上
- springboot-service-a/springboot-service-b/springboot-service-c部署在node節點上
- spring-eureka-server 注冊中心,端口7001
- springboot-service-a 服務a,端口7005
- spring-cloud-zuul 網關,端口7000
- springboot-service-b 服務b,端口7006,部署shell和springboot-service-a一樣
- springboot-service-c 服務c,端口7007,部署shell和springboot-service-a一樣
- 原理
- 所有springboot jar包構建通過安裝在master節點的jenkins來完成
- jenkins所在節點(master節點)上docker部署直接通過jenkins執行shell來完成docker鏡像構建和運行命令
- 通過jenkins Publish over SSH插件將構建好的jar包和Dockerfile發送到node節點上執行鏡像構建和運行命令
一、安裝docker
#安裝依賴(docker依賴於系統的一些必要的工具,可以提前安裝) yum install -y yum-utils device-mapper-persistent-data lvm2 #添加軟件源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #安裝docke-ce yum list docker-ce --showduplicates | sort -r #查看所有docker-ce版本 yum install -ysyst docker-ce-18.06.3.ce #啟動服務 systemctl start/stop docker systemctl enable/disable docker #開機啟動 #配置docker加速鏡像 /etc/docker/daemon.json { "registry-mirrors": ["http://hub-mirror.c.163.com"] } #使配置生效 systemctl daemon-reload systemctl restart docker
二、安裝java環境
#如果系統中已經安裝了jdk,需要先卸載
rpm -qa grep | java #查找
rpm -e --nodeps java-1.6.0xxxxxx #卸載
java -version
1.在線安裝 yum install -y java #安裝jre yum install -y java-devel #原生安裝,包含JDK 2.本地安裝 1.下載linux jdk版本 "最新版本下載地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html" "歷史版本下載地址: http://www.oracle.com/technetwork/java/javase/archive-139210.html" 2.上傳解壓 mkdir -p /user/local/java tar zxvf jdk-8u161-linux-x64.tar.gz -C /user/local/java 3.安裝jdk依賴環境glibc,不安裝后期容易出問題
安裝命令 yum install glibc.i686 "報錯cannot file file /usr/local/jdk1.7.0_79/lib/java......" "注:出現error 一個.so文件not found (未找到)那可能你的Linux版本 glibc版本還未達到2.4" "原因分析:linux 上安裝jdk 1.7版本必須要配合 glibc 核心源碼版本在2.4或以上" 4.配置環境 vim /etc/profile #最后加入 export JAVA_HOME=/usr/local/java/jdk1.8.0_161 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin #加載配置 source /etc/profile 5.如果識別不到java建立軟連接 ln -s /usr/local/jdk1.8.0_121/jdk/bin/java /usr/bin/java
三、安裝jenkins
1.添加Jenkins庫到yum庫,Jenkins將從這里下載安裝。 wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key yum install -y jenkins 2.如果不能安裝就到官網下載jenkis的rmp包,官網地址(http://pkg.jenkins-ci.org/redhat-stable/) wget http://pkg.jenkins-ci.org/redhat-stable/jenkins-2.7.3-1.1.noarch.rpm rpm -ivh jenkins-2.7.3-1.1.noarch.rpm #配置jenkis的端口 vi /etc/sysconfig/jenkins #啟動jenkins service jenkins start/stop/restart
#將jenkins用戶加入root組合docker組,以免以后執行時權限不足
gpasswd -a jenkins root
gpasswd -a jenkins docker
systemctl restart jenkins
#安裝成功后Jenkins將作為一個守護進程隨系統啟動 #系統會創建一個“jenkins”用戶來允許這個服務,如果改變服務所有者,同時需要修改/var/log/jenkins, #/var/lib/jenkins, 和/var/cache/jenkins的所有者 #啟動的時候將從/etc/sysconfig/jenkins獲取配置參數 #默認情況下,Jenkins運行在8080端口,在瀏覽器中直接訪問該端進行服務配置 #Jenkins的RPM倉庫配置被加到/etc/yum.repos.d/jenkins.repo #初始密碼在:/var/lib/jenkins/secrets/initialAdminPassword #安裝maven插件 Maven Integration "常見問題1" #如果缺少對應權限將jenkins用戶加入對應用戶組,否者構建時會報權限不足無法執行 gpasswd -a jenkins root #將用戶jenkins加入到root組 gpasswd -a jenkins dockr #將用戶jenkins加入到root組 "常見問題2" #構建maven項目時報找不到java環境,但在終端上java環境是可見的,解決辦法 #1.簡歷軟連接 ln -s /usr/local/jdk1.8.0_121/jdk/bin/java /usr/bin/java #2.在jenkins服務中配置java環境變量 vim /etc/init.d/jenkins #將正確的java路徑填寫到下面,重啟服務 candidates=" /etc/alternatives/java /usr/lib/jvm/java-1.8.0/bin/java /usr/lib/jvm/jre-1.8.0/bin/java /usr/lib/jvm/java-1.7.0/bin/java /usr/lib/jvm/jre-1.7.0/bin/java /usr/lib/jvm/java-11.0/bin/java /usr/lib/jvm/jre-11.0/bin/java /usr/lib/jvm/java-11-openjdk-amd64 /usr/bin/java " systemctl restart jenkins
#安裝插件
#手動安裝插件下載地址http://updates.jenkins-ci.org/download/plugins/
#如果在線找找不到插件,從上面的下載地址 ctrl+f查找的插件下載后通過插件管理中心高級上傳安裝
1.jenkins安裝maven插件
系統管理->插件管理->可選插件->Maven Integration plugin
2.jenkins安裝Publish over SSH
系統管理->插件管理->可選插件->Publish over SSH
四、安裝maven
wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.1.1/binaries/apache-maven-3.1.1-bin.tar.gz tar -zxvf apache-maven-3.1.1-bin.tar.gz 設置環境變量 vi /etc/profile #maven 安裝的路徑 export M2_HOME=/maven/maven export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin #使環境變量生效 source /etc/profile mvn -version
五、創建springCloud項目部署
master節點jenkins工程配置
注冊中心spring-eureka-server配置
1.源碼管理 Subversion(SVN) svn://gitee.com/zhangsike/springboot-learn/spring-eureka-server
2.構建觸發器:選擇輪詢 SCM 配置 * * * * * 每分鍾查詢構建
3.構建環境:選擇 Add timestamps to the Console Output
4. Pre Steps:POM:pom.xml,參數:clean package -Dmaven.test.skip=true
5.Post Steps
命令內容如下:
prjName=spring-cloud-zuul
if docker ps -a | grep -i $prjName; then
docker stop $prjName
docker rm -v -f $prjName
fi
if docker images | grep -i $prjName; then
docker rmi -f $prjName
fi
\cp 'target/'$prjName-'0.0.1-SNAPSHOT.jar' $prjName'-0.0.1-SNAPSHOT.jar'
docker build -t $prjName .
docker run -d --expose=7000 -p 7000:7000 --name $prjName $prjName':latest' --server.port=7001
如果docker中不存在對應容器,這段shell會執行失敗(docker stop會error,后面就無法構建鏡像和創建容器了),所以第一次構建前先手動創建好容器后續執行就正常了,
也可以用shell判斷下容器如果存在再停止刪除,但暫時不會寫這樣的shell,正在學習中。
該shell邏輯如下 停止容器-》刪除容器-》刪除鏡像-》將jar包和Dockerfile復制到同一個目錄中-》在jar包目錄中構建鏡像-》創建容器
jenkins項目創建完成,正常執行完畢后就可以看見容器中已經有運行的實例了
[root@slave2 spring-cloud-zuul]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2b43514c10bc spring-cloud-zuul:latest "java -jar /app.jar" 4 hours ago Up 4 hours 0.0.0.0:7000->7000/tcp spring-cloud-zuul bffb0834de15 spring-eureka-server:latest "java -jar /app.jar" 6 hours ago Up 5 hours 0.0.0.0:7001->7001/tcp spring-eureka-server 08326db2cbd7 springboot-demo:latest "java -jar /app.jar" 3 days ago Up 3 days 0.0.0.0:8081->8080/tcp springboot-demo b56abd94c813 portainer/portainer "/portainer" 6 days ago Up 3 days 0.0.0.0:9000->9000/tcp prtainer-test
spring-cloud-zuul項目創建jenkins工程和spring-eureka-server一致,只需修改源碼和構建shell
shell改成下面即可
prjName=spring-cloud-zuul
if docker ps -a | grep -i $prjName; then
docker stop $prjName
docker rm -v -f $prjName
fi
if docker images | grep -i $prjName; then
docker rmi -f $prjName
fi
\cp 'target/'$prjName-'0.0.1-SNAPSHOT.jar' $prjName'-0.0.1-SNAPSHOT.jar'
docker build -t $prjName .
docker run -d --expose=7000 -p 7000:7000 --name $prjName $prjName':latest' --server.port=7000
node節點jenkins工程配置
除了Post steps不一致之外,其余配置均一致
執行邏輯:通過Publish over SSH插件 將構建好的springboot jar包和Dockerfile發送到遠程主機構建鏡像並啟動
注意:由於運行在docker中的項目ip是容器ip,外網無法訪問,所以在配置eureka客戶端時要以主機ip注冊,否則注冊中心無法提供識別
yml文件如下
eureka: client: registerWithEureka: true fetchRegistry: true serviceUrl: defaultZone: http://admin:admin@192.168.10.17:7001/eureka/ instance: prefer-ip-address: true ip-address: 192.168.10.16 instance-id: 192.168.10.16:${server.port}
最終注冊中心效果