一文教會你如何高效地搭建Docker私有倉庫

前言

Docker 倉庫用於保存 Docker 鏡像,分為公有倉庫與私有倉庫。

公有倉庫就是 Docker Hub 一類供所有 Docker 用戶使用的 Docker 倉庫。

私有倉庫是指由個人或企業搭建的 Docker 倉庫,供其自身使用,是非公開的。

本篇文章將對 Docker 私有倉庫及其相關內容進行詳解。

1. 私有倉庫

Docker 鏡像通常保存在 Docker HubDocker Hub 是目前最大的 Docker 鏡像公有倉庫,由 Docker 官方人員進行維護,其中的鏡像可供所有用戶下載使用。

在生產環境中,通常公司會構建一些符合公司業務需求的鏡像,這些鏡像因為是商業機密而不得上傳至 Docker Hub,隻能供公司內部人員使用。

此時就需要在內網搭建一個 Docker 私有倉庫,來存儲公司內部的鏡像,並確保內部人員可以不受網絡限制,快速地拉取或上傳鏡像。

鏡像為 Docker 容器的運行基礎,容器是鏡像的具體運行實例,鏡像倉庫為鏡像提供瞭可靠的存儲空間,鏡像可以從公有或私有倉庫拉取,如圖所示👇

2. 搭建私有倉庫

環境部署

私有鏡像倉庫在企業中占有較高的使用率,因此私有鏡像倉庫搭建技術顯得尤為重要。

下面通過示例講述私有鏡像倉庫的搭建方式與過程。

本節需要用到兩臺服務器,一個作為私有鏡像倉庫,另一個作為使用私有鏡像倉庫的 Docker 客戶機。

此處以 CentOS 系統為例,安裝並啟動 Docker,服務器信息如表所示。

自建倉庫

Docker Hub 為用戶提供瞭完美的倉庫鏡像,本示例將使用 Docker Hub 中的倉庫鏡像運行私有倉庫。

首先從 Docker Hub 中拉取倉庫鏡像,示例代碼如下:

以上示例成功拉取瞭 Docker 倉庫的鏡像。

下面將倉庫鏡像運行成為容器,示例代碼如下:

以上示例將倉庫鏡像運行成瞭倉庫容器,並映射瞭宿主機的 5000 端口,供 Docker 鏡像的上傳與下載。

其中,--restart=always 表示容器停止時自動重啟,這條參數常用於生產環境中。

下面將鏡像上傳至剛剛創建的鏡像倉庫中,示例代碼如下:

以上示例拉取瞭一個 BusyBox 鏡像,並為其添加瞭 tag 標識,在嘗試將鏡像推送至私有倉庫時,發生瞭報錯。

這是因為 Docker 默認支持 HTTPSHyper Text Transfer Protocol Secure,安全超文本傳輸協議),命令行中使用的是 HTTP(Hyper Text Transfer Protocol,超文本傳輸協議)。

修改 Docker 的啟動參數,使之允許以 HTTP 工作,示例代碼如下:

以上示例修改瞭 Docker 配置文件中的啟動參數,並重啟Docker。

下面接著嘗試將鏡像推送至私有倉庫,示例代碼如下:

以上示例成功將鏡像推送到私有倉庫。

如果想在其他宿主機上使用該倉庫,隻需要修改配置文件,重啟 Docker 服務。

下面通過另外一臺服務器拉取私有倉庫中的鏡像,先修改 Docker 配置文件,再重新讀取並重新啟動 Docker,最後拉取鏡像,示例代碼如下:

以上示例成功從私有倉庫下載瞭 BusyBox 鏡像。

如此,一個簡單的私有倉庫就搭建好瞭,但安全系數較低,鏡像保存在容器中,容器被刪除後,私有倉庫以及倉庫中的鏡像也會一並刪除,數據無法保存。

3. 使用 TLS 證書

生成證書

想讓倉庫對外提供服務,就需要配置用戶認可的 TLSTransport Layer Security,傳輸層安全)證書,否則倉庫將無法正常使用。

目前很多代理商可以提供權威的證書,用戶可以自行選擇。

下面演示自行生成 TLS 證書的方式及過程。

(1)使用 Openssl 工具生成私人證書文件。(暫不演示)

(2)創建帶有 TSL 認證的倉庫容器,示例代碼如下:

上述示例運行瞭一個被命名為 registry-TLS 的容器,並通過 REGISTRY_HTTP_TLS_CERTIFICATEREGISTRY_HTTP_TLS_KEY 兩個參數啟用倉庫的證書支持。

