快速搭建 Docker Registry(轻量型)

Docker Registry 是官方提供的基础镜像仓库工具,适合个人或小型团队快速搭建本地仓库。

1. 前提条件

  • 已安装 Docker(安装教程)。

  • 确保 Docker 服务正常运行:systemctl status docker(Linux)或 docker info(验证是否正常工作)。

2. 启动本地 Registry 容器

直接通过 Docker 镜像启动 Registry,默认使用 HTTP 协议(生产环境建议配置 HTTPS):


bash

# 启动 Registry,映射容器 5000 端口到主机 5000 端口,数据存储在主机的 /opt/registry 目录
docker run -d \
  --name local-registry \
  -p 5000:5000 \
  -v /opt/registry:/var/lib/registry \  # 数据持久化到本地目录
  --restart=always \  # 开机自启
  registry:2  # 使用官方 Registry 镜像(版本 2)


  • 验证是否启动成功:docker ps | grep local-registry,若能看到容器信息则启动成功。

3. 配置客户端信任(HTTP 场景必做)

由于 Registry 默认使用 HTTP,Docker 客户端默认拒绝访问非 HTTPS 的仓库,需配置信任:

Linux 客户端配置:

bash

# 编辑 Docker 配置文件(若不存在则创建)
sudo vim /etc/docker/daemon.json

# 添加以下内容(IP 替换为 Registry 所在主机的 IP,端口保持 5000)
{
  "insecure-registries": ["192.168.1.100:5000"]
}

# 重启 Docker 服务使配置生效
sudo systemctl daemon-reload
sudo systemctl restart docker
Windows/macOS 客户端配置:
  • 通过 Docker Desktop 图形界面:Settings -> Docker Engine,在配置中添加上述 insecure-registries 字段,重启 Docker 即可。

4. 测试仓库:推送 / 拉取镜像

bash

# 1. 给本地镜像打标签(格式:仓库IP:端口/镜像名:版本)
# 示例:将本地的 nginx 镜像标记为仓库中的镜像
docker tag nginx:latest 192.168.1.100:5000/my-nginx:v1

# 2. 推送到本地仓库
docker push 192.168.1.100:5000/my-nginx:v1

# 3. 从仓库拉取镜像(可在其他客户端执行,需先配置信任)
docker pull 192.168.1.100:5000/my-nginx:v1

# 4. 查看仓库中的镜像列表(通过 API)
curl http://192.168.1.100:5000/v2/_catalog
# 输出示例:{"repositories":["my-nginx"]}

方案二:搭建 Harbor 仓库(企业级)

Harbor 提供用户权限管理、镜像安全扫描等企业级功能,适合团队或生产环境。

1. 前提条件

  • 安装 Docker 和 Docker Compose(或 Docker Compose V2):

    bash

    # 安装 Docker(略,参考官方文档)
    # 安装 Docker Compose(以 Linux 为例)
    sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose
    docker-compose --version  # 验证安装
    

2. 下载并配置 Harbor

bash

# 1. 下载 Harbor 安装包(最新版本可从官网获取:https://github.com/goharbor/harbor/releases)
wget https://github.com/goharbor/harbor/releases/download/v2.9.1/harbor-offline-installer-v2.9.1.tgz

# 2. 解压并进入目录
tar -zxvf harbor-offline-installer-v2.9.1.tgz
cd harbor

# 3. 复制配置模板并修改
cp harbor.yml.tmpl harbor.yml
vim harbor.yml

# 关键配置项(根据需求修改):
# - hostname: 仓库的域名或IP(如 192.168.1.100)
# - http.port: HTTP 端口(默认 80,可修改)
# - harbor_admin_password: 管理员密码(默认 Harbor12345)
# - data_volume: 数据存储目录(默认 /data,建议修改为大空间目录)

3. 安装并启动 Harbor

bash

# 1. 预处理(生成配置文件)
sudo ./prepare

# 2. 安装并启动(使用 Docker Compose 部署)
sudo ./install.sh

# 3. 验证启动状态(查看容器)
sudo docker-compose ps
# 若所有容器状态为 Up,则启动成功

4. 访问与使用 Harbor

  • Web 界面:在浏览器访问 http://192.168.1.100(替换为配置的 hostname),使用管理员账号 admin 和配置的密码登录。

  • 创建项目:登录后创建一个项目(如 my-project),用于隔离镜像。

  • 推送镜像

    bash

    # 1. 登录 Harbor(输入用户名密码)
    docker login 192.168.1.100
    
    # 2. 给镜像打标签(格式:仓库IP/项目名/镜像名:版本)
    docker tag nginx:latest 192.168.1.100/my-project/my-nginx:v1
    
    # 3. 推送镜像
    docker push 192.168.1.100/my-project/my-nginx:v1

然后试着使用ssl 证书

一、通用准备:生成 SSL 证书

HTTPS 依赖 SSL 证书验证身份,需先获取证书。测试场景可用自签证书,生产环境必须使用 CA 签发证书(如 Let’s Encrypt、企业内部 CA 等)。此处以「自签证书」为例(适合本地测试)。

1. 生成自签证书(OpenSSL 工具)

确保本地安装 openssl(Linux/macOS 自带,Windows 需手动安装),执行以下命令(将 your-registry-domain.com 替换为仓库的域名 / IP,如 192.168.1.100 或 registry.local):


bash

# 1. 创建证书存储目录(后续仓库会用到)
mkdir -p /etc/docker/certs.d/your-registry-domain.com:443

# 2. 生成私钥(无密码,测试用;生产建议加密码)
openssl genrsa -out /etc/docker/certs.d/your-registry-domain.com:443/registry.key 2048

