Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Docker 私有倉庫搭建與鏡像推送完整實踐:Registry 部署、Tag 規範、Push 流程

編輯:Linux 教學

企業內網分發 Docker 鏡像需自建私有倉庫。本文記錄基於官方 registry:2 鏡像的**單機極速部署**、鏡像標簽規範、推送驗證全流程,命令可直接複製執行,適合快速落地內網鏡像分發基礎設施。

環境準備

  • Docker Engine 已安裝並運行
  • 倉庫主機:docker10.sklinux.com(示例域名,實際替換為 IP 或內網域名)
  • 存儲目錄:/root/my_registry(掛載到容器 /var/lib/registry)

1. 拉取基礎鏡像

docker pull registry:2
docker pull centos:7

2. 啟動 Registry 容器

docker run -d \
  --name registry \
  -p 5000:5000 \
  -v /root/my_registry:/var/lib/registry \
  --restart=always \
  registry:2
  • -p 5000:5000:暴露 HTTP API 端口
  • -v:持久化存儲,避免容器刪除數據丟失
  • --restart=always:宿主機重啟自動拉起

3. 給本地鏡像打標簽(Tag 規範)

# 查看本地鏡像 ID
docker images
# REPOSITORY  TAG   IMAGE ID       CREATED      SIZE
# centos      7     9dbcac75201e   3 days ago   215.6 MB

# 打標簽:倉庫地址:端口/項目名:標簽
docker tag 9dbcac75201e docker10.sklinux.com:5000/centos:7

命名規範:[倉庫主機:端口/][命名空間/]鏡像名:標簽。私有倉庫**必須包含主機:端口前綴**,否則 Docker 會嘗試推送到 Docker Hub。

4. 推送鏡像至私有倉庫

docker push docker10.sklinux.com:5000/centos:7

輸出示例:

The push refers to repository [docker10.sklinux.com:5000/centos]
511136ea3c5a: Pushed
b6718650e87e: Pushed
493bab5fff45: Pushed
9dbcac75201e: Pushed

5. 驗證倉庫內容

# 查看倉庫目錄
ls -la /root/my_registry/docker/registry/v2/repositories/

# 或使用 Registry API
curl https://docker10.sklinux.com:5000/v2/_catalog
# {"repositories":["centos"]}

curl https://docker10.sklinux.com:5000/v2/centos/tags/list
# {"name":"centos","tags":["7"]}

6. 從私有倉庫拉取驗證

docker rmi docker10.sklinux.com:5000/centos:7 centos:7  # 清理本地
docker pull docker10.sklinux.com:5000/centos:7

進階:TLS 加密與基本認證(生產必備)

# 1. 生成自簽證書
mkdir -p /etc/docker/certs
openssl req -newkey rsa:4096 -nodes -sha256 -keyout /etc/docker/certs/registry.key \
  -x509 -days 365 -out /etc/docker/certs/registry.crt \
  -subj "/CN=docker10.sklinux.com"

# 2. 生成 htpasswd
mkdir -p /etc/docker/auth
docker run --entrypoint htpasswd registry:2 -Bbn admin 'StrongPassword' > /etc/docker/auth/htpasswd

# 3. 啟動帶認證的 Registry
docker run -d \
  --name registry-secure \
  -p 5000:5000 \
  -v /root/my_registry:/var/lib/registry \
  -v /etc/docker/certs:/certs \
  -v /etc/docker/auth:/auth \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/registry.key \
  -e REGISTRY_AUTH=htpasswd \
  -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  --restart=always \
  registry:2

客戶端需 docker login docker10.sklinux.com:5000 並配置 /etc/docker/certs.d/docker10.sklinux.com:5000/ca.crt 信任證書。

常見問題

現象原因解決
push 提示 "http: server gave HTTP response to HTTPS client"客戶端預期 HTTPS,倉庫僅 HTTP配置 TLS 或在 /etc/docker/daemon.json 添加 "insecure-registries":["docker10.sklinux.com:5000"] 並重啟 docker
pull 返回 401 Unauthorized未登錄/憑證錯誤docker login 並檢查 htpasswd
存儲空間暴增未清理舊層定期運行 registry garbage-collect 或啟用刪除 API

總結

私有倉庫三步走:**pull registry → run 持久化 → tag + push**。生產環境務必啟用 **TLS + 認證**,並配置 **生命週期策略** 清理無用層。本文命令經驗證可直接用於內網環境快速交付。

Copyright © Windows教程網 All Rights Reserved