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

在上一篇文章《前端不懂 Docker ?先用它换掉常规的 Vue 项目部署方式》中,我们学习了如何使用 aliyun 私有镜像仓库,也了解到可以使用 Docker Registry 搭建私有镜像仓库。这篇文章就分享下实操过程。
registry[1] 是官方提供的 registry 镜像,可以用来搭建私有镜像 registry,有了它,我们就可以建立起私有的镜像仓库。
启动 registry 容器
我们先把 registry 镜像拉下来,容器启动起来。
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[2] 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中。
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 配置。
auth:
htpasswd:
realm: basic-realm
path: /opt/auth/htpasswd
然后重新运行容器,注意这里挂载了本地的 htpasswd 文件,也就是把账号信息写进去了。
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”。这是因为我们在命令行终端中还没登录过。
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 证书和密钥。
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。
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[3] 中找到踪迹的。
先重新启动 registry 项目,把 auth.pem 挂载上去。
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 文件写好。
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
然后启动它。
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,可以用来管理私有镜像。
如果我们把这些部署在服务器上,配置好域名和 nginx,就能在外部直接登录访问了,推拉镜像都不是问题。
学会了 Docker Registry,再去了解企业级项目 Harbor 就会变得更简单!
参考资料
[1]registry: https://hub.docker.com/_/registry
[2]htpasswd: https://httpd.apache.org/docs/2.4/programs/htpasswd.html
[3]Token Authentication Specification: https://distribution.github.io/distribution/spec/auth/token/

声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/418475.html

联系我们
联系我们
分享本页
返回顶部