五分钟学会 Docker Registry 搭建私有镜像仓库

在上一篇文章前端不懂 Docker ?先用它换掉常规的 Vue 项目部署方式中,我们学习了如何使用 aliyun 私有镜像仓库,也了解到可以使用 Docker Registry 搭建私有镜像仓库。这篇文章就分享下实操过程。

registry 是官方提供的 registry 镜像,可以用来搭建私有镜像 registry,有了它,我们就可以建立起私有的镜像仓库。

启动 registry 容器

我们先把 registry 镜像拉下来,容器启动起来。

javascript 复制代码
docker run -d -p 5000:5000 \
-v d:/robin/docker/registry/config.yml:/etc/docker/registry/config.yml \
--restart always --name registry-srv registry:2

config.yml 是容器的配置文件,我们可以使用 volume 挂载到一个本地文件,这样我们就可以在本地修改并更新它。

docker registry 跑起来之后就支持推拉镜像了,但是没有鉴权的系统是很危险的,任何人都可以使用。

鉴权方式

docker registry 支持三种 auth 方式,分别是 silly, token, htpasswd。

silly 实际上不进行认证,只要请求头中有Authorization字段就算鉴权通过,这显然不能用于生产环境,不必过于关注。

htpasswd 鉴权

htpasswd 支持 basic authentication,htpasswd 文件只会加载一次,registry 启动后如果新增用户,需要重启registry。

htpasswd is used to create and update the flat-files used to store usernames and password for basic authentication of HTTP users

由于我是 Win 系统,我们可以执行下面的命令借助容器生成 htpasswd 的用户名和密码,并写到本地文件d:/robin/docker/registry/htpasswd中。

bash 复制代码
docker run --entrypoint htpasswd \
registry.cn-beijing.aliyuncs.com/google_registry/registry:2.4.1 \
-Bbn test 123456789 \
>>d:/robin/docker/registry/htpasswd

接着我们修改 docker resigry 的配置文件 config.yml,加入 auth 配置。

yaml 复制代码
auth:
  htpasswd:
    realm: basic-realm
    path: /opt/auth/htpasswd

然后重新运行容器,注意这里挂载了本地的 htpasswd 文件,也就是把账号信息写进去了。

javascript 复制代码
docker run -d -p 5000:5000 \
-v d:/robin/docker/registry/config.yml:/etc/docker/registry/config.yml \
-v d:/robin/docker/registry/htpasswd:/opt/auth/htpasswd \
--restart always --name registry-srv registry:2

此时我们再访问 localhost:5000/v2 已经需要登录认证了。

同样地,当我们在命令行 push 镜像时会发现它提示了"no basic auth credentials"。这是因为我们在命令行终端中还没登录过。

bash 复制代码
docker tag vue3-ts-blog-frontend localhost:5000/vue3-ts-blog-frontend
docker push localhost:5000/vue3-ts-blog-frontend

我们需要先使用 docker login 进行登录。

复制代码
docker login localhost:5000

这个时候再 push 镜像到私有 registry 就可以成功了。

Token 鉴权

那么 token auth 是怎么玩的呢?我们来看看它的简单说明。

我们先生成一套 ssl 证书和密钥。

bash 复制代码
openssl req -newkey rsa:4096 -nodes -sha256 -keyout c:robin/docker/ssl/myssl.key -x509 -days 365 -out c:robin/docker/ssl/myssl.pem

修改 config.yml,加入 token 方式的 auth。

yaml 复制代码
token:
  # external url to docker-web authentication endpoint
  realm: http://localhost:8080/api/auth
  # should be same as registry.name of registry-web
  service: localhost:5000
  # should be same as registry.auth.issuer of registry-web
  issuer: 'my issuer'
  # path to auth certificate
  rootcertbundle: /etc/docker/registry/auth.pem

这个 auth.pem 文件,就是 ssl 证书,我们需要挂载到 docker registry。

realm 配置指定了一个 auth server 的地址,我们需要启动这样一个 auth server,这个就是后面会提到的 registry-web 项目。

service 配置要和 registry-web 项目的 conf 文件中的 registry.name 对应上。

这些都是可以在 Token Authentication Specification 中找到踪迹的。

先重新启动 registry 项目,把 auth.pem 挂载上去。

javascript 复制代码
docker run -d -p 5000:5000 \
-v d:/robin/docker/registry/config.yml:/etc/docker/registry/config.yml \
-v d:/robin/docker/registry/ssl/myssl.pem:/etc/docker/registry/auth.pem \
--restart always --name registry-srv registry:2

好的,接上面,我们跑一个 registry-web 项目。

先把 registry-web 的 conf 文件写好。

yaml 复制代码
registry:
  # Docker registry url
  url: http://registry-srv:5000/v2
  # Docker registry fqdn
  name: localhost:5000
  # To allow image delete, should be false
  readonly: false
  auth:
    # Enable authentication
    enabled: true
    # Token issuer
    # should equals to auth.token.issuer of docker registry
    issuer: 'my issuer'
    # Private key for token signing
    # certificate used on auth.token.rootcertbundle should signed by this key
    key: /conf/auth.key

然后启动它。

javascript 复制代码
docker run -it -p 8080:8080 --name registry-web --link registry-srv \
-v d:/robin/docker/registry/registry-web.yml:/conf/config.yml \
-v d:/robin/docker/registry/ssl/myssl.key:/conf/auth.key \
hyper/docker-registry-web

我们使用默认的 admin/admin 账密登录。

然后给 admin 赋予读写权限,否则本地使用 admin 账号推送镜像也会报错的。

赋权之后,再 push 镜像就可以成功了。

然后在 registry web 首页就能看到我们 push 上去的镜像了。

至此,我们就成功搭建了一个基础版的 Docker Registry,可以用来管理私有镜像。学会了它,再去了解企业级项目 Harbor 就会变得更简单!

相关推荐
无我Code2 分钟前
2025----前端个人年中总结
前端·年终总结·创业
程序猿阿伟4 分钟前
《前端路由重构:解锁多语言交互的底层逻辑》
前端·重构
Sun_light20 分钟前
6个你必须掌握的「React Hooks」实用技巧✨
前端·javascript·react.js
KaiwuDB21 分钟前
使用Docker实现KWDB数据库的快速部署与配置
数据库·docker
爱学习的茄子23 分钟前
深度解析JavaScript中的call方法实现:从原理到手写实现的完整指南
前端·javascript·面试
莫空000023 分钟前
Vue组件通信方式详解
前端·面试
呆呆的心23 分钟前
揭秘 CSS 伪元素:不用加标签也能玩转出花的界面技巧 ✨
前端·css·html
susnm28 分钟前
Dioxus 与数据库协作
前端·rust
优雅永不过时_v32 分钟前
基于vite适用于 vue和 react 的Three.js低代码与Ai结合编辑器
前端·javascript
小皮侠34 分钟前
nginx的使用
java·运维·服务器·前端·git·nginx·github