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

相关推荐
王解39 分钟前
webpack loader全解析,从入门到精通(10)
前端·webpack·node.js
我不当帕鲁谁当帕鲁43 分钟前
arcgis for js实现FeatureLayer图层弹窗展示所有field字段
前端·javascript·arcgis
那一抹阳光多灿烂1 小时前
工程化实战内功修炼测试题
前端·javascript
放逐者-保持本心,方可放逐2 小时前
微信小程序=》基础=》常见问题=》性能总结
前端·微信小程序·小程序·前端框架
毋若成4 小时前
前端三大组件之CSS,三大选择器,游戏网页仿写
前端·css
红中马喽4 小时前
JS学习日记(webAPI—DOM)
开发语言·前端·javascript·笔记·vscode·学习
Black蜡笔小新5 小时前
网页直播/点播播放器EasyPlayer.js播放器OffscreenCanvas这个特性是否需要特殊的环境和硬件支持
前端·javascript·html
南猿北者5 小时前
docker Network(网络)
网络·docker·容器
秦jh_6 小时前
【Linux】多线程(概念,控制)
linux·运维·前端
蜗牛快跑2136 小时前
面向对象编程 vs 函数式编程
前端·函数式编程·面向对象编程