构建registry私有仓库
本文最后更新于11 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com

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.pem
  • registry.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的数据持久化在./data
  • nginx 读取:
    • ./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

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