Docker 可信鏡像倉庫服務,是安全、高可用并且支持本地部署的 Docker 服務,通常使用 DTR 代指。如果知道 Docker Hub 是什么,可以將 DTR 理解為私有的 Docker Hub,可以在本地部署,并且自行管理。
在安裝前有幾點需要說明
如果條件允許,使用專用節(jié)點來運行 DTR。在 DTR 生產(chǎn)環(huán)境節(jié)點中絕對不要運行用戶工作負載。
在 UCP 中,需要運行奇數(shù)個 DTR 實例。3 個或者 5 個實例有較好的容錯性。生產(chǎn)環(huán)境下的推薦配置如下。
? 3 個專用 UCP 管理節(jié)點。
? 3 個專用 DTR 實例。
? 按應用需求增加工作節(jié)點。
? 接下來會在單個節(jié)點上完成 DTR 的安裝和配置。
在 UCP 集群中配置首個 DTR 實例包括下面幾個步驟。
為了完成下面步驟,需要一個用于安裝 DTR 的 UCP 節(jié)點和一個監(jiān)聽 443 端口的負載均衡,并處于 TCP 透傳模式,同時在 443 端口開啟了 /health 健康檢查。下圖展示了完整架構(gòu)圖。
⒈ 登錄 UCP Web 界面,單擊 Admin > Admin Settings > Docker Trusted Registry。
⒉ 填寫 DTR 配置表,如下所示。
? DTR 外部 URL(DTR EXTERNAL URL):設置外部負載均衡器的 URL。
? UCP 節(jié)點(UCP NODE):選擇希望安裝 DTR 的節(jié)點名稱。
? 禁用 UCP 的 TLS 認證(Disable TLS Verification For UCP):如果使用自簽名證書,勾選該復選框。
⒊ 復制表格底部的長命令。
⒋ 將命令粘貼到 UCP 管理節(jié)點。
命令中包含 --ucp-node,告訴 UCP 需要執(zhí)行該命令的具體節(jié)點。
下面示例中的 DTR 安裝命令與上圖中的配置相符。示例中假設當前已經(jīng)在 dtr.mydns.com 配置了負載均衡器。
$ docker run -it --rm docker/dtr install \
--dtr-external-url dtr.mydns.com \
--ucp-node dtr1 \
--ucp-url https://34.252.195.122 \
--ucp-username admin --ucp-insecure-tls
⒌ 一旦安裝完成,就可以通過瀏覽器訪問負載均衡器。訪問后會自動登錄DTR,如下圖所示。DTR 已經(jīng)應用,但尚未為其配置 HA。
配置多副本的高可用 DTR 依賴共享存儲。共享存儲可以是 NFS 或者對象存儲,可以本地部署或者在公有云上部署。下面的步驟中會采用 Amazon S3 Bucket 作為共享存儲來完成高可用 DTR 配置。
⒈ 登錄 DTR 控制臺,進入 Settings。
⒉ 選擇存儲(Storage)標簽頁,并配置共享存儲。
下圖展示了如何將位于 eu-west-1 可用域中名為 deep-dive-dtr 的 AWS S3 bucket 存儲配置為 DTR 的共享存儲。小伙伴在本地不能使用該存儲。
DTR 現(xiàn)在配置了共享存儲,可以開始增加額外的副本了。
⒈ 在 UCP 集群管理節(jié)點運行下面命令。
$ docker run -it --rm \
docker/dtr:2.4.1 join \
--ucp-node dtr2 \
--existing-replica-id 47f20fb864cf \
--ucp-insecure-tls
--ucp-node 參數(shù)指定了命令創(chuàng)建新 DTR 副本所在的節(jié)點。如果使用自簽名證書,必須指定 --insecure-tls 參數(shù)。
我們需要替換示例中的鏡像版本和副本 ID。副本 ID 在初始化安裝副本的輸出內(nèi)容中可以找到。
⒉ 按提示輸入 UCP URL、端口以及管理員證書。
添加成功后,會看到如下信息。
INFO[0166] Join is complete
INFO[0166] Replica ID is set to: a6a628053157
INFO[0166] There are currently 2 replicas in your DTR cluster
INFO[0166] You have an even number of replicas which can impact availability
INFO[0166] It is recommended that you have 3, 5 or 7 replicas in your cluster
一定要遵循前面的建議來安裝副本,保證數(shù)量為奇數(shù)。這時需要更新負載均衡的配置信息,這樣流量可以發(fā)送到新的副本之上。
DTR 現(xiàn)在已經(jīng)配置了 HA,這意味著現(xiàn)在某個副本宕機不會影響服務可用性。下圖展示了高可用 DTR 配置。
需要注意,當前負載均衡器會向全部 3 個 DTR 副本發(fā)送流量,也會對全部 3 個節(jié)點執(zhí)行健康檢查。全部 3 個 DTR 副本共享同一個外部存儲。
在上圖中,負載均衡器和共享存儲都是第三方產(chǎn)品,按照單點部署進行展示(非高可用)。為了保證整體環(huán)境的高可用,建議確認這些產(chǎn)品都支持高可用,并且對其內(nèi)容和配置信息進行備份(例如保證負載均衡器和存儲系統(tǒng)原生支持高可用,并且配置了備份策略)。
因為使用了 UCP 的緣故,DTR 自帶 backup 命令,屬于安裝 DTR 所用鏡像的一部分。該備份命令會將分散于多個卷的 DTR 配置信息進行備份,包括以下幾種。
? DTR 配置。
? 倉庫原生信息。
? 公證信息。
? 證書。
DTR 自帶備份并不支持對鏡像的備份功能。通常鏡像保存在高可用的存儲后端,依賴非 Docker 工具執(zhí)行自己獨立的備份計劃。
在 UCP 管理節(jié)點執(zhí)行下面命令對 DTR 進行備份。
$ read -sp 'ucp password: ' UCP_PASSWORD; \
docker run --log-driver none -i --rm \
--env UCP_PASSWORD=$UCP_PASSWORD \
docker/dtr:2.4.1 backup \
--ucp-insecure-tls \
--ucp-username admin \
> ucp.bkp
read 命令會提示用戶輸入 UCP 管理賬戶的密碼,并保存到 UCP_PASSWORD 變量當中;第二行告訴 Docker 啟動新的臨時容器來執(zhí)行備份操作;第三行將 UCP 密碼設置為容器的環(huán)境變量;第四行執(zhí)行了備份命令;第五行使用自簽名證書保證命令可執(zhí)行;第六行設置 UCP 用戶名為“admin”;最后一行指定備份文件為當前目錄下的 ucp.bkp。
按照提示輸入 UCP URL 和副本 ID。該信息也可以在備份命令中指定。備份結(jié)束后,會在當前工作目錄下新增一個名為 ucp.bkp 的文件。該文件應當按照公司的備份策略,由公司備份工具進行統(tǒng)一管理。
從備份恢復 DTR 是下策,只有副本都宕機,并且沒有其他方式恢復時才可以嘗試。在只是單副本宕機,其他副本仍然可用的情況下,應當使用 dtr join 命令增加新的副本。
如果確定需要從副本恢復,步驟如下:
⒈ 停止并刪除 DTR 節(jié)點(可能已經(jīng)停止)。
⒉ 恢復共享存儲中的鏡像(可能不需該步驟)。
⒊ 恢復 DTR。
在準備恢復 DTR 的節(jié)點上執(zhí)行下面的命令。當然該節(jié)點必須是要恢復的 DTR 所在 UCP 集群中的一員。在恢復時需要使用與創(chuàng)建備份相同版本的 docker/dtr 鏡像。
⒈ 停止并刪除 DTR。
$ docker run -it --rm \
docker/dtr:2.4.1 destroy \
--ucp-insecure-tls
INFO[0000] Beginning Docker Trusted Registry replica destroy
ucp-url (The UCP URL including domain and port): https://34.252.195.122:443
ucp-username (The UCP administrator username): admin
ucp-password:
INFO[0020] Validating UCP cert
INFO[0020] Connecting to UCP
INFO[0021] Searching containers in UCP for DTR replicas
INFO[0023] This cluster contains the replicas: 47f20fb864cf a6a628053157
Choose a replica to destroy [47f20fb864cf]:
INFO[0030] Force removing replica
INFO[0030] Stopping containers
INFO[0035] Removing containers
INFO[0045] Removing volumes
INFO[0047] Replica removed.
按提示輸入 UCP URL、管理證書以及要刪除的副本 ID。如果有多副本,可以多次運行該命令來刪除。
⒉ 如果鏡像在共享存儲中丟失,需要首先恢復鏡像。
⒊ 使用下面的命令恢復 DTR。
需要將第 5 行與第 6 行中的內(nèi)容替換為本地環(huán)境的值。因為 restore 命令不支持交互式,所以當 restore 命令開始執(zhí)行后,沒有提示輸入前面的內(nèi)容。
$ read -sp 'ucp password: ' UCP_PASSWORD; \
docker run -i --rm \
--env UCP_PASSWORD=$UCP_PASSWORD \
docker/dtr:2.4.1 restore \
--ucp-url \
--ucp-node \
--ucp-insecure-tls \
--ucp-username admin \
< ucp.bkp
DTR 現(xiàn)在已經(jīng)恢復。UCP 管理節(jié)點、工作節(jié)點以及 DTR 節(jié)點需要通過網(wǎng)絡互相通信。下圖總結(jié)了端口需求。