<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          SpringCloud+Docker+Jenkins+GitLab+Maven實(shí)現(xiàn)自動(dòng)化構(gòu)建與部署實(shí)戰(zhàn)

          共 21415字,需瀏覽 43分鐘

           ·

          2021-06-25 05:36


          作者:寅務(wù)

          www.jianshu.com/p/bdb0642b7495

          1、前言與初衷

          本文章會(huì)涉及Docker常見命令基礎(chǔ)知識(shí)點(diǎn)結(jié)合不同場(chǎng)景實(shí)操一起使用。

          本文章會(huì)涉及結(jié)合工作過(guò)程中部署不同環(huán)境服務(wù)器的項(xiàng)目案例場(chǎng)景為初心進(jìn)行實(shí)際細(xì)講。

          本文章主要講述Docker、Jenkins、GitLab、Git、JDK、SpringBoot、Maven等技術(shù)結(jié)合實(shí)現(xiàn)自動(dòng)化運(yùn)維部署(DevOps)應(yīng)用工程,適合SpringCloud部署。

          初衷想法:在學(xué)習(xí)過(guò)程中遇到比較有趣的問(wèn)題、然而花了點(diǎn)心血和時(shí)間去整理,然而進(jìn)行梳理出來(lái)一份文章比較完整有知識(shí)體系的DevOps自動(dòng)化構(gòu)建與部署工程文章,技術(shù)知識(shí)內(nèi)容比較多,而且文章內(nèi)容較長(zhǎng),然而分了幾個(gè)章程來(lái)講述

          2、什么是DevOps?

          DevOps(Development和Operations的組合詞)是一組過(guò)程、方法與系統(tǒng)的統(tǒng)稱,用于促進(jìn)開發(fā)(應(yīng)用程序/軟件工程)、技術(shù)運(yùn)營(yíng)和質(zhì)量保障(QA)部門之間的溝通、協(xié)作與整合,它是一種重視“軟件開發(fā)人員(Dev)”和“IT運(yùn)維技術(shù)人員(Ops)”之間溝通合作的文化、運(yùn)動(dòng)或慣例。透過(guò)自動(dòng)化“軟件交付”和“架構(gòu)變更”的流程,來(lái)使得構(gòu)建、測(cè)試、發(fā)布軟件能夠更加地快捷、頻繁和可靠。

          它的出現(xiàn)是由于軟件行業(yè)日益清晰地認(rèn)識(shí)到:為了按時(shí)交付軟件產(chǎn)品和服務(wù),開發(fā)和運(yùn)營(yíng)工作必須緊密合作。

          3 涉及軟件環(huán)境搭建內(nèi)容

          • 如何在Centos7安裝JDK1.8-u121詳解
          • 如何在Centos7安裝Maven3.6.1詳解
          • 如何在Centos7安裝Git詳解
          • 如何在CentOS7與Git配置免密碼登陸詳解
          • 如何在Docker安裝GitLab詳解
          • 如何在Docker創(chuàng)建NetWork網(wǎng)絡(luò)詳解
          • 如何在Docker安裝Registry私服詳解
          • 如何在Docker安裝Jenkins詳解

          見附錄

          特別說(shuō)明

          1、如何使用Maven結(jié)合Docker把SpringBoot應(yīng)用編譯成可用的鏡像進(jìn)行部署。

          2、其中JDK和Maven是傳統(tǒng)方式進(jìn)行安裝,由于本人Centos操作系統(tǒng)是有其他軟件依賴它們,有時(shí)候傳統(tǒng)方式安裝軟件會(huì)更好,這里不過(guò)多的闡述。有些軟件在Docker安裝過(guò)程與使用過(guò)程并沒(méi)傳統(tǒng)方式的簡(jiǎn)單,比如:Jenkins。

          4、需要準(zhǔn)備的工作有哪些

          4.1 工程結(jié)構(gòu)

          • 打開IDEA或Eclipse新建一個(gè)SpringBoot的應(yīng)用.

          環(huán)境配置特別說(shuō)明

          注意事項(xiàng):其中Gitlab、Registry、Jenkins都安裝在node1機(jī)器上面,也就是node1作為主機(jī)(master),node2作為slave(從機(jī)或副機(jī)),機(jī)器名起有意義或能區(qū)分即可,推薦起master和slave,這里就不作過(guò)多的闡述,為了避免看文章有疑問(wèn),請(qǐng)看清單列表.

          4.2、SpringBoot配置和代碼詳解

          4.2.1工程的pom.xml配置
          <dependencies>
          <!-- Springboot依賴的Jar包 -->
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter</artifactId>
          </dependency>
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-web</artifactId>
          </dependency>

          <!-- Springboot熱部署jar-->
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-devtools</artifactId>
              <scope>runtime</scope>
              <optional>true</optional>
          </dependency>

          <!--yml配置文件提示插件-->
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-configuration-processor</artifactId>
              <optional>true</optional>
          </dependency>

          <!-- spring-boot測(cè)試jar -->
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-test</artifactId>
              <scope>test</scope>
          </dependency>

              </dependencies>
              <build>
                  <finalName>springboot</finalName>
                  <!-- 一定要聲明如下配置 打包xml 到Jar包 -->
                  <!-- <resources>
                      <resource>
                          <directory>src/main/java</directory>
                          是否替換資源中的屬性
                          <filtering>false</filtering>
                      </resource>
                  </resources>
                  <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
                   -->

                  <plugins>
                      <plugin>
                          <groupId>org.apache.maven.plugins</groupId>
                          <artifactId>maven-compiler-plugin</artifactId>
                          <!-- 默認(rèn)支持jdk1.8編譯 -->
                          <configuration>
                              <source>1.8</source>
                              <target>1.8</target>
                          </configuration>
                      </plugin>
                      <plugin>
                          <groupId>org.springframework.boot</groupId>
                          <artifactId>spring-boot-maven-plugin</artifactId>
                          <executions>
                              <execution>
                                  <goals>
                                      <goal>repackage</goal>
                                  </goals>
                              </execution>
                          </executions>
                      </plugin>
          <!--docke rmaven編譯插件-->
                      <plugin>
                          <groupId>com.spotify</groupId>
                          <artifactId>docker-maven-plugin</artifactId>
                          <version>0.4.12</version>
                          <configuration>
                              <dockerDirectory>${project.basedir}</dockerDirectory>
                              <resources>
                                  <resource>
                                      <targetPath>/</targetPath>
                                      <directory>${project.build.directory}</directory>
                                      <include>${project.build.finalName}.jar</include>
                                  </resource>
                              </resources>
                          </configuration>
                      </plugin>
                       <plugin>
                          <groupId>org.apache.maven.plugins</groupId>
                          <artifactId>maven-jar-plugin</artifactId>
                          <configuration>
                              <archive>
                                  <manifest>
                                      <mainClass>com.flong.SpringbootApplication</mainClass>
                                  </manifest>
                              </archive>
                          </configuration>
                      </plugin> 
                  </plugins>
          </build>
          4.2.2 no main manifest attribute錯(cuò)誤解決
          • 配置工程主入口
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-jar-plugin</artifactId>
              <configuration>
                  <archive>
                      <manifest>
                    <mainClass>com.flong.SpringbootApplication</mainClass>
                      </manifest>
                  </archive>
              </configuration>
          </plugin> 
          4.2.3 env環(huán)境變量文件
          • 用于設(shè)置環(huán)境動(dòng)態(tài)參數(shù),文件是以.env為格式
          JAVA_OPTS_DEFAULT=-Xmx512m
          4.2.4 Dockerfile打包工程鏡像細(xì)講
          • 以開發(fā)環(huán)境的Dockerfile為例,如果是測(cè)試環(huán)境則,把所有路徑包含springboot_dev改成springboot_test
          FROM frolvlad/alpine-oraclejdk8:slim
          MAINTAINER [email protected]
          RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
          RUN mkdir -p /home/devsoft/springboot_dev
          WORKDIR /home/devsoft/springboot_dev
          EXPOSE 7011
          ADD ./target/springboot.jar ./
          CMD java ${JAVA_OPTS_DEFAULT} -Djava.security.egd=file:/dev/./urandom -jar springboot.jar
          • 參數(shù)說(shuō)明
          • WORKDIR 工作目錄說(shuō)明進(jìn)入容器此時(shí)會(huì)有一個(gè).jar是在Dockerfile的ADD添加進(jìn)去
          docker exec -it 容器名稱或容器id /bin/sh 

          或要使用sh和bash要看COMMAND,-it

          docker exec -it 容器名稱或容器id/bin/bash
          4.2.5 build.sh文件shell腳本詳解

          注意點(diǎn)1:經(jīng)過(guò)測(cè)試動(dòng)態(tài)變量的【等號(hào)】不能有空格和tab鍵置位,否則獲取不了值,而且在shell腳本代碼里面不支持空格格式化,支持tab置位格式化。在終端(ssh軟件端)或Jenkins客戶端shell命令,『位置變量』的參數(shù)以空格隔開。

          如:sh build.sh 192.168.1.235 springboot 0.0.1 7011 /home/jenkins/workspace/springboot_dev

          $IMG_NAME:$IMG_VERSION這個(gè)IMG_VERSION版本(tag)參數(shù)不指定默認(rèn)latest

          注意點(diǎn)2:通常情況下Docker是默認(rèn)執(zhí)行Dockerfile,但是可以自定義后綴文件進(jìn)行編譯,前提必須要-f(force)強(qiáng)制指定文件進(jìn)行運(yùn)行

          #!/usr/bin/env bash
          # 動(dòng)態(tài)變量的【等號(hào)】不能有空格和tab鍵置位,否則獲取不了值,而且在shell腳本代碼里面不支持空格格式化,支持tab置位格式化。
          # 在終端(ssh軟件端)或Jenkins客戶端shell命令,參數(shù)以空格隔開。如:sh build.sh 192.168.1.235 springboot 0.0.1 7011 /home/jenkins/workspace/springboot_dev
          IMG_SERVER="$1"
          IMG_NAME="$2"
          IMG_VERSION="$3"
          IMG_PORT="$4"
          RUN_EVN="$5"
          IMG_PATH="$6"

          echo "服務(wù)地址:$IMG_SERVER"
          echo "工程鏡像名稱:$IMG_NAME"
          echo "工程版本號(hào):$IMG_VERSION"
          echo "工程端口:$IMG_PORT"
          echo "服務(wù)環(huán)境:$RUN_EVN"

          #私服訪問(wèn)url路徑和編譯之后鏡像文件存放到指定路徑固定,不動(dòng)態(tài)參數(shù)進(jìn)行處理傳值.
          REGISTRY_URL="192.168.1.235:5000"
          IMG_TAR_GZ_PATH="/home/img_tar_gz_path/"

          # 判斷動(dòng)態(tài)參數(shù)不為空字符串的時(shí)候才執(zhí)行下面操作
          if [ "$IMG_SERVER" != "" ] && [ "$IMG_NAME" != "" ] && [ "$IMG_VERSION" != "" ] && [ "$IMG_PORT" != "" ]; then
              
             echo " .......進(jìn)入刪除  Container & Images 操作 ......."
              # 清理虛懸鏡像,釋放磁盤空間
              #docker images|grep none|awk '{print $3 }'|xargs docker rmi

              # 獲取容器ID
              CONTAINER_ID=`docker ps -a | grep $IMG_NAME | awk '{ print $1 }'`

              # 獲取鏡像ID
              IMAGE_ID=`docker images | grep $IMG_NAME | awk '{ print $3 }'`

              # 判斷是否存在刪除開發(fā)容器
              if [[ "$CONTAINER_ID" != "" ]]; then
                  docker rm -f $CONTAINER_ID
              fi

              # 判斷是否存在刪除開發(fā)鏡像
              if [[ "$IMAGE_ID" != "" ]]; then
                  docker rmi -f $IMAGE_ID
              fi
              # $IMG_NAME:$IMG_VERSION 這個(gè)IMG_VERSION版本(tag)參數(shù)不指定默認(rèn)latest,通過(guò)不同參數(shù)執(zhí)行不同環(huán)境文件
              # -f 表示強(qiáng)制指定Dockerfile文件進(jìn)行編譯
              
              echo " .......進(jìn)入Building & Images 操作 ....... "
              
              #方法1、指定不同文件存放默認(rèn)的Dockerfile,使用-f進(jìn)行強(qiáng)制編譯
              #docker build -t $IMG_NAME:$IMG_VERSION -f $IMG_PATH"env/"$RUN_EVN/Dockerfile $IMG_PATH
              
              #方法2、跟據(jù)不同Dockerfile文件的后綴進(jìn)行編譯不同環(huán)境的文件
              docker build -t $IMG_NAME:$IMG_VERSION -f $IMG_PATH"env/"Dockerfile_$RUN_EVN $IMG_PATH
              
              
              # 將鏡像打一下標(biāo)簽,然后安照標(biāo)簽進(jìn)行推送到私服里面,標(biāo)簽名就以服務(wù)名即可
              docker tag $IMG_NAME:$IMG_VERSION $REGISTRY_URL/$IMG_NAME:$IMG_VERSION
              
              # 推鏡像到私服里面
              docker push $REGISTRY_URL/$IMG_NAME:$IMG_VERSION
              
              # 判斷是否存在文件夾
              if [ -d "$IMG_PATH" ];then
                   echo "已經(jīng)存在:"$IMG_PATH
              else
                  mkdir -p $IMG_PATH
              fi

              # 保存編譯之后鏡像文件存放到指定路徑
              docker save $IMG_NAME -o $IMG_TAR_GZ_PATH/$IMG_NAME.tar.gz
              
              echo " .......進(jìn)入Runing操作 ....."
              docker run -d --network default_network --restart=always --env-file=./.env  -e spring.profiles.active=$RUN_EVN --expose=$IMG_PORT --name=$IMG_NAME  -p $IMG_PORT:$IMG_PORT $IMG_NAME:$IMG_VERSION

              echo " .......Build & Run Finish Success~...."
          else
              echo " .......Illegal Command Operation ......."
          fi
          4.2.6 Docker (save、load、tag、push,pull)命令使用
          • 其中push,pull一個(gè)是推,一個(gè)是拉,在某種程度下,都是對(duì)在私服上面的鏡像進(jìn)行操作
          • docker save命令是保存編譯的tar.gz或tar壓縮文件,語(yǔ)法如:
          docker save 鏡像名 -o 路徑/鏡像名.tar.gz

          docker save 鏡像名 -o 路徑/鏡像名.tar

          docker load 命令是用于導(dǎo)入使用 docker save 命令導(dǎo)出的鏡像,此命令非常重要,由于有些客戶要求項(xiàng)目工程要求部署在內(nèi)網(wǎng),此時(shí)這個(gè)命令在無(wú)網(wǎng)絡(luò)的內(nèi)網(wǎng)情況下部署項(xiàng)目的時(shí)候就體現(xiàn)它重要的地位了.語(yǔ)法 docker load [OPTIONS],在加載的過(guò)程有點(diǎn)慢,因?yàn)槲募悬c(diǎn)大,其中顯示Loady Layer [======]輸出信息,證實(shí)鏡像是分層關(guān)系。

          docker load -i /home/img_tar_gz_path/springboot.tar.gz
          • 參數(shù)說(shuō)明
          • docker tagdocker push命令是一起結(jié)合使用,先tag后push,每個(gè)鏡像名和版本是以冒號(hào)區(qū)分,而docker pull根據(jù)情況使用.
          # 將鏡像打一下標(biāo)簽,然后安照標(biāo)簽進(jìn)行推送到私服里面,標(biāo)簽名就以服務(wù)名即可
          docker tag 鏡像名:版本號(hào) 私服路徑/鏡像名:版本號(hào)
          # 推鏡像到私服里面
          docker push私服路徑/鏡像名:版本號(hào)
          • 查看鏡像

          瀏覽器驗(yàn)證docker push推送上私服的鏡像

          4.2.7 虛懸鏡像
          • 在docker編譯不成功會(huì)或者是新版本覆蓋舊版本歸類為虛懸鏡像,生成這個(gè)個(gè)鏡像既沒(méi)有倉(cāng)庫(kù)名,也沒(méi)有標(biāo)簽,均為 <none>。一般來(lái)說(shuō),虛懸鏡像已經(jīng)失去了存在的價(jià)值,是可以隨意刪除的。
          4.2.8 不同環(huán)境的配置文件

          配置參數(shù)

          不同環(huán)境配置參數(shù)內(nèi)容

          server:
            port: 7011
          runEvn: '開發(fā)環(huán)境'
          server:
            port: 7011
          runEvn: '測(cè)試環(huán)境'
          4.2.9 Controller測(cè)試代碼
          @RestController
          public class SimpleController {
             //讀取配置動(dòng)態(tài)參數(shù)
              @Value("${runEvn}")
              private String runEvn;
              
              @GetMapping("/test")
              public String test() {
                  return "this spring boot " + runEvn +" date long " 
                 + System.currentTimeMillis();
              }
          }

          5、非多臺(tái)機(jī)器免密遠(yuǎn)程登錄&Jenkins部署詳解

          5.1 特別說(shuō)明

          • 以開發(fā)環(huán)境為例子進(jìn)行說(shuō)明
          • 開發(fā)環(huán)境部署目標(biāo)機(jī)器是與Jenkins機(jī)器同一臺(tái)機(jī)器,一般情況,Jenkins是單獨(dú)一臺(tái)機(jī)器,這里為了節(jié)省自身電腦內(nèi)存,故放在同一臺(tái)機(jī)器進(jìn)行演示與學(xué)習(xí)。

          5.2 新建maven工程

          • 點(diǎn)擊Jenkins的新建任務(wù)菜單

          5.3 參數(shù)化構(gòu)建過(guò)程說(shuō)明

          5.3.1添加參數(shù)
          5.3.2 參數(shù)說(shuō)明以開發(fā)環(huán)境為案例
          5.3.3 源碼管理
          5.3.4 Build編譯設(shè)置

          表示忽略測(cè)試單元類進(jìn)行編譯

          clean install -U -Dmaven.test.skip=true

          5.4 SSH Publishers設(shè)置

          • 其中SSH Server Name就是在http://jenkins地址:端口/jenkins/configure設(shè)置好進(jìn)行選擇
          • Transfer Set Source file傳輸文件的路徑,可以使用參數(shù)構(gòu)建的占位符${serverPath}獲取
          • Remote directory遠(yuǎn)程文件目錄,同理也參數(shù)構(gòu)建的占位符${serverPath}獲取
          • SSH Publishers shell腳本#!/bin/bash表示告訴終端使用bash解析器進(jìn)行執(zhí)行,而且只有第一行bash才有效。
          #!/bin/bash
          # 創(chuàng)建目錄
          mkdir -p ${serverPath}
          # 切換目錄
          cd ${serverPath}
          # 運(yùn)行腳本
          sh build.sh  $server  ${appName}  ${version}  ${port} ${env} ${serverPath}

          5.5 構(gòu)建與編譯部署項(xiàng)目

          • 截圖的構(gòu)建參數(shù)都是在參數(shù)化構(gòu)建過(guò)程配置的參數(shù)

          5.6 構(gòu)建&運(yùn)行&&部署結(jié)果

          • 構(gòu)建過(guò)程
          • 部署結(jié)果

          5、多臺(tái)機(jī)器免密遠(yuǎn)程登錄&Jenkins部署流程詳解

          6.1 特別說(shuō)明

          • 以測(cè)試環(huán)境為例子進(jìn)行說(shuō)明
          • 步驟流程幾乎一樣,唯一是在SSH Publishers 和源碼存放路徑不一樣,測(cè)試環(huán)境部署目標(biāo)機(jī)器是與Jenkins機(jī)器不同一臺(tái)機(jī)器

          6.2 新建maven工程

          • 點(diǎn)擊Jenkins的新建任務(wù)菜單

          6.3 參數(shù)化構(gòu)建過(guò)程說(shuō)明

          6.3.1添加參數(shù)
          6.3.2 參數(shù)說(shuō)明以測(cè)試環(huán)境為案例
          6.3.3 源碼管理
          6.3.4 Build編譯設(shè)置

          6.4 SSH Publishers設(shè)置

          1. 其中SSH Server Name就是在http://jenkins地址:端口/jenkins/configure設(shè)置好進(jìn)行選擇
          2. Transfer Set Source file傳輸文件的路徑,可以使用參數(shù)構(gòu)建的占位符${serverPath}獲取
          3. Remote directory遠(yuǎn)程文件目錄,同理也參數(shù)構(gòu)建的占位符${serverPath}獲取
          4. docker_server1表示與Jenkins部署同一個(gè)宿主機(jī),使用腳本有遠(yuǎn)程機(jī)器shell腳本操作免登陸操作。
          • docker_server1 Shell腳本#!/bin/bash表示告訴終端使用bash解析器進(jìn)行執(zhí)行,而且只有第一行bash才有效。
          #!/bin/bash
          #  打印信息
          echo "用戶名${userName}"
          echo "服務(wù)器${server}"
          echo "服務(wù)器目錄${serverPath}"
          #  遠(yuǎn)程創(chuàng)建存放遠(yuǎn)程上傳的代碼目錄路徑
          ssh $server  mkdir -p ${targetServerPath}
          #  遠(yuǎn)程拷貝代碼到目標(biāo)機(jī)器指定路徑
          scp -r ${serverPath}/  ${userName}@${server}:${targetServerPath}
          • docker_server2表示要部署那臺(tái)目標(biāo)機(jī)器,所以它的腳本跟docker_server1不一樣.
          • docker_server2 Shell腳本
          #!/bin/bash
          # 切換文件目錄
          cd ${serverPath}
          # 執(zhí)行腳本
          sh build.sh ${server}  ${appName}  ${version}  ${port}  ${env} ${serverPath}

          6.5 構(gòu)建與編譯部署項(xiàng)目

          • 截圖的構(gòu)建參數(shù)都是在參數(shù)化構(gòu)建過(guò)程配置的參數(shù)

          6.6 構(gòu)建&運(yùn)行&部署結(jié)果

          • 構(gòu)建過(guò)程
          • 部署結(jié)果

          7、總結(jié)&建議&學(xué)習(xí)

          7.1總結(jié)與建議

          1、此文章僅供提供參考學(xué)習(xí)指引,如需要系統(tǒng)得學(xué)習(xí)可以根據(jù)自身找資料去學(xué)習(xí)。

          2、以上問(wèn)題都是根據(jù)個(gè)人實(shí)際學(xué)習(xí)過(guò)程中遇到的問(wèn)題進(jìn)行一個(gè)一個(gè)問(wèn)題進(jìn)行梳理與總結(jié)整理,除了技術(shù)問(wèn)題查很多網(wǎng)上資料通過(guò)進(jìn)行學(xué)習(xí)之后整理與分享。

          3、在學(xué)習(xí)過(guò)程中也遇到很多困難和疑點(diǎn),如有問(wèn)題或誤點(diǎn),望各位老司機(jī)多多指出或者提出建議。本人會(huì)采納各種好建議和正確方式不斷完善現(xiàn)況,人在成長(zhǎng)過(guò)程中的需要優(yōu)質(zhì)的養(yǎng)料。

          4、當(dāng)遇到問(wèn)題的時(shí)候建議多問(wèn)『谷歌 、必應(yīng)、stackoverflow、度娘』這些大神。

          5、建議看官方手冊(cè)更權(quán)威,由于隨著技術(shù)的發(fā)展與迭代,通常官方的文檔更新較快,國(guó)內(nèi)的網(wǎng)站資料更新較慢。

          6、計(jì)算機(jī)是一門『做中學(xué)』的學(xué)科,不是會(huì)了再去做,而是做了才會(huì)。多練,常言道熟能生巧。

          7、建議學(xué)什么技術(shù)『先Know how,再Know Why』,意思就說(shuō)先入門,搞一個(gè)HelloWorld,再深究的意思。

          8、希望此文章能幫助你更好了解什么(DevOps)是自動(dòng)化構(gòu)建鏡像與部署,如何在Docker+Jenkins+GitLab+Maven+SpringBoot&SpringCloud自動(dòng)構(gòu)建鏡像與部署服務(wù)應(yīng)用,整個(gè)學(xué)習(xí)流程與搭建會(huì)有點(diǎn)小曲折,并不會(huì)那么順利,也希望你看了此文章或者通過(guò)找資料進(jìn)行親身經(jīng)歷學(xué)習(xí)效果會(huì)更好。另外,關(guān)注Java知音公眾號(hào),回復(fù)“后端面試”,送你一份面試題寶典!

          7.2 學(xué)習(xí)&參考文章

          • https://docs.docker.com/engine/reference/commandline/docker/
          • https://yeasy.gitbooks.io/docker_practice/
          • https://github.com/spotify/docker-maven-plugin
          • https://dmp.fabric8.io/
          • https://github.com/jilongliang/springboot
          • https://www.cnblogs.com/kakaln/p/7872873.html
          • https://www.cnblogs.com/lucoo/p/10209892.html

          附錄

          • www.jianshu.com/p/dfaaedeb6817
          • www.jianshu.com/p/299eeef785f0
          • www.jianshu.com/p/a22577232977
          • www.jianshu.com/p/e4946edce9a4
          • www.jianshu.com/p/0bc9b4755082
          • www.jianshu.com/p/9784d63eff23
          • www.jianshu.com/p/7827e40aaa71
          • www.jianshu.com/p/72d05e43a8f3



          --  end  --


          喜歡就三連



          點(diǎn)擊"閱讀原文"可跳轉(zhuǎn)至我的博客。




          關(guān)注 Stephen,一起學(xué)習(xí),一起成長(zhǎng)。


          瀏覽 62
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  操综合| 久草大 | 精品网站999www | 日本爱爱高清视频 | 婷婷五月天综合色 |