docker私服registry管理鏡像

前言

   首先試想這樣一個場景:當在本身的機器上(docker中)構建了mysql鏡像,eureka鏡像等等微服務鏡像,這些鏡像有可能須要放到其餘的機器上docker環境中去運行,實行分佈式架構部署。但如何把這些鏡像共享到其餘機器上去呢?可能不少小夥伴想到的是使用docker 的save和load命令或docker export和import命令。除此以外,還有更好的解決方案,就是這章要講的使用registry這個工具。使用registry能夠很方便的在團隊內部,或者公司內部,在不一樣的linux主機上分享鏡像。html

registry的做用就是共享鏡像。java

1、使用docker命令導入導出鏡像

在講使用registry私服共享鏡像以前,先講如何使用docker命令共享鏡像,確定是由於使用這些命令在某些狀況下有侷限性。mysql

使用docker命令導入導出容器有兩種方式:linux

一種是使用save和load命令,另外一種是使用export和import命令。須要注意的是這兩種方法不可混用。sql

#使用docker save和load命令 docker save ubuntu:load>root/ubuntu.tar docker load<ubuntu.tar # 使用docker export和import命令 docker export 98ca35> ubuntu.tar
cat ubuntu.tar | sudo docker import - ununtu:import

可點擊下面四個命令,進入官網查看對該命令的詳細介紹,這裏就不一一展開。docker

docker savedocker loaddocker exportdocker importjson

使用docker命令進行導入和導出的侷限性:ubuntu

  • 不知道對方是使用docker save仍是docker export生成的tar文件
  • 當鏡像更新比較頻繁時(如在測試階段,集成測試時),須要頻繁的去生成tar文件,並進行傳輸。若是是隻傳給一我的,實在要忍,或許你能忍,若是是須要對多我的傳輸,頻繁生成tar文件,而且有多個版本時,你還能忍嗎?

有沒有更好的解決方案?固然有,那就是這章的主角,docker私服Registry。瀏覽器

2、Docker私服Registry安裝

# regisry鏡像下載 $ sudo docker pull registry c87736221ed0: Pull complete 1cc8e0bb44df: Pull complete 54d33bcb37f5: Pull complete e8afc091c171: Pull complete b4541f6d3db6: Pull complete Digest: sha256:3b00e5438ebd8835bcfa7bf5246445a6b57b9a50473e89c02ecc8e575be3ebb5 Status: Downloaded newer image for registry:latest # 安裝並運行regisry,端口映射爲5000 $ sudo docker run -d --name=registry -p 5000:5000 registry 72ceb5dc167ea9a50c92dbf46f8b06d5ecd5222377d440174e4f4f7a7da9049d

經過瀏覽器訪問registry的入口,http://192.168.31.181:5000/v2/_catalog,能夠看到返回的repositories的結果中是空的,也就是docker私服registry中,並無私服鏡像。服務器

3、修改docker配置,讓docker信任registry地址

已經安裝好了registry,接着就是把docker中的鏡像,傳到regisry。可是,因爲docker是沒有對registry開放權限,因此須要修改配置,讓docker信任regisry。

修改/etc/docker/daemon.json文件,添加:"insecure-registies":["192.168.31.181:5000"]。因爲docker和registry是在同一臺主機中,因此這裏的registry地址也是本機地址。若是是要往別的主機的registry中上傳鏡像,可加入其它主機的ip地址。添加以後重啓docker,這時docker就信任regisry地址了。

