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有两个还算活跃的开源项目可以选择:

  1. docker-registry-frontend
  2. hyper/docker-registry-web

我们选择第二个来使用,因为第一个还没有提供删除镜像的功能。

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,登入管理界面。

然后可以自己修改管理员密码,然后创建不同权限的用户。这里简单说下各个权限的作用:

  1. UI_ADMIN: WEB-UI超级管理员,可以管理用户,不过并不能进行push和pull(需要push和pull可以加write-all权限)。
  2. UI_USER:UI管理员,只能查看Event和Status,也不能进行push和pull(需要push和pull可以加write-all权限)。
  3. UI_DELETE: 可以在UI界面中delete image
  4. read-all:read-all role matches any IP and any image name with glob * and grants pull permission
  5. 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 上传本地镜像

  1. 将本地的镜像,通过docker tag指向registry仓库
docker tag hello-world 10.45.10.31:5000/hello-world:latest
  1. 把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

参考资料:

  1. 使用官方 docker registry 搭建私有镜像仓库及部署 web ui
  2. mkuchin/docker-registry-web