1. 程式人生 > >maven構建docker映象三部曲之三:推送到遠端倉庫(內網和阿里雲)

maven構建docker映象三部曲之三:推送到遠端倉庫(內網和阿里雲)

在上一章《maven構建docker映象三部曲之二:編碼和構建映象》的實戰中,我們將spring boot的web工程構建成docker映象並在本地啟動容器成功,今天我們把docker-maven-plugin外掛的推送功能也用上,這樣編譯、構建、推送都能一次性完成了;

原始碼和環境

本次實戰的java web工程原始碼和環境都沿用上一章的,原始碼我已經上傳到github上,地址是:[email protected]:zq2599/blog_demos.git,瀏覽器訪問地址是:https://github.com/zq2599/blog_demos,這裡面有多個工程,本次實戰用到的是mavendockerplugindemo,如下圖紅框所示:
image

把構建的映象推送到哪裡去

本次實戰有以下兩個地方可以存放映象,我們每個都要試試:
1. 內網中,自己搭建的docker私有倉庫;
2. 阿里雲的映象倉庫;

接下來我們分別推送到上述兩個倉庫,先推送到內網的私有倉庫吧。

如何搭建內網的私有倉庫

  1. 在內網搭建和使用私有倉庫的詳細步驟,請看《docker私有倉庫搭建與使用實戰》,就不在此贅述了;
  2. 用於編譯和構建映象的虛擬機器上,記得配置/etc/default/docker/lib/systemd/system/docker.service檔案,使docker服務可以在http協議下工作,否則無法推送到內網私有倉庫;

pom配置資訊

用SecureCRT登入虛擬機器,在工程的目錄下新建一個pom_3_inner_server.xml檔案,內容和pom_1_by_param.xml檔案的一模一樣,然後對pom_3_inner_server.xml檔案做下列修改:

  • 新增registryUrl節點,內容是私有倉庫地址和埠,如下:
<registryUrl>192.168.119.148:5000</registryUrl>
  • 新增pushImage節點,內容如下:
<pushImage>true</pushImage>
  • 修改imageName節點的內容,改為私有倉庫地址和埠,再加上映象id和TAG,如下:
<imageName>192.168.119.148:5000/${project.artifactId}:${project.version}</imageName>

執行以下命令開始構建:

mvn -f pom_3_inner_server.xml clean package -DskipTests docker:build

構建完畢後發現輸出了報錯資訊,如下:

[INFO] Building image 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT
Step 1/3 : FROM java:8u111-jdk
 ---> d23bdf5b1b1b
Step 2/3 : ADD /mavendockerplugindemo-0.0.1-SNAPSHOT.jar //
 ---> 634afbb47de5
Removing intermediate container 8c165fad6a2c
Step 3/3 : ENTRYPOINT java -jar /mavendockerplugindemo-0.0.1-SNAPSHOT.jar
 ---> Running in 1840b6345566
 ---> ff415c0f2d72
Removing intermediate container 1840b6345566
Successfully built ff415c0f2d72
[INFO] Built 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT
[INFO] Tagging 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT with 0.0.1-SNAPSHOT
[INFO] Pushing 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT
The push refers to a repository [192.168.119.148:5000/mavendockerplugindemo]
[WARNING] Failed to push 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT, retrying in 10 seconds (1/5).
[INFO] Pushing 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT
The push refers to a repository [192.168.119.148:5000/mavendockerplugindemo]
[WARNING] Failed to push 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT, retrying in 10 seconds (2/5).
[INFO] Pushing 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT
The push refers to a repository [192.168.119.148:5000/mavendockerplugindemo]
[WARNING] Failed to push 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT, retrying in 10 seconds (3/5).
[INFO] Pushing 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT
The push refers to a repository [192.168.119.148:5000/mavendockerplugindemo]
[WARNING] Failed to push 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT, retrying in 10 seconds (4/5).
[INFO] Pushing 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT
The push refers to a repository [192.168.119.148:5000/mavendockerplugindemo]
[WARNING] Failed to push 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT, retrying in 10 seconds (5/5).
[INFO] Pushing 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT
The push refers to a repository [192.168.119.148:5000/mavendockerplugindemo]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:00 min
[INFO] Finished at: 2017-12-28T17:26:46-08:00
[INFO] Final Memory: 32M/90M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal com.spotify:docker-maven-plugin:0.4.12:build (default-cli) on project mavendockerplugindemo: Exception caught: Put http://192.168.119.148:5000/v1/repositories/mavendockerplugindemo/: dial tcp 192.168.119.148:5000: getsockopt: connection refused -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

