SpringBoot + maven + Jenkins + docker 實現docker集群一鍵自動化部署


整體可分為以下幾個步驟:

1,創建springboot項目

2,搭建docker私服

3,build鏡像並上傳到私服庫

4,搭建docker swarm集群

5,搭建jenkins並構建部署

 

演示系統使用centos7,jdk1.8

 

1,創建Springboot項目:

1.1 eclipse生成項目

eclipse上新建maven項目,pom.xml中引入相應的包,如下所示:

   <project xmlns="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>192.168.230.10:5000/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>

 

提示:docker-maven插件中可以修改imageName,其他配置可固定不變

 

1.2 在線生成項目

瀏覽器中輸入https://start.spring.io/,可以在線生成springboot項目結構,如下圖所示:

 

生成的初始pom.xml中會包含springboot項目所需的包,然后再添加docker-maven插件

 

1.3 插件生成項目

可以使用eclipse集成的springboot插件生成springboot項目,由於本人eclipse沒有安裝,所以這里不介紹,有興趣的小伙伴可以百度一下

 

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/:registry 192.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

 

 

設置搭建好的docker私服庫IP與端口

再次push剛才的鏡像,成功上傳

輸入: curl  http://192.168.230.10:5000/v2/_catalog 可以查詢私服庫信息,如下圖所示

 

learn就是私服庫存放鏡像的文件夾,再查詢這個文件夾下的鏡像,輸入:

curl  http://192.168.230.10:5000/v2/learn/tags/list

 

 

通過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-addr 192.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 –p 8000: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 192.168.230.10: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的初始化請參照百度,這里就不重復了

 

安裝用到的插件,進入系統管理-管理插件-可選插件,在搜索框中輸入要安裝的插件

 

Maven Integration plugin

 


這個插件是為了可以新建一個maven項目

Publish Over SSH

這個插件是為了jenkins構建完之后遠程登錄到docker swarm集群中的master機器統一部署

 

配置 SSH:

 

參照百度生成秘鑰的方式生成公鑰和私鑰,

http://blog.csdn.net/u010947098/article/details/61922969

 

 

 

 

 

然后我們生成一個maven項目,配置如圖所示:

 

 

 

 

 

 

Exec command的命令:

docker service rm mySwarm;

刪除舊的服務

docker rmi 192.168.230.10:5000/learn:mySwarm;

然后刪除舊的鏡像

docker service create --replicas 2 -p 8000:8000 --name mySwarm 192.168.230.10:5000/learn:mySwarm

新建新的服務

 

配置完之后點擊立即構建,第一次構建會下載很多包,需要一點時間,請耐心等待,最終如下圖所示:

成功build鏡像

 

然后push鏡像docker私服庫

 

構建完成后通過SSH登錄docker swarm集群的master統一部署代碼

 

 

 

 

 

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

SpringBoot + maven + Jenkins + docker 實現docker集群一鍵自動化部署

 

 

整體可分為以下幾個步驟:

1,創建springboot項目

2,搭建docker私服

3,build鏡像並上傳到私服庫

4,搭建docker swarm集群

5,搭建jenkins並構建部署

 

演示系統使用centos7,jdk1.8

 

1,創建Springboot項目:

1.1 eclipse生成項目

eclipse上新建maven項目,pom.xml中引入相應的包,如下所示:

   <project xmlns="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>192.168.230.10:5000/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>

 

提示:docker-maven插件中可以修改imageName,其他配置可固定不變

 

1.2 在線生成項目

瀏覽器中輸入https://start.spring.io/,可以在線生成springboot項目結構,如下圖所示:

 

生成的初始pom.xml中會包含springboot項目所需的包,然后再添加docker-maven插件

 

1.3 插件生成項目

可以使用eclipse集成的springboot插件生成springboot項目,由於本人eclipse沒有安裝,所以這里不介紹,有興趣的小伙伴可以百度一下

 

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/:registry 192.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

 

 

設置搭建好的docker私服庫IP與端口

再次push剛才的鏡像,成功上傳

輸入: curl  http://192.168.230.10:5000/v2/_catalog 可以查詢私服庫信息,如下圖所示

 

learn就是私服庫存放鏡像的文件夾,再查詢這個文件夾下的鏡像,輸入:

curl  http://192.168.230.10:5000/v2/learn/tags/list

 

 

通過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-addr 192.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 –p 8000: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 192.168.230.10: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的初始化請參照百度,這里就不重復了

 

安裝用到的插件,進入系統管理-管理插件-可選插件,在搜索框中輸入要安裝的插件

 

Maven Integration plugin

 


這個插件是為了可以新建一個maven項目

Publish Over SSH

這個插件是為了jenkins構建完之后遠程登錄到docker swarm集群中的master機器統一部署

 

配置 SSH:

 

參照百度生成秘鑰的方式生成公鑰和私鑰,

http://blog.csdn.net/u010947098/article/details/61922969

 

 

 

 

 

然后我們生成一個maven項目,配置如圖所示:

 

 

 

 

 

 

Exec command的命令:

docker service rm mySwarm;

刪除舊的服務

docker rmi 192.168.230.10:5000/learn:mySwarm;

然后刪除舊的鏡像

docker service create --replicas 2 -p 8000:8000 --name mySwarm 192.168.230.10:5000/learn:mySwarm

新建新的服務

 

配置完之后點擊立即構建,第一次構建會下載很多包,需要一點時間,請耐心等待,最終如下圖所示:

成功build鏡像

 

然后push鏡像docker私服庫

 

構建完成后通過SSH登錄docker swarm集群的master統一部署代碼

 

 

 

 

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM