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

相关推荐
cdbqss11 分钟前
VB.net编写的身份证类
前端·.net
骑自行车的码农19 分钟前
React短文系列 遍历fiber树 App的创建
前端·react.js
AskSky22 分钟前
为了搞一个完美的健身APP,我真是费尽心机
前端
斯~内克28 分钟前
基于Vue.js和PDF-Lib的条形码生成与批量打印方案
前端·vue.js·pdf
阴阳怪气乌托邦29 分钟前
别再啃OA代码了!低代码"搭积木"式搞数智化,我直接少写500行
前端·低代码
beelan33 分钟前
v-on的思考
前端
山河木马36 分钟前
前端学习C++之:.h(.hpp)与.cpp文件
前端·javascript·c++
用户92724725021936 分钟前
PHP + CSS + JS + JSON 数据采集与展示系统,支持伪静态
前端
努力只为躺平40 分钟前
一文搞懂 Promise 并发控制:批量执行 vs 最大并发数,实用场景全解析!
前端·javascript
李大玄43 分钟前
Google浏览器拓展工具 "GU"->google Utils
前端·javascript·github