錯誤資訊中有這麼一句:Failed to push ……,看起來是連不上私有倉庫,登入到私有倉庫的機器上去看了以下,果然,docker容器沒有啟動呢…..

執行命令docker start docker-registry將私有倉庫的服務容器啟動,再回到構建服務的機器上,再執行一次構建命令,這次成功了,如下:

[INFO] Building image 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT
Step 1/3 : FROM java:8u111-jdk
 ---> d23bdf5b1b1b
Step 2/3 : ADD /mavendockerplugindemo-0.0.1-SNAPSHOT.jar //
 ---> a033c632d0b0
Removing intermediate container 1d702736fae4
Step 3/3 : ENTRYPOINT java -jar /mavendockerplugindemo-0.0.1-SNAPSHOT.jar
 ---> Running in c3e4a2a41936
 ---> 649774e8dc21
Removing intermediate container c3e4a2a41936
Successfully built 649774e8dc21
[INFO] Built 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT
[INFO] Tagging 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT with 0.0.1-SNAPSHOT
[INFO] Pushing 192.168.119.148:5000/mavendockerplugindemo:0.0.1-SNAPSHOT
The push refers to a repository [192.168.119.148:5000/mavendockerplugindemo]
7b4f222745df: Pushed 
35c20f26d188: Layer already exists 
c3fe59dd9556: Layer already exists 
6ed1a81ba5b6: Layer already exists 
a3483ce177ce: Layer already exists 
ce6c8756685b: Layer already exists 
30339f20ced0: Layer already exists 
0eb22bfb707d: Layer already exists 
a2ae92ffcd29: Layer already exists 
0.0.1-SNAPSHOT: digest: sha256:4c8d5489bcb99ec1c0884adfdeeb25e5706de8f940c406c5a560243681b01831 size: 2212
null: null 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 12.760 s
[INFO] Finished at: 2017-12-28T17:36:25-08:00
[INFO] Final Memory: 32M/88M
[INFO] ------------------------------------------------------------------------

在用於構建映象的虛擬機器和作為映象倉庫的虛擬機器上,分別執行,檢視私有倉庫的映象資訊(192.168.119.148是私有倉庫虛擬機器的IP),都能見到映象mavendockerplugindemo,如下圖:
這裡寫圖片描述

推送到內網私有倉庫的實戰已經完成,接下來我們試試推送到阿里雲映象倉庫吧;

註冊和登入阿里雲

使用阿里雲映象倉庫前,需要在阿里雲網站註冊一個賬號,請您自行完成註冊登入,此處不贅述了;

建立名稱空間和映象倉庫

  1. 在阿里雲首頁的”產品”選單下,找到”容器映象服務”,然後點選跳轉,如下圖:
    這裡寫圖片描述
  2. 新的頁面中,點選”管理控制檯”,如下圖:
    這裡寫圖片描述
  3. 在控制檯頁面中,按照下圖操作,建立一個名稱空間bolingcavalry:
    這裡寫圖片描述
  4. 在控制檯頁面中,按照下圖操作,選一個近的倉庫,再點選”建立映象倉庫”按鈕開始建立映象倉庫:
    這裡寫圖片描述
  5. 參考下圖的步驟填寫表單,建立一個倉庫:
    這裡寫圖片描述
  6. 如下圖,建立完畢後就能在列表頁面看見了,注意紅框所示,一定要選擇和建立時一樣的地區,否則在列表中看不見剛剛建立的倉庫:
    這裡寫圖片描述
  7. 從列表中我們可以看見,倉庫地址是 registry.cn-shenzhen.aliyuncs.com/bolingcavalry/mavendockerplugindemo,記下來後面會用到的;

