1. 程式人生 > >Docker Registry 安裝和使用

Docker Registry 安裝和使用

token 掛載 mariadb 測試 授權 認證方式 就是 下載速度 style

前言

Docker Hub公共鏡像市場

目前Docker官方維護了一個公共鏡像倉庫https://hub.docker.com,其中已經包括超過15000的鏡像。大部分鏡像需求,都可以通過在Docker Hub中直接下載鏡像來實現。

Docker Registry私有倉庫

公共倉庫有很多鏡像,但下載速度就那樣,而且公共鏡像缺乏個性化和實用性,畢竟每個公司得項目需求不一樣。這樣就可以自建一個Docker Registry。優點很明顯,自建倉庫很多都是局域網內嗎,上傳下載速度很快,安全性高。

Docker Registry有三個角色,分別是index、registry和registry client。

角色 1 -- Index

index負責並維護有關用戶帳戶、鏡像的校驗以及公共命名空間的信息。它使用以下組件維護這些信息:

  • Web UI
  • 元數據存儲
  • 認證服務
  • 符號化

角色 2 --Registry

registry是鏡像和圖表的倉庫。然而,它沒有一個本地數據庫,也不提供用戶的身份認證,由S3、雲文件和本地文件系統提供數據庫支持。此外,通過Index Auth service的Token方式進行身份認證。

角色 3 --Registry Client

Docker充當registry客戶端來負責維護推送和拉取的任務,以及客戶端的授權。

實驗環境:

docker registry:192.168.1.201

docker clinent:192.168.1.200

首先保證兩臺宿主機上都已安裝docker

技術分享圖片

安裝

1:docker hub 公共鏡像中有 registry 的鏡像,直接從docker hub拉取。此操作在192.168.1.201上執行

1 mkdir /registry
2 docker run -p 5000:5000  --restart=always --name registry -v /registry/:/var/lib/registry -d registry

註:registry容器啟動時,會在容器內/var/lib/下面創建一個registry目錄,用於存儲作為私有倉庫接受docker client 上傳的鏡像。-v:將宿主機/registry/目錄掛載到容器內/var/lib/registry目錄。

--restart 容器重啟方式

  • no,默認策略,在容器退出時不重啟容器
  • on-failure,在容器非正常退出時(退出狀態非0),才會重啟容器
  •   on-failure:3,在容器非正常退出時重啟容器,最多重啟3次
  • always,在容器退出時總是重啟容器
  • unless-stopped,在容器退出時總是重啟容器,但是不考慮在Docker守護進程啟動時就已經停止了的容器

2:驗證私有倉庫是否搭建成功,使用瀏覽器訪問192.168.1.201:5000/v2/

技術分享圖片

界面顯示{},表示docker registry搭建成功

使用

實驗目的:將上文檔中的wordpress項目上傳至私有倉庫,在192.168.1.201中運行。

上篇文檔中使用docker-compose創建了兩個容器mariadb和wordpress ,宿主機為192.168.1.200,這裏使用這兩個容器作為實驗對象。

技術分享圖片

1:首先將兩臺實驗機hosts解析。

1 cat >>/etc/hosts <<EOF
2 192.168.1.201 hub.com
3 EOF

註:registry和client都要解析。

2:添加認證方式。

docker registry 老版本可以使用http認證,但新版本很早就取消,不提供認證,但是又需要https認證才能實現上傳和下載。可以借助nginx ssl 認證。這裏先使用強制使用http方式認證。

 cat >>/etc/docker/daemon.json<<EOF
 {
     "registry-mirrors": [
         "http://68cdf6cf.m.daocloud.io"
     ],
     "insecure-registries":["Registry:81"]
 }
 EOF

註:registry和client都要配置,配置完後需要重啟docker,再啟動registry。

技術分享圖片

3:提交鏡像。

docker鏡像命名格式為:提交者/鏡像名:版本號

例如:Danny/wordpress:1.0  表示這個鏡像由Danny用戶創建,如果沒有用戶名,默認為Docker hub 官方創建,名稱為wordpress,版本號為1.0。如果沒有版本號,默認為最新版。 

提交用戶必須和私有倉庫IP:port,可以做hosts解析,不然會提交失敗。

例如:你的倉庫ip為192.168.1.201,registry映射到宿主機上的端口為5000,鏡像名為nginx,你的client提交鏡像須為:192.168.1.201:5000/nginx

現在將已存儲數據的wordpress項目提交為hub.com用戶的鏡像。

技術分享圖片

現有wordpress項目mariadb數據庫又數據:用戶名,密碼,頁面等等數據。

1:查看正在運行的容器

技術分享圖片

2:提交當前運行項目為新的鏡像。

docker commit wordpress_wordpress_1 hub.com:5000/wordpress:1.0
docker commit wordpress_db_1 hub.com:5000/db:1.0

技術分享圖片

3:上傳鏡像到私有倉庫

docker push hub.com:5000/db:1.0
docker push hub.com:5000/wordpress:1.0

技術分享圖片

4:查看私有倉庫鏡像,用瀏覽器訪問http://192.168.1.201:5000/v2/_catalog

技術分享圖片

可以看到有db,wordpress兩個鏡像。

5:從私有倉庫拉取鏡像並啟動容器,這裏我們還是使用docker-compose啟動容器。詳情請看上一篇文章。

docker-compose配置文件

wordpress:
  image:
      hub.com:5000/wordpress:1.0
  links:
    - db:mysql
  ports:
    - 80:80
db:
  image:
      hub.com:5000/db:1.0
  environment:
     MYSQL_ROOT_PASSWORD: 123456
  volumes:
    - /docker/db/:/var/lib/mysql

技術分享圖片

6:測試是否下載並啟動成功。

技術分享圖片

問題來了

我是用的鏡像是有數據的鏡像commit後的鏡像,按理界面因該是我配置好的wordpress界面。現在還是沒有數據,說明commit沒有把mariadb的數據提交到新的鏡像內。

為此我去查了文檔:

發現docker默認使用的是文件系統。特征:它可以繞過默認的聯合文件系統,而以正常的文件或者目錄的形式存在於宿主機上。鏈接:https://docs.docker.com/storage/volumes/

然後我又去查看了docker commit 官方文檔,發現提交操作將不包括容器內安裝的卷中包含的任何數據。鏈接:https://docs.docker.com/engine/reference/commandline/commit/#options

就只有一種可能,就是容器內的mariadb數據存儲的目錄是以掛載卷方式掛載的。

通過 docker inspect wordpress_db_1 查看到"Mounts"中有如下信息:

技術分享圖片

我將宿主機/docker-compose/mysql/目錄掛載到容器內的/var/lib/mysql,存儲數據全部寫到掛載宿主機目錄下。

如果我啟動不掛載目錄的話,他還是將宿主機的目錄掛載到容器內用於保存數據存儲目錄中。

技術分享圖片

到這裏,原因知道了。

192.168.1.200數據庫是掛載到宿主機上的,我把它拷到192.168.1.201掛載的目錄上應該就行了吧。

192.168.1.201:關閉wordpress和mariadb

技術分享圖片

192.168.1.200:將數據庫掛載目錄中文件scp到192.168.1.201數據庫掛載目錄。

技術分享圖片

然後啟動192.168.1.201的wordpress項目

技術分享圖片

測試

技術分享圖片

Docker Registry 安裝和使用