五分钟学会 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 就会变得更简单!

相关推荐
吃糖的小孩41 分钟前
从只读页面到可控真实探针:我如何给 Owner Console 加手动诊断
前端
谷无姜41 分钟前
为什么你的性能优化无效?可能是"木桶效应"在作祟
前端·性能优化
雾非雾1 小时前
《基于具身交互智能数字人技术:如何打造AI数字人宣讲平台"红厅智播”》
前端
Revolution611 小时前
一段 JavaScript 代码执行时,到底发生了什么
前端·javascript
智能起源1 小时前
关于元素层级过多,导致压祯的问题(使用winform或者WPF应用的webview组件嵌套网页时,动效卡顿问题)
前端
BullSmall1 小时前
Anolis OS 8.10 Docker 部署 SonarQube 9.9 完整教程
运维·docker·容器
Old Uncle Tom2 小时前
银行用户画像 -- 金融目标与需求意图
前端·人工智能·金融
IT_陈寒2 小时前
Vue的响应式让我加班到凌晨3点,原来问题出在这
前端·人工智能·后端
东方小月2 小时前
从0开发一个 Coding Agent(一):前言
前端·人工智能·typescript