修改maven的配置檔案

回到虛擬機器上,開啟檔案/opt/apache-maven-3.3.3/conf/settings.xml,找到<servers>節點,在裡面新增一個server節點,內容如下:

    <server>
      <!--maven的pom中可以根據這個id找到這個server節點的配置-->  
      <id>docker-aliyun</id>
      <!--這裡是在阿里雲註冊的賬號-->
      <username>[email protected]</username>
      <!--這裡是在阿里雲註冊的密碼-->
      <password>abcdef</password>
      <configuration>
            <!--這是在阿里雲註冊時填寫的郵箱-->
            <email>[email protected]</email>
      </configuration>
    </server>

請參照註釋的提示,將您在阿里雲上的賬號密碼都填寫到對應位置;

pom配置資訊

在java web工程的目錄下新建一個pom_4_ali_server.xml檔案,內容和pom_1_by_param.xml檔案的一模一樣,然後再對pom_4_ali_server.xml檔案做以下修改:

  • 阿里雲映象倉庫列表頁面中,我們建立的映象倉庫的地址是”registry.cn-shenzhen.aliyuncs.com/bolingcavalry/mavendockerplugindemo”,現在把這個字串拆成三部分,將前面兩部分作為兩個屬性放入pom檔案的<properties>節點中,屬性名分別是docker.repostorydocker.registry.name,此時properties節點的內容如下:
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <docker.repostory>registry.cn-shenzhen.aliyuncs.com</docker.repostory>
    <docker.registry.name>bolingcavalry</docker.registry.name>
</properties>
  • 新增serverId節點,內容是之前修改的maven配置檔案中,server節點的id,如下:
<serverId>docker-aliyun</serverId>
  • 新增registryUrl節點,內容是私有倉庫地址,如下:
<registryUrl>${docker.repostory}</registryUrl>
  • 新增pushImage節點,內容如下:
<pushImage>true</pushImage>
  • 修改imageName節點的內容,改為私有倉庫地址和埠,再加上映象id和TAG,如下:
${docker.repostory}/${docker.registry.name}/${project.artifactId}:${project.version}

構建並推送到阿里雲映象倉庫

執行以下命令開始構建:

mvn -f pom_4_ali_server.xml clean package -DskipTests docker:build

構建完成後的輸出資訊如下,表示推送成功了:

[INFO] Building image registry.cn-shenzhen.aliyuncs.com/bolingcavalry/mavendockerplugindemo:0.0.1-SNAPSHOT
Step 1/3 : FROM java:8u111-jdk
 ---> d23bdf5b1b1b
Step 2/3 : ADD /mavendockerplugindemo-0.0.1-SNAPSHOT.jar //
 ---> f912a6c9134c
Removing intermediate container a05fb50d6235
Step 3/3 : ENTRYPOINT java -jar /mavendockerplugindemo-0.0.1-SNAPSHOT.jar
 ---> Running in 1c71545bdd60
 ---> fa4eee94dae6
