如何搭建本地 Docker 镜像仓库(完整步骤)

方案简述

本地镜像仓库的核心是 Docker Registry(官方工具)。以下是两种常见方案:

方案

特点

适用场景

基础 Registry

无需认证,HTTP 明文传输,简单快捷

本地开发测试环境

安全 Registry

支持 HTTPS + 用户认证 + 持久化存储

生产或内网环境


一、基础本地仓库(快速入门)

适用于本地测试,无需 HTTPS 和认证。

步骤:

  1. 启动 Registry 容器
docker run -d \ -p 5000:5000 \ --name my-registry \ --restart=always \ -v /opt/registry-data:/var/lib/registry \ registry:2
  • -p 5000:5000:将容器端口映射到宿主机
  • -v /opt/registry-data:/var/lib/registry:数据持久化到宿主机
  1. 配置 Docker 客户端
    编辑 /etc/docker/daemon.json(Linux)或 Docker Desktop 设置(Windows/Mac):
{ "insecure-registries": ["localhost:5000"] }
  1. 重启 Docker 服务
sudo systemctl restart docker
  1. 测试镜像推送/拉取
 docker tag nginx:latest localhost:5000/my-nginx:v1
  • 推送镜像
docker push localhost:5000/my-nginx:v1
  • 拉取镜像
docker pull localhost:5000/my-nginx:v1
  • 查看仓库内容
curl http://localhost:5000/v2/_catalog

二、安全增强仓库(生产推荐)

添加 HTTPS 加密 + 用户认证 + 持久化存储

步骤:

  1. 创建 SSL 证书
mkdir -p certs && openssl req -newkey rsa:4096 -nodes -sha256 \ -keyout certs/domain.key -x509 -days 365 -out certs/domain.crt \ -subj "/CN=myregistry.example.com"

注意:替换 myregistry.example.com 为你的仓库域名或 IP

2.创建用户密码文件

mkdir auth docker run --rm httpd:2.4-alpine \ htpasswd -Bbn username password > auth/htpasswd

3.启动带认证的 Registry

docker run -d \ -p 5000:5000 \ --name secure-registry \ -v $(pwd)/certs:/certs \ -v $(pwd)/auth:/auth \ -v /opt/registry-data:/var/lib/registry \ -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \ -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \ -e REGISTRY_AUTH=htpasswd \ -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \ -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \ registry:2
  1. 客户端登录仓库
docker login myregistry.example.com:5000 # 输入 username/password
  1. 使用仓库
docker tag nginx:latest myregistry.example.com:5000/secured-nginx:v1 docker push myregistry.example.com:5000/secured-nginx:v1

三、管理仓库内容

查看仓库镜像列表:

curl -X GET -u username:password https://myregistry:5000/v2/_catalog

删除镜像(需启用删除功能):

  1. 启用删除:启动容器时添加 -e REGISTRY_STORAGE_DELETE_ENABLED=true
  2. 删除镜像: # 获取镜像的 digest curl -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \ -u user:pass -X GET \ https://registry:5000/v2/<镜像名>/manifests/<版本> # 执行删除(替换 <digest>) curl -u user:pass -X DELETE \ https://registry:5000/v2/<镜像名>/manifests/<digest>

四、可视化界面(可选)

使用开源工具 docker-registry-ui:

docker run -d --name registry-ui \
  -p 8080:80 -e REGISTRY_URL=http://myregistry:5000 \
  joxit/docker-registry-ui:latest

访问 http://localhost:8080 即可浏览仓库内容。


常见问题解决

  1. 推送时报错 http: server gave HTTP response to HTTPS client
  2. 原因:客户端未配置不安全的仓库地址
  3. 解决:在 /etc/docker/daemon.json 中添加 insecure-registries(参考步骤一)
  4. 认证失败
  5. 检查 htpasswd 文件权限是否为可读
  6. 确保启动时正确挂载了 -v $(pwd)/auth:/auth
  7. 删除镜像后磁盘空间未释放
  8. 执行垃圾回收: docker exec secure-registry registry garbage-collect /etc/docker/registry/config.yml

总结

组件

作用

关键配置项

registry:2

核心仓库服务

端口映射、数据卷、环境变量

certs/

存放 TLS 证书

REGISTRY_HTTP_TLS_CERTIFICATE/KEY

auth/

存放用户密码文件

REGISTRY_AUTH* 相关参数

/opt/registry-data

持久化存储镜像数据

宿主机目录挂载

根据实际需求选择基础版或安全增强版,轻松实现本地 Docker 镜像管理!

相关文章

Kubernetes网络

Kubernetes网络Service 存在的意义Service引入主要是解决Pod的动态变化,提供统一访问入口: 防止Pod失联,找到提供同一个服务的Pod(服务发现) 定义一组Pod的访问策略(负...

10个运维拿来就用的 Shell 脚本,用了才知道有多爽

1、监控 MySQL 主从同步状态是否异常脚本#!/bin/bash HOST=localhost USER=root PASSWD=123.com IO_SQL_STATUS=$(mysql -h$...

通过 lua 进行 nginx redis 访问控制

Nginx来处理访问控制的方法有多种,实现的效果也有多种,访问IP段,访问内容限制,访问频率限制等。1. 需求分析1. Nginx来处理访问控制的方法有多种,实现的效果也有多种,访问IP段,访问内容限...

NGINX常规CORS错误解决方案

CORS错误CORS(Cross-Origin Resource Sharing,跨源资源共享)是一种机制,它使用额外的HTTP头部来告诉浏览器允许一个网页运行的脚本从不同于它自身来源的服务器上请求资...

每日漏洞 | Host头攻击

0x00 概述漏洞名称:Host头攻击风险等级:低问题类型:管理员设置问题0x01 漏洞描述很多场景下,开发者都相信HTTP Host header传递的参数值用来更新链接导出脚本或者一些敏感操作。但...

【Docker 新手入门指南】第八章:网络配置

一、端口映射进阶:-p与-P的核心差异随机映射(-P)场景:快速启动服务,自动分配宿主机端口(适用于开发测试)。docker run -d -P nginx # 容器 80 端口随机映射到宿主机高端口...