$ sudo vi /etc/docker/daemon.json { # ustc的加速源 "registry-mirrors": ["https://nrbewqda.mirror.aliyuncs.com"],#因爲該文件是個json格式的文件,因此須要先在這行最後面添加一個, # 讓docker信任192.168.31.181:5000registry私服地址 "insecure-registries":["192.168.31.181:5000"] } # 重啓docker,若是docker中服務較多,重啓操做,可能須要好久 $ sudo systemctl restart docker

4、上傳鏡像到regisry

上傳鏡像到regisry有兩種方式:

  • 手動上傳
  • 利用DockerMaven插件自動上傳

5、手動上傳鏡像到私服Registry

上傳鏡像到registry命令:docker tag 本地鏡像REPOSITORY名稱 registry地址/registry中的名稱

$ sudo docker tag eureka 192.168.31.181:5000/eureka $ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE ... 192.168.31.181:5000/eureka   latest              9b410097b49e        44 hours ago 645MB eureka latest 9b410097b49e 44 hours ago 645MB ...

命令詳解:

    docker tag : 給鏡像打標籤

    eureka :本機docker本地倉庫中的一個REPOSITORY名爲eureka的鏡像

    192.168.31.181:5000/eureka :registry私服地址/私服地址中該鏡像的名稱爲eureka

在上面經過docker images的輸出結果能夠看到,能夠看到多了一個REPOSITORY名爲192.168.31.181:5000/eureka的鏡像,並且該鏡像的IMAGE ID以及其餘,和REPOSTIRY名爲eureka的鏡像的IMAGE ID以及其餘都是如出一轍的。代表該兩個鏡像是同樣的。

而後經過docker push命令上傳剛剛的192.168.31.181:5000/eureka鏡像到私服registry,出現以下結果,表示已經上傳了該鏡像到私服registry中。

$ sudo docker push 192.168.31.181:5000/eureka The push refers to repository [192.168.31.181:5000/eureka] 0fd51de780a4: Pushed c302e69bdee3: Pushed dd836de89ae0: Pushed d69483a6face: Pushed latest: digest: sha256:6ddce0d73923b3a6efcf5892f239c48c8197890892b2cbeb9b1f37d10fb070fa size: 1161

========================================

提示:

     若是運行上面的命令報connect:connection refused錯誤,那是由於剛重啓了registry,而regisry是安裝在docker中的,重啓docker以後,registry是出來中止狀態的,須要重啓registry。重啓registry的命令爲:

$ sudo docker start registry

而後再執行上面的push命令。

========================================

如何確認192.168.31.181:5000/eureka鏡像是否上傳到了私服registry中呢?

可經過瀏覽器訪問私服registry的入口地址:http://192.168.31.181:5000/v2/_catalog

爲何私服registry中的名稱是eureka?還記得上面寫的docker tag命令嗎?

6、 利用DockerMaven插件自動鏡像上傳到私服Registry

手動上傳鏡像到私服registry,有個前提,那就是須要上傳的鏡像(經過docker tag命令以前的鏡像)必須是在docker的本地倉庫(也就是經過docker images命令中能夠查看到)。

若是在docker的本地倉庫中尚未鏡像,那麼手動上傳鏡像到私服registry,須要作兩步,第一步:打包微服務項目並上傳到docker本地倉庫,並生成鏡像;第二步:經過docker tag命令和docker push命令上傳鏡像到私服registry。其實,這不是兩步,而是四五步。

1.爲了演示自動打包項目和上傳鏡像,須要先刪除正在運行的鏡像,實際操做中可省略此步

因爲須要演示利用DockerMaven插件自動打包項目、自動生成鏡像和上傳到私服,因此須要刪除掉某個正在運行的項目鏡像。

以zuul鏡像爲例,來說解如何刪除zuul鏡像

# 查看全部zuul容器(運行中的和非運行中的) $ sudo docker ps -a | grep zuul a959a9465e7c zuul "/.r/r java -jar /ap…"   8 hours ago   Exited (143) About an hour ago   r-microservice-zuul-1-c8c7c48d # 能夠看到zuul的STATUS爲Exited表示已是中止狀態,若是STATUS爲UP,則表示是運行狀態,須要先中止 # 中止運行中的zuul容器,a959a9465e7c爲zuul的CONTAINER ID # 若是有多個運行中的zuul容器,可在stop命令後面跟上多個CONTAINER ID,中間以空格隔開 $ sudo docker stop a959a9465e7c a959a9465e7c # 刪除zuul容器,若是有多個zuul容器,可在rm命令後面跟上多個CONTAINER ID,中間以空格隔開 $ sudo docker rm a959a9465e7c a959a9465e7c # 查看zuul鏡像,鏡像只可能有一個 $ sudo docker images | grep zuul zuul latest ffed513f7188 42 hours ago 642MB # 刪除zuul鏡像 $ sudo docker rmi zuul Untagged: zuul:latest Deleted: sha256:ffed513f7188562d2ee9544ff369ebe0472977295ea5ba83a32261d45f98e517 Deleted: sha256:eee67d5f43adf92a58cc0cad84a1e5f02f9c962e8b8ddfc9fc68275c4af12305 Deleted: sha256:6fc9d1be85a095edb7342f99a57669dab11e82dbb5b913f1f1a081ac501112ea

2.利用DockerMaven插件自動上傳鏡像到Registry

下面就講利用DockerMaven插件,一步搞定項目的打包、上傳到linux系統、生成docker鏡像,執行docker tag和push到私服registry。在docker微服務部署之:5、利用DockerMaven插件自動構建鏡像中,已經講了利用DockerMaven插件自動構建鏡像。

方法一

首先,須要修改demo_zuul項目的pom.xml文件,將configuration的imageName標籤中鏡像名前面加上私服registry的地址192.168.31.181:5000/便可。

... <configuration>               
   <!-- 下面爲這次修改的地方,在原來的zuul前,添加了192.168.31.181:5000/ -->
  <imageName>192.168.31.181:5000/zuul</imageName>
   <!-- 上面爲這次修改的地方 -->
    <baseImage>jdk1.8</baseImage> ...

而後點擊idea左小角的Terminal窗口,把demo_zuul項目,拖動到該窗口(或者輸入 cd demo_zuul),而後執行mvn clean package docker:build -DpushImage

命令詳解:

     cd demo_zuul :在當前的目錄....\demo_parent,進入子目錄(zuul項目的目錄)demo_zuul

     mvn clean package :將demo_zuul項目打成jar包

     docker:build :將jar包上傳到linux主機,並經過Dockerfile配置生成鏡像到docker的本地倉庫

     -D :表明增長一個參數

    pushImage :參數名爲pushImage,即爲同時將本地倉庫中的zuul鏡像,上傳到私服registry(192.168.31.181:5000),並命名私服registry中的鏡像名爲pom.xml中imageName標籤中的zuul

經過docker images名稱查看鏡像

[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE 192.168.31.181:5000/zuul     latest              09449796276f        3 minutes ago       642MB

 

刷新registry

方法二

原有demo_zuul項目中的pom.xml文件不動,複製該pom.xml文件,重命名爲一個pom_registry.xml的pom文件。修改pom_registry.xml文件中的內容:

... <configuration>
    <registryUrl>192.168.31.181:5000</registryUrl>
     <pushImage>true</pushImage>
     <!-- article的名稱爲demo_zuul,若是鏡像名不是用zuul,而是用demo_zuul,可修改imageName的內容爲:192.168.31.181:5000/${project.artifactId} <imageName>192.168.31.181:5000/zuul</imageName>
     <baseImage>jdk1.8</baseImage> ...

 

 而後點擊idea左小角的Terminal窗口,把demo_zuul項目,拖動到該窗口(或者輸入 cd demo_zuul),而後執行mvn -f pom_registry.xml clean package docker:build

 

經過兩個pom.xml文件,當只須要把鏡像放到本地倉庫時,經過mvn clean package docker:build執行便可。而須要把鏡像上傳到私服時,經過mvn -f pom_registry.xml clean package docker:build便可。

 

寫給本身:有待完善的地方:

  • 把該篇文章分爲兩個文章:一是把構建私服,弄成兩臺服務器,並顯示如何從私服中下載鏡像
  • 把利用DockerMaven自動構建鏡像,演示在一個開源項目中修改pom文件,並自動上傳到私服。
相關文章
相關標籤/搜索