1. 目标与架构
- Registry:官方镜像仓库服务端(
registry:2),默认监听5000,提供/v2/API - Nginx:反向代理到 Registry,并负责:
- HTTPS(证书)
- Basic Auth 认证(htpasswd)
- 上传大小限制(
client_max_body_size)
访问流程:
docker client -> https://registry.ytlinux.com/v2/ -> Nginx(443) -> Registry(5000)
2. 准备目录与账号密码(Basic Auth)
2.1 创建工作目录
mkdir registry && cd registry
建议最终目录结构长这样:
registry/
├── auth/ # htpasswd 认证文件
├── certs/ # TLS 证书
├── data/ # registry 数据持久化
├── nginx.conf # nginx 配置
└── docker-compose.yml
2.2 生成 htpasswd(用户名 registry / 密码 123456)
用httpd:alpine容器自带的htpasswd 生成加密密码文件:
docker run --rm -v $PWD/auth:/auth httpd:alpine \ htpasswd -Bbc /auth/htpasswd registry 123456
参数说明:
-B:bcrypt 加密(更安全)-b:命令行直接带密码(非交互)-c:创建新文件(若已存在会覆盖)/auth/htpasswd:输出路径
注意:如果要追加用户,去掉
-c(否则覆盖原文件)。
3. 生成 HTTPS 证书(mkcert)
你使用 mkcert 给域名生成本地可信证书。
3.1 下载 mkcert
wget https://github.com/FiloSottile/mkcert/releases/download/v1.4.4/mkcert-v1.4.4-linux-amd64 chmod +x mkcert-v1.4.4-linux-amd64
3.2 生成证书
./mkcert-v1.4.4-linux-amd64 registry.ytlinux.com
生成文件一般是:
registry.ytlinux.com.pemregistry.ytlinux.com-key.pem
把它们放到certs/ 目录(如果 mkcert 生成在当前目录,手动移动):
mkdir -p certs mv registry.ytlinux.com*.pem certs/
关键提醒(非常重要): mkcert 的证书要在你运行
docker login/push的那台机器上“被信任”,否则 Docker 会报x509相关错误。
- 如果你只是本机测试(hosts 指向 127.0.0.1),通常需要把 mkcert 的根证书安装进系统和 Docker 信任链。
- 生产环境建议用正规 CA(Let’s Encrypt 等)或企业 CA。
4. 编写 Nginx 配置(HTTPS + Auth + 代理 /v2/)
创建nginx.conf:
events {}
http {
server {
listen 443 ssl;
server_name registry.ytlinux.com;
ssl_certificate /etc/nginx/cert/registry.ytlinux.com.pem;
ssl_certificate_key /etc/nginx/cert/registry.ytlinux.com-key.pem;
client_max_body_size 1G; #控制上传镜像的大小
auth_basic "Private Docker Registry";
auth_basic_user_file /etc/nginx/auth/htpasswd;
location /v2/ {
proxy_pass http://registry:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
你原文里证书路径写成了.../certs/ registry.ytlinux.com.pem(中间多了空格、且缺少完整文件名拼接),笔记里建议用上面这种明确文件名写法,避免 Nginx 启动失败。
5. 编写 docker-compose.yml(Registry + Nginx)
创建docker-compose.yml:
services:
registry:
image: registry:latest
restart: always
volumes:
- ./data:/var/lib/registry
nginx:
image: nginx:alpine
restart: always
ports:
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./auth:/etc/nginx/auth
- ./cert:/etc/nginx/cert
depends_on:
- registry
说明:
registry的数据持久化在./datanginx读取:./nginx.conf(只读)./auth(只读,里面的 htpasswd)./certs(只读,证书)
6. 启动服务
docker compose up -d
检查容器:
docker compose ps docker compose logs -f nginx docker compose logs -f registry
7. 本地测试域名解析(hosts)
你用于本机测试,把域名指向本机:
echo "127.0.0.1 registry.ytlinux.com" | sudo tee -a /etc/hosts
8. 登录、打 tag、推送镜像验证
8.1 登录仓库
docker login registry.ytlinux.com # Username: registry # Password: 123456
8.2 给镜像重新打 tag
示例(你的镜像是go:v1):
docker image tag go:v1 registry.ytlinux.com/go:v1
8.3 推送
docker push registry.ytlinux.com/go:v1
8.4(可选)拉取验证
先删掉本地 tag 再拉:
docker rmi registry.ytlinux.com/go:v1 docker pull registry.ytlinux.com/go:v1