# 3. 生成证书签名请求(CSR),按提示填写信息,核心是「Common Name (CN)」需与仓库域名/IP一致
openssl req -new -key /etc/docker/certs.d/your-registry-domain.com:443/registry.key -out /etc/docker/certs.d/your-registry-domain.com:443/registry.csr

# 4. 生成自签证书(有效期 365 天)
openssl x509 -req -days 365 -in /etc/docker/certs.d/your-registry-domain.com:443/registry.csr -signkey /etc/docker/certs.d/your-registry-domain.com:443/registry.key -out /etc/docker/certs.d/your-registry-domain.com:443/registry.crt


生成后会得到 3 个文件:


  • registry.key:私钥(仓库服务端使用,需保密)

  • registry.crt:公钥证书(仓库服务端 + 客户端信任使用)

  • registry.csr:签名请求文件(生成证书后可删除)

二、方案 1:Docker Registry 配置 HTTPS

Docker Registry 是轻量级本地仓库,通过容器启动,调整 HTTPS 需在启动命令中指定证书路径。

1. 停止现有 HTTP 仓库(若已启动)

bash

docker stop local-registry
docker rm local-registry

2. 以 HTTPS 模式启动仓库

核心是通过 -v 挂载证书目录,并通过 -e 指定证书文件名:


bash

docker run -d \
  --name local-registry \
  --restart=always \
  -p 443:443 \  # HTTPS 默认端口 443(若用其他端口,需同步修改证书目录和客户端配置)
  -v /etc/docker/certs.d/your-registry-domain.com:443:/certs \  # 挂载证书到容器内 /certs 目录
  -v registry-data:/var/lib/registry \  # 挂载仓库数据目录(避免容器删除后数据丢失)
  -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \  # 仓库监听 HTTPS 端口
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.crt \  # 容器内证书路径
  -e REGISTRY_HTTP_TLS_KEY=/certs/registry.key \  # 容器内私钥路径
  registry:2  # Registry 镜像(默认最新版,建议指定具体版本如 registry:2.8)

3. 客户端信任证书(关键)

自签证书默认不被 Docker 信任,需在所有要访问仓库的客户端机器上配置信任:


bash

# 1. 在客户端创建仓库域名对应的证书目录(端口需与仓库一致,如 443)
mkdir -p /etc/docker/certs.d/your-registry-domain.com:443

# 2. 将服务端的 registry.crt 复制到客户端该目录(可通过 scp 或手动拷贝)
scp root@your-registry-ip:/etc/docker/certs.d/your-registry-domain.com:443/registry.crt /etc/docker/certs.d/your-registry-domain.com:443/

# 3. 重启 Docker 服务使配置生效
systemctl restart docker  # Linux
# 或(Windows PowerShell 管理员模式)
Restart-Service Docker
# 或(macOS)
sudo killall -HUP com.docker.docker

4. 验证 HTTPS 访问

bash

# 1. 登录仓库(无密码默认登录成功,生产需配置认证)
docker login your-registry-domain.com:443

# 2. 推送测试镜像(如将 nginx 镜像打标签后推送)
docker pull nginx
docker tag nginx your-registry-domain.com:443/test-nginx:v1
docker push your-registry-domain.com:443/test-nginx:v1

# 3. 拉取镜像验证
docker rmi your-registry-domain.com:443/test-nginx:v1
docker pull your-registry-domain.com:443/test-nginx:v1

三、方案 2:Harbor 配置 HTTPS

Harbor 是企业级仓库(自带 UI、认证、权限管理),配置 HTTPS 需修改其核心配置文件 harbor.yml

1. 停止现有 Harbor 服务(若已启动)

bash

cd /path/to/harbor  # Harbor 安装目录
docker-compose down -v

2. 修改 Harbor 配置文件 harbor.yml

打开安装目录下的 harbor.yml,找到 https 相关配置,替换为实际证书路径和域名:


yaml

# 注释或删除 http 配置(可选,强制 HTTPS)
# http:
#   port: 80

# 启用 HTTPS 配置
https:
  port: 443  # HTTPS 默认端口
  certificate: /etc/docker/certs.d/your-registry-domain.com:443/registry.crt  # 公钥证书路径(本地绝对路径)
  private_key: /etc/docker/certs.d/your-registry-domain.com:443/registry.key  # 私钥路径(本地绝对路径)

3. 重新生成 Harbor 配置并启动

bash

# 1. 清理旧配置(若之前启动过 HTTP 模式)
rm -rf /path/to/harbor/common/config/nginx/ssl  # 清理旧 SSL 配置

# 2. 重新生成配置文件
./prepare

# 3. 启动 Harbor(后台运行)
docker-compose up -d

4. 客户端信任证书(同 Docker Registry)

将服务端的 registry.crt 复制到客户端的 /etc/docker/certs.d/your-registry-domain.com:443/ 目录,重启 Docker 服务。

5. 验证 HTTPS 访问

  • Web UI 验证:浏览器访问 https://your-registry-domain.com:443,能正常打开 Harbor 登录页(无证书警告),说明 HTTPS 生效。

  • 命令行验证:同 Docker Registry 的 docker login/push/pull 操作,确认镜像能正常传输。

关键注意事项

  1. 证书一致性:证书的「Common Name (CN)」必须与仓库的访问域名 / IP 完全一致,否则会报「证书域名不匹配」错误。

  2. 生产环境证书:自签证书仅用于测试,生产环境需使用 CA 签发证书(如 Let’s Encrypt 可免费申请,通过 certbot 工具自动生成)。

  3. 端口映射:若不使用默认 443 端口(如 8443),需在证书目录、harbor.yml、客户端配置中同步指定端口(如 your-registry-domain.com:8443)。

  4. 客户端信任:所有需要访问仓库的机器(如开发机、服务器)都必须配置证书信任,否则 Docker 无法正常拉取 / 推送镜像。