使用 Docker 建立 Docker 私有儲存庫(Docker Registry)

平時製作完 docker image,如果要讓其他裝置方便使用,除了將 docker images 匯出成檔案以外,最方便的方式就是上傳到官方的 image 儲存庫,這樣就可以直接使用 docker pull 指令將 image 下載下來使用。

但是在官方的儲存庫中,免費版有許多限制,所以如果環境允許,建立自己的私有 docker 儲存庫是一個很棒的選擇。

既然都使用 docker 了,我們可以使用 docker 快速建立私有儲存庫,只要一行指令:
    
docker run -d -p 5000:5000 --restart=always -v /data/docker-registry:/var/lib/registry --name registry registry:2
    

上面指令的意思在於將容器內部的 5000 連接埠映射到外部,指定容器會自動重啟,將檔案卦載到本機的 /data/docker-registry 路徑,指定容器名稱為 registry ,使用的 image 為 registry:2

上傳 docker image

    
docker images
REPOSITORY                                                   TAG                     IMAGE ID       CREATED         SIZE
my-nuxt-app                                                  latest                  9890e8de4b90   13 months ago   1.23GB
    

需要先打上標籤,格式為:
    
docker tag [image名稱]:[標籤] [私有儲存庫位置]/[image名稱]:[標籤]
    

以上面的範例舉例:
image 名稱: my-nuxt-app
標籤:latest
私有儲存庫位置:192.168.0.40:5000
    
docker tag my-nuxt-app:latest 192.168.0.40:5000/my-nuxt-app:latest
    

上傳 image:
    
docker push 192.168.0.40:5000/my-nuxt-app:latest
    

如果出現以下錯誤訊息:
    
docker push 192.168.0.40:5000/my-nuxt-app:latest
The push refers to repository [192.168.0.40:5000/my-nuxt-app]
Get "https://192.168.0.40:5000/v2/": http: server gave HTTP response to HTTPS client
    

代表是 http 不安全,可以參考這篇文章: 延伸閱讀: docker 從私有儲存庫拉取映像檔 沒有 https 解決方式 教學

設定完成後就會發現可以上傳了:
    
docker push 192.168.0.40:5000/my-nuxt-app:latest
The push refers to repository [192.168.0.40:5000/my-nuxt-app]
eb041e2412bc: Pushed
34a83e9a9a9e: Pushing [====================================>              ]    110MB/152.4MB
9da4ba1aa180: Pushing [======>                                            ]  111.8MB/896.4MB
f28f2152f832: Pushed
d04b078a26a5: Pushed
0f6f412c7da8: Pushed
a844c5719a1c: Pushed
08a0d6bc43d2: Pushing [==============================================>    ]  150.4MB/162MB
cc2447e1835a: Pushed
    

下載 docker image

拉取的方式和平時幾乎一模一樣,只是前面多了我們私有儲存庫的位置而已:
    
docker pull 192.168.0.40:5000/my-nuxt-app:latest
    

查看私有儲存庫的 images 清單

開啟網頁(記得替換為自己的 ip):
    
http://192.168.0.40:5000/v2/_catalog
    

就可以查看有多少 image:
(這裡只有 my-nuxt-app 一個)
    
{
  "repositories": [
    "my-nuxt-app"
  ]
}
    

查詢指定的 image 的所有 tag (記得替換 ip 和指定的 image 名稱):
    
http://192.168.0.40:5000/v2/my-nuxt-app/tags/list
    

這裡就會看到筆者上傳的 my-nuxt-app 有兩個版本,分別是 v1 和 lastest
    
{
  "name": "my-nuxt-app",
  "tags": [
    "v1",
    "latest"
  ]
}
    



註: 在上面建立的 docker 私有儲存庫中並沒有進行身份驗證,非常不安全,不要公開讓外部使用。下篇文章再來加上身份驗證。

參考資料:
docker hub - registry
CNCF Distribution - Deploy a registry server

留言