Docker Registry 安裝和使用

 

前言

Docker Hub公共鏡像市場

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

Docker Registry私有倉庫

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

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

角色 1 -- Index sql

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

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

角色 2 --Registry數據庫

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

角色 3 --Registry Client瀏覽器

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

實驗環境:

docker registry:192.168.1.201less

docker clinent:192.168.1.200wordpress

首先保證兩臺宿主機上都已安裝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項目

測試

相關文章
相關標籤/搜索