1. 介绍
现在registry已经使用v2了,注意是和旧版v1不兼容的。两者的区别可以参考文章:Docker Registry V1 与 V2 的区别解析以及灵雀云的实时同步迁移实践
我采用的docker版本为:1.12.3
2. 安装docker-registry v2
2.1 安装镜像启动容器
docker run -d -p 5000:5000 --restart=always --name registry registry:2
2.2 配置
# 作为client machine需要从registry进行push和pull操作的都需要设置
vi /etc/docker/daemon.json
花括号内增加如下内容(IP根据自己情况修改):
"insecure-registries":["10.45.10.31:5000"]
2.3 测试
1、 将本地的镜像,通过docker tag指向registry仓库
docker tag hello-world 10.45.10.31:5000/hello-world:latest
2、 把hello-world这个image推送到仓库
docker push 10.45.10.31:5000/hello-world
3、 在另外一台机器上pull hello-world这个镜像
docker pull 10.45.10.31:5000/hello-world
3. 安装配置registry web ui
3.1 安装
registry web ui有两个还算活跃的开源项目可以选择:
我们选择第二个来使用,因为第一个还没有提供删除镜像的功能。
3.2 配置(带安全认证)
目标是: registry 监听主机的 10066 端口,ui 监听主机的 10088 端口。
先安装下hyper/docker-registry-web
docker pull hyper/docker-registry-web
1、 生成认证文件
mkdir ~/docker-registry-web/conf
cd ~/docker-registry-web
openssl req -new -newkey rsa:4096 -days 365 -subj "/CN=localhost" -nodes -x509 -keyout conf/auth.key -out conf/auth.cert
# 拷贝到指定目录
cp conf/auth.cert /etc/docker/registry
2、 建一个用于 registry-srv 的配置文件]
$ vim conf/registry-srv.yml
version: 0.1
log:
level: info
formatter: text
fields:
service: registry-srv
environment: production
storage:
cache:
layerinfo: inmemory
filesystem:
rootdirectory: /var/lib/registry
delete:
# 要在 ui 上能够删除镜像,enable 的值必须是 true
enabled: true
http:
addr: :5000
debug:
addr: :5001
# enable event notification
notifications:
endpoints:
- name: listener
url: http://10.45.10.31:8080/api/notification
timeout: 500ms
threshold: 5
backoff: 1s
3、 新建一个用于registry-web 的配置文件
$ vim conf/registry-web.yml
registry:
# Docker registry url
url: http://registry-srv:5000/v2
# Docker registry fqdn(用自己的IP)
name: 10.45.10.31:10050
# To allow image delete, should be false
readonly: false
auth:
# Disable authentication
enabled: false
4、启动
注意在~/docker-registry-web目录下执行以下命令:
# 启动registry-srv,下面挂载数据卷,冒号前是宿主机下的绝对路径,冒号后为镜像内的挂载路径,可以挂载多个。并且最后设定为read only(ro,默认为rw)。注意以后删除容器最好用docker rm -v避免产生无主数据卷。
docker run -v $(pwd)/conf/registry-srv.yml:/etc/docker/registry/config.yml:ro -v $(pwd)/conf/auth.cert:/etc/docker/registry/auth.cert:ro -p 5000:5000 --name registry-srv -d registry:2
# 启动registry-web
docker run -v $(pwd)/conf/registry-web.yml:/conf/config.yml:ro -v $(pwd)/conf/auth.key:/conf/auth.key -v $(pwd)/db:/data -d -p 8080:8080 --link registry-srv --name registry-web hyper/docker-registry-web
完成启动后,会有个默认的管理员账户,账号密码均为admin,登入管理界面。
然后可以自己修改管理员密码,然后创建不同权限的用户。这里简单说下各个权限的作用:
- UI_ADMIN: WEB-UI超级管理员,可以管理用户,不过并不能进行push和pull(需要push和pull可以加write-all权限)。
- UI_USER:UI管理员,只能查看Event和Status,也不能进行push和pull(需要push和pull可以加write-all权限)。
- UI_DELETE: 可以在UI界面中delete image
- read-all:read-all role matches any IP and any image name with glob * and grants pull permission
- write-all:write-all role grants pull+push permission for any IP and any image name.
4. 使用registry web ui
4.1 注册远程registry
PS: 使用前记得将该registry仓库在配置文件注册下
vi /etc/docker/daemon.json
添加如下内容:
# registry 监听的是5000端口
"insecure-registries":["10.45.10.31:5000"]
改完记得要重启下服务:
service docker restart
4.2 登入远程registry
首先在远程registry用管理员账号创建一个用户,例如我这里使用root用户。这样root用户才有权限进行push操作
创建好用户之后使用docker命令登入:
#登入远程registry,然后按照提示输入账号和密码
docker login 10.45.10.31:5000
4.3 上传本地镜像
- 将本地的镜像,通过docker tag指向registry仓库
docker tag hello-world 10.45.10.31:5000/hello-world:latest
- 把hello-world这个image推送到仓库
# registry 监听的是10066端口,所以向该端口push和pull
docker push 10.45.10.31:5000/hello-world
4.4 从registry仓库下载
docker pull 10.45.10.31:5000/hello-world
参考资料: