Docker | 私有仓库搭建
Contents
简介
Registry作为Docker的核心组件之一负责镜像内容的存储与分发,客户端执行docker pull(push)命令都将直接与Registry交互。
Registry V2的改进: - 安全性改进 - 权限控制 - Pull性能改进 - 其他改进
环境说明
ip | port | description |
---|---|---|
192.168.1.161 | 5000 | CentOS-7-x86_64 Registry服务器 |
Docker Registry V2
下载镜像(最新)
1
|
docker pull registry:2.6.1 |
运行Registry服务
运行容器
1 2 3 4 5 6 7 8
docker run -d \ --name registry \ --restart=always \ --privileged=true \ -p 5000:5000 \ -v /home/docker/registry:/var/lib/registry \ -v /home/docker/registry/config.yml:/etc/docker/registry/config.yml \ registry:2.6.1
Note:
- registry:2.6.1会把上传的镜像保存在/var/lib/registry目录下
- privileged=true: CentOS7的安全模块SELinux把权限禁用了,该参数用于开启容器的特权,不加会报 限错误。
- 两个 -v 分别挂载镜像和配置文件目录到主机
测试Registry服务是否成功运行
- curl http://192.168.1.161:5000/v2/
- return
{}
represent success
有关配置文件 /etc/docker/registry/config.yml 的使用及说明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
version: 0.1 log: fields: service: registry storage: cache: blobdescriptor: inmemory filesystem: rootdirectory: /var/lib/registry http: addr: :5000 headers: X-Content-Type-Options: [nosniff] health: storagedriver: enabled: true interval: 10s threshold: 3
上传镜像
创建好私有仓库后,使用docker tag来标记一个镜像,然后推送它到仓库,就可供其他机器下载使用。
- 设置标签
- 格式
- docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
实例
- docker tag alpine:latest 192.168.1.161:5000/alpine:test
- docker tag alpine:latest 192.168.1.161:5000/alpine:test
上传镜像
docker push 192.168.1.161:5000/alpine:test
上面命令执行完后会有如下错误,错误原因链接:http: server gave HTTP response to HTTPS client
上传镜像错误解决方案
方案一
在docker host端的 /etc/docker 目录下新建文件: daemon.json
- vim /etc/docker/daemon.json
添加如下内容:
- cat /etc/docker/daemon.json
{"insecure-registries":["192.168.1.161:5000"]}
重启dockerd服务
- systemctl restart docker
当有多个registry服务时:daemon.json数据如下:
{"insecure-registries":["192.168.1.161:5000","192.168.1.169:5000"]}
重新上传文件,成功返回如下数据
1 2 3 4
The push refers to a repository [192.168.1.161:5000/alpine] 5bef08742407: Pushed latest: digest:sha256:0930dd4cc97ed5771ebe9be9caf3e8dc5341e0b5e32e8fb143394d7dfdfa100e size: 528
拉取registry上的镜像
所有客户端daemon服务都必须加入Docker Registry地址, 不加则会报上述HTTPS相关错误。
- 切换到客户端:192.168.1.169
- 拉去镜像
- docker pull 192.168.1.161:5000/alpine:test
操作registry镜像
一下操作都是通过http请求访问,如果配置了证书则需要以https方式请求
列出当前所有镜像
http http://192.168.1.161:5000/v2/_catalog {“repositories”:[“alpine”,“api”]}
列出当前指定镜像
curl http://192.168.1.161:5000/v2/_catalog?n=100
搜索私有仓库镜像
url http://192.168.1.161:5000/v2/alpine/tags/list
删除镜像
前提条件:启动仓库服务时,需要在配置文件的 storage 配置选项中增加 delete=true(允许删除镜像), 测试配置文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
version: 0.1 log: fields: service: registry storage: delete: enabled: true cache: blobdescriptor: inmemory filesystem: rootdirectory: /var/lib/registry http: addr: :5000 headers: X-Content-Type-Options: [nosniff] health: storagedriver: enabled: true interval: 10s threshold: 3
删除镜像
API格式:DELETE /v2/< name >/manifests/< reference >
- name: 镜像名称
- refernece: 镜像对应的sha256值
查看要删除镜像的sha256值
- ls /home/docker/registry/docker/registry/v2/repositories/alpine/_manifests/revisions/sha256
- 0930dd4cc97ed5771ebe9be9caf3e8dc5341e0b5e32e8fb143394d7dfdfa100e
执行删除
进行垃圾回收
- 垃圾回收命令:
- registry garbage-collect /path/to/config.yml
- 实例:
- docker exec -it registry bash
- registry garbage-collect /etc/docker/registry/config.yml
- 垃圾回收命令:
可在删除前后查看仓库数据大小
- du -sh /home/docker/registory/docker/registry/v2/
注意:在目录中删除该镜像,然后重启docker daemon也会达到删除镜像的目的。
用户认证
FAQ
Issue1
Issue:
- The push refers to a repository [192.168.1.161:5000/alpine]
Get https://192.168.1.161:5000/v2/: http: server gave HTTP response to HTTPS client
- The push refers to a repository [192.168.1.161:5000/alpine]
Why:
- docker默认开启 HTTPS 服务,而实际上我们创建的私有仓库registry没有启用HTTPS加密
How:
See Also
Thanks to the authors 🙂