docker实践入门之七:Registry

自建仓库

之前说过,我们可以直接从dockerhub上抓取别人做好的image,也可以把自己做的image上传去共享。

但是如果要做一些自己用的image呢?那就需要自建registry。

官方的registry本身做成了一个image,所以安装使用非常简单:

docker pull registry
docker run -d -p 5000:5000 --name registry registry:2

这样你就有了一个 localhost:5000 的本地registry,如果要开放出去用的话,则必须使用https,简单的方法就是用nginx做一层反向代理,加上https支持即可。

# 上传一个image
docker tag image_name localhost:5000/image_name
docker push localhost:5000/image_name
# 下拉一个image
docker pull localhost:5000/image_name

如果是经过https代理,则把localhost:5000换成相应的域名即可。

Registry API

除了直接使用docker进行pull和push以外,其它对Registry仓库的操作需要通过Restful API进行。常用的操作有:

# 检测服务器状态:
GET /v2/
# 获取仓库列表
GET /v2/_catalog
# 获取镜像Tags
GET /v2/<name>/tags/list
# 获取镜像详情,reference为tag或degist
GET /v2/<name>/manifests/<reference>
# 删除镜像
DELETE /v2/<name>/manifests/<reference>

加上用户权限控制

默认的registry服务是开放的,可供任何人访问,这显然不是通常自建仓库想要的,所以需要加上用户权限管理。

一个基本的用户系统类似于web server的basic auth。

先创建一个htpasswd文件,记录用户信息:

mkdir /var/auth
docker run --entrypoint htpasswd registry -Bbn <username> <password>  >> /var/auth/auth_reg

其中/var/auth/auth_reg是用于保存用户信息的文件。<username><password>则是要创建的用户名和密码。

然后这样启动registry即可:

docker run -d -p 5000:5000 --restart=always -v /var/auth:/var/auth
    -e "REGISTRY_AUTH=htpasswd" \
    -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
    -e REGISTRY_AUTH_HTPASSWD_PATH=/var/auth/auth_reg \
    registry

现在就不能直接push和pull了,需要先登录一下:

docker login localhost:5000

输入用户名密码,之后登录信息会被保存在~/.docker/config.json里,并且会有一个安全警告,建议使用更安全的保存方式,比如Mac OS的keychain。

因为登录信息已经保存,所以后就可以直接push和pull了。

更新记录

  • 2021-10-15: 增加Restful API部分

推送到[go4pro.org]