在上一篇文章前端不懂 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 就会变得更简单!