大家好,我是楊成功。
越來越多的前端團隊選擇用 Docker 部署前端專案,方法是將專案打包成一個映象,然後在服務端直接拉映象啟動專案。這種方式可以忽略伺服器環境差異,更容易做版本管理。
但我們平常使用 Docker 拉取映象時,預設會從 Docker Hub
這個公共倉庫拉取。雖然 Docker Hub 也可以上傳自己的映象,但是上傳後會對所有人開放,這對公司專案來說顯然是不允許的。
為此,Docker 官方提供了工具 registry
來幫助我們搭建私有映象倉庫,用於管理自己的映象。後續所有的專案更新、升級、回滾,都要用到這個映象倉庫。
下面詳細介紹如何使用registry
搭建私有映象倉庫。
建立映象倉庫
首先確保在你要搭建私有倉庫的伺服器上,已經安裝好了 Docker(如何安裝 Docker 這裡不介紹)。
(1)使用命令拉取 registry
映象:
$ docker pull registry
(2)建立要儲存私有映象的目錄,如 /data/docker/registry
:
$ mkdir -vp /data/docker/registry
(3)使用以下命令,基於 registry 映象運將容器執行起來:
$ docker run -d \
-p 5000:5000 \
--restart=always \
--name registry \
-v /data/docker/registry:/var/lib/registry \
registry
容器執行後會佔用 5000
埠,該埠是訪問映象倉庫的入口。
(4)執行成功後,使用以下命令測試連線情況:
$ curl http://localhost:5000/v2/_catalog
如果返回以下結果:
{"repositories":[]}
則表示映象倉庫建立成功。此時倉庫內沒有映象,所以是一個空陣列。
(5)配置 Nginx 轉發
一般情況下,需要配置一個域名來轉發 5000
埠。假設域名為 docker.test.com
,新增一個配置檔案,程式碼如下:
server {
listen 80;
server_name docker.test.com;
charset utf-8;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
配置後,使用 nginx -s reload
命令過載配置檔案,即可透過該域名訪問映象倉庫。
新增登入授權驗證
上一節我們建立了私有倉庫,允許客戶端將自定義映象上傳到這裡。不過,私有倉庫不允許公開上傳、更不允許公開下載,所以還要做授權驗證。
和使用者登入的邏輯一樣,我們需要為私有倉庫建立賬號和密碼,登入之後的客戶端才能推送映象。我們使用檔案的方式儲存賬號密碼,使用 httpd:2
這個映象來建立賬號密碼。
(1)在資料目錄(/data/docker/registry)下新建 auth 資料夾:
$ cd /data/docker/registry && mkdir auth
(2)新增使用者 testuser
、密碼 testpass
,命令如下:
$ docker run \
--entrypoint htpasswd \
httpd:2 -Bbn testuser testpass > auth/htpasswd
此時會建立一個 htpasswd 檔案,該檔案中儲存了已新增的使用者賬號和密碼。
(3)停止之前執行的容器,然後重新執行:
$ docker stop registry
$ docker run -d \
-p 5000:5000 \
--restart=always \
--name registry \
-v /data/docker/registry:/var/lib/registry \
-v /data/docker/registry/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
registry:2
執行成功後,假設倉庫域名是 docker.test.com,那麼在瀏覽器中訪問 http://docker.test.com/v2/_catalog
,如果彈出登入框,讓你輸入賬號密碼,表示授權驗證已生效。
新增 Web UI 管理映象倉庫
上一步透過域名訪問倉庫,登入後只能看到列出的映象名字。然而我們需要管理映象,比如檢視版本、檢視連結、刪除無用映象等,此時就需要一個 Web UI 介面來管理映象倉庫。
使用開源專案 docker-registry-ui
可以快速為映象倉庫搭建 Web UI。我們選擇最簡單的靜態部署方式,使用 docker-compose
將 docker-registry-ui 與 registry 關聯在一起。官方 demo 可以檢視 這裡。
參考 demo 中的 simple.yml,我們寫一個 registry.yml
,作為 docker-compose 的配置:
version: '2.0'
services:
registry:
image: registry:2
environment:
- REGISTRY_AUTH=htpasswd
- REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm
- REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd
volumes:
- /data/docker/registry:/var/lib/registry
- /data/docker/registry/auth:/auth
networks:
- registry-ui-net
ui:
image: joxit/docker-registry-ui:latest
ports:
- 5000:80
environment:
- REGISTRY_TITLE=My Private Docker Registry
- NGINX_PROXY_PASS_URL=http://registry:5000
- SINGLE_REGISTRY=true
depends_on:
- registry
networks:
- registry-ui-net
networks:
registry-ui-net:
這個配置將 registry 和 ui 兩個服務綁成了一個應用容器,我們可以同時啟動和停止它們。執行啟動命令:
$ docker-compose -f registry.yml -d
啟動後,訪問 5000 埠即可 web 介面,同時 5000 也代理了 registry。也就是說。可以同時使用 5000 埠訪問 web 介面和推送/拉取映象。
設定允許刪除映象
預設 registry 的映象是不允許刪除的,registry-ui 也沒有提供刪除的按鈕。
Registry 的配置是一個 YAML 檔案,它提供了非常多的預設配置(文件參考這裡),是否允許刪除就是一個配置項,預設如下:
storage:
delete:
enabled: false
因為我們是用 docker-compose 執行的,沒有 registry 配置檔案,只有 registry.yml
檔案,所以允許刪除的配置要在 registry.yml 裡定義。
registry 提供了一個配置規則,可以將配置欄位大寫並且用_
連線起來,組成一個環境變數,使配置生效。
所以允許刪除的配置轉換成環境變數是:
REGISTRY_STORAGE_DELETE_ENABLED=true
將該環境變數寫入 registry.yml 檔案中即完成了配置。如下:
services:
registry:
environment:
- REGISTRY_STORAGE_DELETE_ENABLED=true
修改配置檔案後重新啟動容器,就可以在頁面中看到刪除按鈕了。
最後,不管在電腦本地還是在 CI 工具中,上傳映象到該倉庫時都需要登入。使用上面建立的使用者名稱密碼登入倉庫,命令如下:
$ docker login -u testuser docker.test.com
其中 testuser
是使用者名稱,docker.test.com
是映象倉庫域名,執行後輸入密碼即可登入成功。之後便可以向該倉庫中上傳映象了。
? ? 我的新書《前端開發實戰派》快要出版了,關注公眾號“程式設計師成功”並在精選文章 《我寫了一本書》下評論,我會選擇 3 位朋友贈書。