架設自己的 Docker Registry
使用的環境
系統與使用工具 |
---|
Centos 7.6 |
Docker 1.13.1 |
一、Docker Registry 是什麼?
- 開放原始碼的軟體
- 提供存放 Docker Image 的空間,可與他人共用
- 可以分為公開或私人的 Registry
二、Docker Registry v.s. Docker Distribution
Docker Registry 1.0 - Docker Registry 專案
Docker Registry 2.0 - Docker Distribution 專案
Docker Distribution 專案取代並增強 Docker Registry 專案,同時也朝向更完善且有彈性的 Docker Image 整合管理工具。
1. Docker Distribution 專案新增的元件
- 函式庫:原本由 python 開發,現在改用 golang
- 規範:相關規範都可以在 Docker Distribution 的 Github Repo 的 docs/spec 資料夾找到
- 文件:docs 資料夾裡有 docs.docker.com 和 Docker Distribution 相關的說明文件
2. Docker Distribution 專案功能的增益項目
- 更快的
docker push
和docker pull
執行速度 - 改善並提升 Docker Registry 的整體運作效能
- 簡化 Docker Registry 部署方式
- 提供可插拔的儲存庫後端,可自行選擇上傳後的 Docker Image 儲存方式和位置,可與多種雲端儲存服務整合(AWS S3…等等)
- 提供 webhook 的通知機制
三、Docker Hub 和 Docker Cloud
Docker Hub 是 Docker 官方提供的免費服務,主要用途是提供 Docker Image 的儲存庫。
docker search
和 docker pull
所存取的 Docker Registry 就是 Docker Hub。
Docker Cloud 除了利用 Docker Hub 的儲存庫功能,主要用途是提供 Docker 化應用系統(Dockerized application)的完整架構與自動化服務。
Docker 化(Dockerized):把應用程式 Docker 化,把程式跟環境包成一個 image,部署的時候就直接使用這個 image 不需要額外安裝其他東西。
如果所開發的應用系統已經 Docker 化或準備 Docker 化,且運行在雲端運算環境,那 Docker Cloud 就可以協助自動化和加速整個應用系統在建版、測試、部署和節點管理上的工作。
Docker Hub 和 Docker Cloud 的帳號是共用的,不需要分別註冊,且可以直接在 Docker Cloud 中使用上傳到 Docker Hub 的 Docker Image。
四、為何不用 Docker Hub 就好?
Docker Hub 是免費且公開的服務,但 Docker Image 的散佈和部署會遇到機密敏感資料與安全考量,以及使用環境的不可用性問題。
- 機密敏感性的安全問題:Docker Image 可能包含程式碼或不適宜公開的環境設定資訊
- 公司或組織的環境問題:不同環境有不同考量,譬如開發環境、整合測試、使用者驗證環境、內外網連線以及儲存管理部署 Docker Image 的需求,就會需要在公司內架設專用的 Docker Registry
五、架設 Docker Registry
1. 下載及啟動 Docker Registry 的 Docker Image
架設 Docker Registry 就是啟用一個 Docker Registry 的 Docker Container。
# -p 5000:將主機的 5000 port mapping 到 container 的 5000 port
$ docker pull registry:2
$ docker run -d -p 5000:5000 --name registry registry:2
也可以用 -v
掛載資料卷,因為如果 Docker Registry 的資料是放在 Container 裡面,刪掉 Container 時裡面的資料就會跟著不見,所以需要使用 –v
將主機的檔案路徑 mapping 到 Container 裡面的檔案路徑,這樣就算 Docker Container 被刪除, Docker Registry 的 Image 資料還會存在。
$ docker run -d -p 5000:5000 -v /usr/local/docker/registry:/var/lib/registry --name registry registry:2
2. 用指令或瀏覽器確認 Docker Registry 是否啟動成功
也可以檢查版本是否為 V2,如果傳回「{ }」,就表示 Docker Registry 已經成功運作。
$ curl -LX GET 127.0.0.1:5000/v2
{}
也可以直接用瀏覽器開啟,如果正常啟動一樣會看到「{}」。
http://127.0.0.1:5000/v2
如果不是在架設 Docker Registry 的電腦上執行,可以把 IP 位址換成實際的位址: http://x.x.x.x:5000/v2/
六、將 Docker Image 上傳到 Docker Registry
以下步驟先用 nginx 的 Docker Image 當作範例。
1. 標記 Docker Image
$ docker tag nginx 127.0.0.1:5000/nginx_local
# 如果不是在架設 Docker Registry 的電腦上執行,可以把 IP 位址換成實際的位址
$ docker tag nginx x.x.x.x:5000/nginx_local
# 查看標記後的 Image
$ docker images
2. 將 Docker Image push 到 Docker Registry Server
$ docker push 127.0.0.1:5000/nginx_local
在這邊遇到問題,所以沒有成功將 Docker Image Push 到 Docker Registry 上。
這個錯誤訊息主要是因為安全性上的問題,需要修改 client 端的 Docker 設定。
insecure-registries
:insecure 的意思是非安全性,所以如果是使用 http 協定的 docker registry 就需要設定此參數。
$ vim /etc/docker/daemon.json
{
"insecure-registries": ["x.x.x.x:5000"]
}
重新啟動 Docker,並重新 push docker image。
$ systemctl restart docker
$ docker push 127.0.0.1:5000/nginx_local
用瀏覽器開啟查詢:
http://127.0.0.1:5000/v2/_catalog
http://x.x.x.x:5000/v2/_catalog
如果要下載剛剛上傳的 nginx_local,就用 docker pull
抓下來。
$ docker pull 127.0.0.1:5000/nginx_local
$ docker pull x.x.x.x:5000/nginx_local
參考資料
- Docker 這樣學才有趣:從入門,到玩直播、挖礦