SpringBoot + maven + Jenkins + docker 實現docker叢集一鍵自動化部署
整體可分為以下幾個步驟:
1,建立springboot專案
2,搭建docker私服庫
3,build映象並上傳到私服庫
4,搭建docker swarm叢集
5,搭建jenkins並構建部署
演示系統使用centos7,jdk1.8
1,建立Springboot專案:
在eclipse上新建maven專案,在pom.xml中引入相應的包,如下所示:
<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.spring</groupId> <artifactId>mySpringboot</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>mySpringboot</name> <url>http://maven.apache.org</url> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.0.RELEASE</version> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> <docker.image.prefix>ramer</docker.image.prefix> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>1.3.0.RELEASE</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> <!-- 新增docker外掛 --> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.13</version> <executions> <execution> <id>build-image</id> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> </executions> <configuration> <imageName>docker私服庫的地址與埠/learn:mySwarm</imageName> <forceTags>true</forceTags> <baseImage>docker.io/java</baseImage> <entryPoint>["java", "-jar","/${project.build.finalName}.jar"]</entryPoint> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> </plugins> </build> </project>
2, 搭建docker私服庫
2.1 下載安裝docker環境
直接使用線上安裝,在終端輸入命令: yum install docker
下載完成後啟動docker服務:service docker start
成功啟動後輸入:docker version檢視docker資訊,如下圖所示:
2.2 docker常用命令
docker run :執行映象生成容器
docker ps –a:檢視所有容器
docker pull:拉取映象
docker push:上傳映象
docker start:執行容器
docker stop:停止容器
docker rm:刪除容器
docker rmi:刪除映象
docker logs:檢視容器日誌
docker tag:修改映象名
docker images:檢視所有映象
以上是平時用的比較多的docker命令,想了解更多的命令請百度
2.3 拉取私服庫映象
在終端輸入: docker pull registry
把映象下載完後修改映象名:
docker tag docker.io/:registry192.168.230.10:5000/learn:registry
說明:docker tag後面分為兩部分中間以空格隔開,空格的左邊是要修改的原始映象,右邊是修改後的映象,每個映象名的組成都由registry + tag形成唯一標識,例如192.168.230.10:5000/learn這個是映象存放的具體路徑,registry
修改映象名後輸入: docker run -p 192.168.230.10:5000:5000 -v/opt/data/registry:/var/lib/registry -i -t -d docker.io/registry
生成並執行容器,這樣一個docker私服庫就已經搭建好了
我們把剛才修改映象名後的映象上傳到docker私服庫
docker push 192.168.230.10:5000/learn:registry
這裡會報錯,編輯配置檔案::
vi /etc/docker/daemon.json
新增內容:"insecure-registries":["docker私有庫的地址"]
設定搭建好的docker私服庫IP與埠
再次push剛才的映象,成功上傳
learn就是私服庫存放映象的資料夾,再查詢這個資料夾下的映象,輸入:
通過docker pull拉取映象,如:docker pull 192.168.230.10:5000/learn:registry
這裡是拉取私服庫中的映象,根據你的映象命名去私服庫中查詢,如果只提供了tag名則預設去docker官方的倉庫中拉取,如我們之前拉取的服務庫映象,docker pull registry
3,build映象並上傳到私服庫
3.1 build映象並上傳到dock伺服器
回到我們之前建立的springboot專案,找到本地專案根目錄,如我的是D:\springbootTest\mySpringboot
開啟cmd進入到此目錄中輸入以下命令:
mvn clean package docker:build,如下圖所示
注意:這裡會報錯,原因是本地沒有安裝docker,無法執行docker命令
3.2 獲取docker命令
通常有2種情況獲取docker命令
1,本地安裝docker
2,開啟docker遠端api
這裡我們使用之前安裝好的docker環境
1,先在本地環境變數中加入docker_host變數,如下圖所示
2,然後在docker服務中,編輯配置檔案
vi /lib/systemd/system/docker.service,如下圖所示在紅框位置新增紅框內的內容
然後重啟docker
systemctl daemon-reload
systemctl restart docker.service
再在cmd中執行mvn clean package docker:build,還是會報錯,原因是對應的2375埠沒有被開放,進入到/sbin目錄中執行 iptables -I INPUT -p tcp --dport 2375 -j ACCEPT然後再次打包,成功上傳
然後在docker伺服器輸入docker images可以看到映象已經上傳到伺服器,然後通過
docker push命令把映象上傳到私服庫
4,搭建docker swarm叢集
為了演示,我們用兩臺伺服器就好了
192.168.230.10(主)
192.168.230.11(從)
4.1 pull docker swarm映象
在主機上執行:docker pull swarm,安裝swarm外掛
安裝好外掛後執行:
docker swarm init --advertise-addr192.168.230.10 初始化一個叢集的master伺服器
返回以下資訊:
記住這裡的token 這個token是叢集的唯一標識,只有根據這個token才能加入docker叢集中
然後在從機上輸入:
docker swarm join --token SWMTKN-1-5fli7xt3s4hbt3pghkmaosgz98ttvmnd1t5lolnkfn446s6gpj-15893cufutsyuc7ewg89iwhz3 192.168.2.10:2377
使伺服器加入到這個docker叢集中
然後在主機上輸入
docker node ls 檢視叢集的資訊,如下圖
可以看到標識有leader的是叢集的master伺服器,其他的是從機
4.2 docker swarm常用命令
Docker swarm init:初始化一個叢集
Docker swarm join:加入一個叢集
Docker node ls:檢視叢集的資訊
Docker service create:建立一個叢集服務
Docker service ls:檢視叢集的服務
Docker service rm:刪除一個叢集服務
還有更多swarm命令,請百度
4.3 部署一個docker swarm叢集專案
用之前從docker私服庫中拉取的映象,在主機上輸入:
docker service create –replicas 2 –p8000:8000 –name mySwarm 192.168.230.10:5000/learn:mySwarm
這樣就建立了一個docker swarm叢集服務,這裡的replicas是部署幾臺伺服器,swarm叢集會先從本地找有沒有對應的映象,如果有則直接run該映象,如果沒有則從docker私服庫上拉取,然後一個伺服器一個伺服器run映象生成容器
然後輸入docker service ls:可以看到目前服務的情況
這樣,我們就簡單的初步實現了一個docker swarm的叢集
5,搭建jenkins並構建部署
5.1 拉取映象
直接在終端機(jenkins可隨意搭建在任意一臺伺服器)輸入:
Docker pull Jenkins
下載完映象後輸入;
docker run -p 8080:8080 -e"DOCKER_HOST=tcp://192.168.230.10:2375" --name myJenkins -u root -v/jenkins/:/var/jenkins_home -d docker.io/jenkins
這裡的docker_host跟前面說的原理一樣,因為jenkins映象run出來的容器本身是沒有安裝docker的,所以我們直接從docker伺服器獲取docker命令
這裡的-u root是為了把當前執行jenkins的使用者換做root
然後輸入docker ps –a可以發現容器並沒有跑起來,輸入docker logs + 容器ID,檢視容器日誌提示沒有許可權,輸入setenforce 0 然後再執行容器就成功run起來了
5.2 配置jenkins
Jenkins的初始化請參照百度,這裡就不重複了
注意:run完之後瀏覽器輸入localhost:8080出現jenkins介面的時候在安裝外掛步驟可能會報以下錯誤:
No such plugin: cloudbees-folder
是在jenkins映象run的過程中,這個外掛下載失敗,可以瀏覽器輸入
localhost:8080/restart 先跳過這個步驟,然後重新去啟動jenkins,如果還不行就跳過這個步驟後自己上傳手動下載的外掛
先安裝要用到的外掛,進入系統管理-管理外掛-可選外掛,在搜尋框中輸入要安裝的外掛
這個外掛是為了jenkins構建完之後遠端登入到docker swarm叢集中的master機器統一部署
配置 SSH:
參照百度生成祕鑰的方式生成公鑰和私鑰,
然後我們生成一個maven專案,配置如圖所示:
Exec command中的命令:
docker service rm mySwarm;
先刪除舊的服務
docker rmi 192.168.230.10:5000/learn:mySwarm;
然後刪除舊的映象
docker service create --replicas 2 -p8000:8000 --name mySwarm 192.168.230.10:5000/learn:mySwarm
新建新的服務
配置完之後點選立即構建,第一次構建會下載很多包,需要一點時間,請耐心等待,最終如下圖所示:
先成功build映象
然後push映象到docker私服庫
構建完成後通過SSH登入到docker swarm叢集的master統一部署程式碼
至此整個流程就結束了,還有很多細節需要完善….