(3)在每一臺 Docker 客戶端宿主機上配置域名解析,使宿主機可以解析域名 “registry.Docker.com”,並在宿主機中創建名稱與域名名稱相同的目錄,示例代碼如下:

(4)將證書 damain.crt 復制到要使用倉庫的 Docker 宿主機,並放到 /etc/Docker/certs.d/registry.Docker.com:5000/ 目錄下,示例代碼如下:

(5)Docker-1 是倉庫的宿主機,下面使用 Docker-2 推送鏡像到私有倉庫,示例代碼如下:

以上示例成功將 Docker-2 中的鏡像推送至私有倉庫,並通過 -k 選項關閉 curl 對證書的驗證。

註意,默認情況下,證書隻支持基於域名訪問,要使其支持 IP 地址訪問,需要修改配置文件 Openssl.cnf

CentOS7 系統中,文件所在位置是 /etc/pki/tls/Openssl.cnf

在文件中的 [ v3_ca ] 部分添加 subjectAltName 選項,示例代碼如下:

保存退出後,重新生成證書即可使用。

基本身份驗證

企業創建私有鏡像倉庫時,為防止信息泄露,通常會為倉庫添加訪問限制。

實現訪問限制的最簡單的方法是基本身份驗證,下面通過本機基本身份驗證,為倉庫添加訪問限制。

(1)創建用戶密碼文件,示例代碼如下:

以上示例創建瞭用戶密碼文件 testusertestpassword

(2)運行倉庫容器,並指定 TLS 證書與身份驗證目錄,示例代碼如下:

(3)嘗試推送鏡像,示例代碼如下:

以上示例中,鏡像推送失敗,原因是沒有基本身份驗證憑據。

(4)通過用戶名與密碼登錄,示例代碼如下:

(5)登錄之後,再次推送鏡像,示例代碼如下:

以上示例在登錄之後成功推送鏡像到私有倉庫。

4. Nginx 反向代理倉庫

使用 Nginx 代理可以實現倉庫的認證功能。

簡而言之,就是將 Nginx 服務器作為私有倉庫的代理使用,如圖所示👇

(1)私有倉庫的搭建采用前文中的方式,首先在 Docker-1 中安裝Nginx,並修改其配置文件。

(2)然後通過 OpenSSL 工具生成私鑰和證書,示例代碼如下:

(3)使用 htpasswd 工具生成用戶賬戶,並設置密碼,示例代碼如下:

(4)啟動 Nginx 服務,示例代碼如下:

(5)訪問測試

使用瀏覽器訪問 https://192.168.56.146:443,出現登錄界面,如圖所示。

輸入正確的賬號密碼即可訪問倉庫。

(6)在 Docker-2 登錄倉庫,並推送鏡像到倉庫,示例代碼如下:

以上示例在宿主機 Docker-2 中進行域名修改及證書復制之後,將鏡像成功推送至 Docker-1 的鏡像私有倉庫。

5. 可視化私有倉庫

私有倉庫雖然搭建十分簡便但使用起來還是不夠方便,用戶不能直觀地看到倉庫中的資源情況。
本節將部署基礎的 UIUser Interface,用戶界面)工具,使用戶可以在 Web 界面直觀地看到倉庫中的鏡像以及鏡像的版本等信息。

私有倉庫的可視化需要 UI 工具 hyper/Docker-registry-web 來支持實現,如此可提高倉庫的可讀性。

(1)同樣采用拉取鏡像的方式運行 hyper/Docker-registry-web,示例代碼如下:

(2)啟動 hyper/Docker-registry-web 工具並連接私有倉庫,示例代碼如下:

以上示例啟動瞭 hyper/Docker-registry-web 工具並連接瞭私有倉庫,此時已經可以通過訪問 IP 地址與端口號查看私有倉庫的信息。

其中,--link 設置要連接的倉庫容器,-e 設置環境變量。

(3)拉取任意鏡像到私有倉庫中,示例代碼如下:

使用瀏覽器訪問私有倉庫,查看鏡像信息,如圖所示。

查看鏡像的標簽、大小、構建歷史等信息,如圖所示👇

👇

總結

本文章詳細介紹瞭如何搭建 Docker 私有倉庫,如何通過配置證書為倉庫添加安全級別與身份驗證,如何使用 Nginx 代理倉庫。

相信大傢已經通過本文章的學習已經熟練掌握瞭鏡像私有倉庫的相關知識,並能夠搭建出企業級的私有倉庫。

到此這篇關於如何高效地搭建Docker私有倉庫的文章就介紹到這瞭,更多相關Docker私有倉庫搭建內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: