Docker | 第六章:构建私有仓库
前言
上一章节,讲解了利用
Dockerfile和commit进行自定义镜像的构建。大部分时候,公司运维或者实施部门在构建了符合公司业务的镜像环境后,一般上不会上传到公共资源库的。这就需要自己搭建一个私有仓库,来存放自己的镜像数据,同时也可以存储其他镜像,方便拉取,比较国内的网络环境连接还是比较慢的。所以,本章节介绍下如何构建私有仓库。
安装Registry
Docker官方提供了Registry镜像,方便构建自己的私有仓库。所以,接下来讲解下私有仓库服务的安装。
- 拉取Registry镜像
docker pull registry
- 启动Registry镜像
由于Registry是一个镜像,运行后若我们删除了容器,里面的资源就都丢失了,所以我们在运行时,指定一个资源的挂载目录,映射到宿主的一个目录下,这样资源就不会丢失了。
docker run -d -v /opt/docker/registry:/var/lib/registry -p 1888:5000 --restart=always --name registry registry:latest
提示:restart=always 是指docker重启时此容器自动启动。
启动后,就能通过:http://宿主IP:1888/v2 ,访问了。

- 本地推送镜像至仓库
我们在本地创建一个镜像,同时推送到仓库上。
# 利用tag 标记一个新镜像
docker tag hello-world 127.0.0.1:1888/demo/hello-world:latest
# 推送镜像
docker push 127.0.0.1:1888/demo/hello-world:latest
此时,访问私有仓库地址:http://宿主IP:1888/v2/_catalog, 即可看见推送的镜像信息了。

- 远程推送镜像至仓库
直接使用127.0.0.1或者local时,是没有进行安全检验的。当我们使用外部的ip地址推送时,Registry为了安全性考虑,默认是需要https证书支持的。
错误提示:
[root@izbp16chpwsnff41nrjtfhz ~]# docker push 47.98.238.247:1888/demo/hello-world:v1
The push refers to repository [47.98.238.247:1888/demo/hello-world]
Get https://47.98.238.247:1888/v2/: http: server gave HTTP response to HTTPS client
搜索相关资料后,有两种方案:一种是通过daemon.json配置一个insecure-registries属性;另一种就直接配置一个https的证书了。https的相关配置不在本章节讲解范围了,这里就不示例了,最稳妥的做法可以是:利用nginx进行https证书支持,然后代理到Registry服务。有兴趣的可以自己动手实现下。
针对第一种做法,这里示例下:
{
"insecure-registries": ["实际的ip:端口"]
}
之后重启Docker,
systemctl restart docker
之后再进行推送就能推送成功了
docker push 47.98.238.247:1888/demo/hello-world:v1
查看下镜像的版本列表就能知道是否上传成功。

管理Registry
仓库很大,要是没有一套管理规则,也是很头疼的事情。所以接下来,讲解下如何管理Registry。
Registry接口列表
以下转至:https://cloud.tencent.com/developer/article/1116799 。详细可点击查看。
| 方法 | 路径 | 分类 | 描述 |
|---|---|---|---|
| GET | /v2/ | Base | 检查是否支持2.0接口 |
| GET | /v2/${image}/tags/list | Tags | 获取镜像标签列表 |
| GET | /v2/${image}/manifests/ | Manifest | 获取镜像主要信息 |
| PUT | /v2/${image}/manifests/ | Manifest | 修改镜像主要信息 |
| DELETE | /v2/${image}/manifests/ | Manifest | 删除镜像的主要信息 |
| GET | /v2/${image}/blobs/ | Blob | 获得镜像层 |
| DELETE | /v2/${image}/blobs/ | Blob | 删除镜像层 |
| POST | /v2/${image}/blobs/uploads/ | Initiate Blob Upload | 开始分块上传 |
| GET | /v2/${image}/blobs/uploads/ | Blob Upload | 获得分块上传的速度 |
| PATCH | /v2/${image}/blobs/uploads/ | Blob Upload | 分块上传数据 |
| PUT | /v2/${image}/blobs/uploads/ | Blob Upload | 完成上传 |
| DELETE | /v2/${image}/blobs/uploads/ | Blob Upload | 取消上传 |
| GET | /v2/_catalog | Catalog | 获得镜像列表 |
基本上的管理都是通过以上的api接口方式了,大家可自行尝试下。
删除镜像示例
这里就简单示例下比较常用的也比较麻烦的删除镜像方法。这里直接使用curl也可使用POSTMAN等api尝试工具进行.
注意:由于默认是不允许删除镜像的(提示方法不支持),所以需要进行配置,开启删除功能。所以我们在启动时,直接设置参数(REGISTRY_STORAGE_DELETE_ENABLED=true):
docker run -d -v /opt/docker/registry:/var/lib/registry -p 1888:5000 --restart=always --name registry -e "REGISTRY_STORAGE_DELETE_ENABLED=true" registry:latest
或者可设置/etc/docker/registry/config.yml,加入storage.delete.enabled设置为true(yaml格式)
version: 0.1
log:
fields:
service: registry
storage:
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
delete:
enable: true
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3

之后重启(restart)容器即可。
提示:对于config.yml配置文件,里面可以设置很多的属性信息,具体属性可查看官网说明:https://docs.docker.com/registry/configuration/
删除镜像:
curl -I -X --header "Accept: application/vnd.docker.distribution.manifest.v2+json" DELETE http://127.0.0.1:1888/v2/demo/hello-world/manifests/sha256:aca41a608e5eb015f1ec6755f490f3be26b48010b178e78c00eac21ffbe246f1
- name:镜像名称。
- reference:删除时必须是镜像对应sha256值,推送时,可以获悉sha256值。


或者利用get获取对应镜像信息:
curl -X GET \
http://47.98.238.247:1888/v2/demo/hello-world/manifests/v1 \
-H 'Cache-Control: no-cache'
再或者可以直接根据存储目录查看(由于挂载宿主目录,所以我们直接在宿主机查看):
/opt/docker/registry/docker/registry/v2/repositories/demo/hello-world/_manifests/tags/v2/index/sha256/link

利用cat命令 或者 直接打开文件查看:

题外话:关于Postman用法,可点击查看

删除前:

资源库大小:

执行删除后,发现tag已经为null了:

再看看大小,是没有变化的:

因为只删除了tag,镜像文件没有删除。所以我们进入容器执行下回收命令:
/ # registry garbage-collect /etc/docker/registry/config.yml
demo/hello-world
test/hello-world
test/hello-world: marking manifest sha256:aca41a608e5eb015f1ec6755f490f3be26b48010b178e78c00eac21ffbe246f1
test/hello-world: marking blob sha256:2cb0d9787c4dd17ef9eb03e512923bc4db10add190d3f84af63b744e353a9b34
test/hello-world: marking blob sha256:9db2ca6ccae029dd195e331f4bede3d2ea2e67e0de29d6a0f8c1572e70f32fa7
3 blobs marked, 1 blobs eligible for deletion
blob eligible for deletion: sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
INFO[0000] Deleting blob: /docker/registry/v2/blobs/sha256/a3/a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4 go.version=go1.7.6 instance.id=de550dcd-7e54-4279-a9e4-d3609c83b11b
这个时候就已经回收了。目前貌似没有自动回收机制。

可以看见大小发生了变化了,说明镜像已经被清理了。也可以去刚刚查看sha256目录查看,里面的信息已经被删除了

最后想说,利用命令去删除之类的太麻烦了,现在有很多开源的工具可以管理仓库。大家可以自行搜索下。这里可以看看这个开源的删除资源的工具类:https://github.com/burnettk/delete-docker-registry-image,具体使用方法有具体说明。
参考资料
官方的文档还是很齐全的,建议大家还是直接去官网查看相关资料。
- 官网:https://docs.docker.com/registry
- https://blog.csdn.net/sunshingheavy/article/details/54143764
- https://cloud.tencent.com/developer/article/1116799
- https://blog.csdn.net/nklinsirui/article/details/80705306
- https://github.com/burnettk/delete-docker-registry-image
总结
本章节主要是介绍如何利用
Registry进行私有仓库的创建及管理。对于单纯的api调用而言,有点麻烦,可以上网找写批量的脚本,简化步骤下。由于对linux命令不是很熟悉,大家还是自行谷歌吧。正常而言,还是应该有个管理的UI界面会更方便点。在后面讲解Docker可视化界面管理时再来详细说明下,因为本人也没有搭建过,后面会为了这个章节找些资料,然后分享给大家。敬请期待!
最后
若文中有错误或者遗漏之处,还望指出,共同进步!
老生常谈
- 个人QQ:
499452441 - 微信公众号:
lqdevOps

个人博客:http://blog.lqdev.cn
原文地址:http://blog.lqdev.cn/2018/08/05/docker/docker-six/
Docker | 第六章:构建私有仓库的更多相关文章
- Jenkins打Docker镜像推送到私有仓库
Jenkins打Docker镜像推送到私有仓库 因为我的Jenkins是安装在群晖NAS中的docker,所以我这边就以Docker安装Jenkins为例 echo '================ ...
- Docker以http访问Harbor私有仓库(一)
1 说明 前文Centos7搭建Harbor私有仓库(一)我们成功搭建Harbor,本篇我们主要配置Docker以http方式访问私有仓库 2 Docker配置 2.1 Mac系统 2.1.1 配置D ...
- Docker容器之搭建本地私有仓库
Docker容器之搭建本地私有仓库 本地私有仓库搭建的具体步骤 首先下载 registry 镜像 docker pull registry 在 daemon.json 文件中添加私有镜像仓库的地址并重 ...
- 【Docker构建私有仓库】
Docker默认不允许非HTTPS方式推送镜像,我们可以通过Docker的配置选项来取消此限制: [root@fedora ~]# cat /etc/docker/daemon.json { &quo ...
- Docker 构建私有仓库
Docker Hub 目前Docker官方维护了一个公共仓库Docker Hub,其中已经包含了数量超过15000的镜像.大部分需求都可以通过在Docker Hub中直接下载镜像来实现. 可以在htt ...
- 【原创】运维基础之Docker(3)搭建私有仓库
下载并启动registry $ docker pull registry$ docker run --name my_registry -d -p 5000:5000 -v /var/lib/regi ...
- docker使用registry搭建本地私有仓库
参考链接来自:http://blog.csdn.net/wangtaoking1/article/details/44180901/ 和Mavan的管理一样,Dockers不仅提供了一个中央仓库,同时 ...
- Docker以https访问Harbor私有仓库(二)
1 说明 前文Centos7搭建Harbor私有仓库(二)中,我们以https方式搭建了Harbor,本篇我们主要配置Docker以https方式访问Harbor私有仓库 2 Docker配置 2.1 ...
- docker推送镜像到私有仓库
配置私有仓库源 私有仓库地址:registry.supos.ai 修改/etc/docker/daemon.json文件,增加insecure-registries,如下所示: { "ins ...
随机推荐
- JavaScript中的BOM知识框架
浏览器对象模型(BOM)以window对象为依托,表示浏览器窗口及可见区域.同时,window对象和还是全局对象,因此所有求安局变量和函数都是它的属性,所有原生框架及其他函数都在它命名之下.BOM中对 ...
- Java探索之旅(8)——继承与多态
1父类和子类: ❶父类又称基类和超类(super class)子类又称次类和扩展类.同一个package的子类可以直接(不通过对象)访问父类中的(public,缺省,protected)数据和方法. ...
- mongodb 查询数据
MongoDB概念解析: 等同于SQL的数据库表:collectiondocument:等同于SQL的数据记录行field:等同于SQL的数据字段表连接,MongoDB不支持主键,MongoDB自动将 ...
- 使用 Chrome Timeline 来优化页面性能
使用 Chrome Timeline 来优化页面性能 有时候,我们就是会不由自主地写出一些低效的代码,严重影响页面运行的效率.或者我们接手的项目中,前人写出来的代码千奇百怪,比如为了一个 Canvas ...
- Git for Windows,TortoiseGit支持WinXP的最后版本及下载方法
TortoiseGit兼容Windows XP和Windows Server 2003的最后版本: TortoiseGit 1.8.16.0 (https://download.tortoisegit ...
- Entity Framework Code-First(9.4):DataAnnotations - Required Attribute
Required attribute can be applied to a property of a domain class. EF Code-First will create a NOT N ...
- vue 绑定属性(index)
<el-menu-item v-for="item in links" :key="item.id" v-bind:index="item.id ...
- GXU - 7D - 区间求和 - 前缀和
https://oj.gxu.edu.cn/contest/7/problem/D 描述 有一个所有元素皆为0的数组A,有两种操作: 1 l r x表示将A区间[l,r]内所有数加上x: 2 l r表 ...
- VS连接SQL Server数据库,增删改查详细教程(C#代码)_转载
工具: 1.Visual Studio (我使用的是vs2013) 2.SQL Server (我使用的是sql server2008) 操作: 1.打开SQL Server,打开后会看到数据库的初 ...
- linux系统elementray os的环境搭建
因为我在使用过程中为了改变终端的外表,结果把/ect/psswd,以及/ect/profile中的文件配置修改之后,我把gnome-terminal的python脚本打包放在/bin/目录下,修改了/ ...