企業內網分發 Docker 鏡像需自建私有倉庫。本文記錄基於官方 registry:2 鏡像的**單機極速部署**、鏡像標簽規範、推送驗證全流程,命令可直接複製執行,適合快速落地內網鏡像分發基礎設施。
docker10.sklinux.com(示例域名,實際替換為 IP 或內網域名)/root/my_registry(掛載到容器 /var/lib/registry)docker pull registry:2
docker pull centos:7
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:宿主機重啟自動拉起# 查看本地鏡像 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。
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
# 查看倉庫目錄
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"]}
docker rmi docker10.sklinux.com:5000/centos:7 centos:7 # 清理本地
docker pull docker10.sklinux.com:5000/centos:7
# 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 + 認證**,並配置 **生命週期策略** 清理無用層。本文命令經驗證可直接用於內網環境快速交付。