用Docker Compose集成私有镜像仓库认证,核心是启用htpasswd基础认证与TLS加密:生成auth/htpasswd文件、创建certs/domain.crt与.key证书、在docker-compose.yml中配置REGISTRY_AUTH、TLS环境变量并挂载对应路径,客户端需信任证书后通过https://域名登录。
用 docker compose 集成私有镜像仓库认证,核心是让 registry 服务支持 http basic 认证(htpasswd)并启用 tls 加密。不配认证,仓库就是“裸奔”;不配 tls,密码会明文传输——这两步缺一不可。
准备认证文件(htpasswd)
Registry 本身不带用户管理功能,需借助外部 htpasswd 文件实现基础认证:
- 新建 auth 目录,执行命令生成用户凭据(例如创建用户
admin,密码123456):mkdir -p auth && docker run --rm --entrypoint htpasswd httpd:alpine -Bbn admin 123456 > auth/htpasswd - 可追加多个用户:重复运行该命令,用
>>追加到同一文件,如... >> auth/htpasswd - 确保生成的
htpasswd文件权限合理(registry 容器需能读取,但不应对外暴露)
配置 TLS 证书
registry 默认只在 HTTPS 下才允许 Basic Auth(HTTP 下会被忽略),所以必须提供有效证书:
- 推荐使用 OpenSSL 生成自签名证书(测试环境)或由内网 CA 签发(生产环境):
mkdir -p certs && openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domain.crt - 证书域名需与你后续访问仓库的地址一致(如
registry.example.com),否则客户端会报证书错误 - 把
domain.crt和domain.key放入项目目录的certs/子目录中
编写 docker-compose.yml
关键在于 environment 中声明认证和 TLS 路径,并通过 volumes 挂载对应文件:
- 指定认证方式:
REGISTRY_AUTH: htpasswd - 指定 realm 名称(显示在登录弹窗):
REGISTRY_AUTH_HTPASSWD_REALM: "Registry Realm" - 指定 htpasswd 文件路径(容器内路径):
REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd - 启用 TLS:
REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt和REGISTRY_HTTP_TLS_KEY: /certs/domain.key - 挂载 volume:
- ./auth:/auth:ro和- ./certs:/certs:ro - 端口建议映射
443:443(标准 HTTPS)或8443:443(避免占用宿主机 443)
客户端使用注意事项
服务跑起来后,客户端不能直接用 docker login registry.example.com 就完事:
- 首次登录前,需把
domain.crt(即服务器证书)复制到本地 Docker 的证书信任目录:
Linux 示例:sudo mkdir -p /etc/docker/certs.d/registry.example.com,再sudo cp certs/domain.crt /etc/docker/certs.d/registry.example.com/ca.crt - 然后执行:
docker login https://registry.example.com(注意带https://) - 推送镜像时,tag 必须匹配仓库域名:
docker tag myapp:latest registry.example.com/myapp:latest - 若用 IP 地址访问(如
192.168.1.100),证书必须为该 IP 签发(CN 或 SAN 包含该 IP),否则登录失败


















