1. 程式人生 > >SpringBoot + maven + Jenkins + docker 實現docker叢集一鍵自動化部署

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

這個是映象標籤名tag,必須要按照這種格式命名,否則無法上傳到私服庫

修改映象名後輸入: 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統一部署程式碼


至此整個流程就結束了,還有很多細節需要完善….