用 Docker 部署前端?你有私有映象倉庫嗎

發表於2023-09-21

大家好,我是楊成功。

越來越多的前端團隊選擇用 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,如果彈出登入框,讓你輸入賬號密碼,表示授權驗證已生效。

2023-09-16-08-49-12.png

新增 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 介面和推送/拉取映象。

2023-09-16-08-51-01.png

設定允許刪除映象

預設 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 位朋友贈書。

相關文章