Docker Registry 安裝和使用
前言
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 安裝和使用