Removing intermediate container 1c71545bdd60
Successfully built fa4eee94dae6
[INFO] Built registry.cn-shenzhen.aliyuncs.com/bolingcavalry/mavendockerplugindemo:0.0.1-SNAPSHOT
[INFO] Tagging registry.cn-shenzhen.aliyuncs.com/bolingcavalry/mavendockerplugindemo:0.0.1-SNAPSHOT with 0.0.1-SNAPSHOT
[INFO] Pushing registry.cn-shenzhen.aliyuncs.com/bolingcavalry/mavendockerplugindemo:0.0.1-SNAPSHOT
The push refers to a repository [registry.cn-shenzhen.aliyuncs.com/bolingcavalry/mavendockerplugindemo]
1efab0de4a7d: Pushed 
35c20f26d188: Pushed 
c3fe59dd9556: Pushed 
6ed1a81ba5b6: Pushed 
a3483ce177ce: Pushed 
ce6c8756685b: Pushed 
30339f20ced0: Pushed 
0eb22bfb707d: Pushed 
a2ae92ffcd29: Pushed 
0.0.1-SNAPSHOT: digest: sha256:89062f267fe22df3acc5d6ca7405140162e43076aeda5f7584dbf80fcdc0c58b size: 2212
null: null 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:28 min
[INFO] Finished at: 2017-12-29T02:45:05-08:00
[INFO] Final Memory: 34M/83M
[INFO] ------------------------------------------------------------------------

在阿里雲網頁檢視

  1. 開啟阿里雲映象倉庫管理頁面,如下圖:
    這裡寫圖片描述
  2. 點選”映象版本”,在列表中可以看到該映象的版本,以及最後的上傳時間,和我們的構建結果都是一致的,如下圖:
    這裡寫圖片描述

下載並驗證映象

  1. 在虛擬機器上用docker rmi 映象名稱:映象版本命令將所有的映象刪除乾淨,如果有容器還未刪除,就要先刪除容器再刪除映象,檢視容器的命令是docker ps -a,刪除容器的命令是docker rm 容器名
  2. 如下圖,在管理頁面點選“基本資訊”,可以看見登入阿里雲映象倉庫和下載映象的命令,在虛擬機器上先執行登入命令,會要求輸入密碼,輸入後登入成功:
    這裡寫圖片描述
  3. 執行下載映象的命令,如下,將我們之前上傳的映象下載下來:
docker pull registry.cn-shenzhen.aliyuncs.com/bolingcavalry/mavendockerplugindemo:0.0.1-SNAPSHOT

輸出資訊如下,表示下載成功:

root@docker-app:/usr/local/work/mavendockerplugindemo# docker pull registry.cn-shenzhen.aliyuncs.com/bolingcavalry/mavendockerplugindemo:0.0.1-SNAPSHOT
0.0.1-SNAPSHOT: Pulling from bolingcavalry/mavendockerplugindemo
e12c678537ae: Already exists 
8d9ed335b7db: Already exists 
3318dd58ae60: Already exists 
624ba6156166: Already exists 
c7a02d193df7: Already exists 
813b62320378: Already exists 
81cf5426393a: Already exists 
0a2b7222259b: Already exists 
fadb940064b4: Pull complete 
Digest: sha256:89062f267fe22df3acc5d6ca7405140162e43076aeda5f7584dbf80fcdc0c58b
Status: Downloaded newer image for registry.cn-shenzhen.aliyuncs.com/bolingcavalry/mavendockerplugindemo:0.0.1-SNAPSHOT
  • 執行如下命令,用下載的映象建立一個容器:
docker run --name demo003 -p 8080:8080 registry.cn-shenzhen.aliyuncs.com/bolingcavalry/mavendockerplugindemo:0.0.1-SNAPSHOT

輸出資訊會提示啟動成功,這時候在當前電腦上開啟瀏覽器,輸入”http://192.168.119.155:8080/“,可以看見web工程的controller的返回資訊了,如下圖:
這裡寫圖片描述

結束

至此,maven構建docker映象的三部曲就全部結束了,希望對您熟悉和使用docker-maven-plugin外掛有所幫助,另外,本文中用到的pom_3_inner_server.xml和pom_4_ali_server.xml檔案,我已上傳到git上本次實戰的web工程中,地址是:[email protected]:zq2599/blog_demos.git,瀏覽器訪問地址是:https://github.com/zq2599/blog_demos,這裡面有多個工程,本次實戰用到的是mavendockerplugindemo,如下圖紅框所示:
image