docker私有镜像仓库搭建和镜像删除

docker私有镜像仓库一般用来存放公司内部的镜像,比如微服务中会有很多的服务需要放到自己公司内部的镜像仓库上,发布的时候直接从私有镜像仓库拉取。比如我公司的微服务部署在k8s环境上,微服务技术依然选择熟悉的Spring Cloud,这样每一个服务其实就是一个Spring Boot项目,我们通过Maven的插件会在项目编译、打包之后推送到我们的私有镜像仓库,之后CI工具使用kubelet部署的时候会从私有镜像仓库拉取镜像,最后完成部署,可以说私有镜像仓库是非常重要的一个环节。
接下来我会主要讲述一下私有镜像仓库的搭建以及镜像的管理,包括一些自己遇到的问题。
首先要保证自己的服务器已经安装了docker。具体的安装教程可以看官网,这里就不在赘述了。

一、创建docker私有镜像仓库

首先我们需要创建一个自己的CA证书,

1、创建私有CA证书

mkdir -p  /home/registry/certs
openssl req -newkey rsa:4096 -nodes -sha256 -keyout /home/registry/certs/domain.key -x509 -days 365 -out /home/registry/certs/domain.crt

比如下图是我自己创建时输入的相关内容:


图-1.png

2、运行Docker镜像仓库

做好镜像存储目录和证书目录的挂载,运行即可

docker run -d \
  --restart=always --name  registry \
  -v /home/registry:/var/lib/registry \
  -v /home/registry/certs:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  -p 5000:5000\
  registry:2

3、配置宿主机证书

这一步需要在所有需要拉取镜像的服务器上执行。上月底我在部署正式环境时我就遇到了这个问题,k8s的节点上一直显示拉取镜像失败,后来才发现忘了在k8s服务器上配置证书。

1、先创建放置证书的目录:
mkdir -p /etc/docker/certs.d/<hostname>:<port>
## 如:
mkdir -p /etc/docker/certs.d/ypc.registry.com:5000

hostname即生成CA证书的时候最后输入的hostnameport镜像仓库对外暴露的端口号。

2、拷贝证书

如果是在镜像仓库所在的服务器上,执行:

cp /home/registry/certs/domain.crt   /etc/docker/certs.d/ypc.registry.com:5000/ca.crt

如果不是同一台服务器,同样需要存放创建证书目录,执行:

mkdir -p /etc/docker/certs.d/ypc.registry.com:5000

之后将证书上传到目标服务器,且放在证书目录下,名称为ca.crt

3、重启docker
service docker restart

二、推送镜像到镜像仓库

为了测试,我拉取一个redis镜像,然后给它重新打一个tag

docker pull redis:4.0.14
docker tag redis:4.0.14  ypc.registry.com:5000/redis:v4

推送到私有镜像仓库:

docker push ypc.registry.com:5000/redis:v4

图-2.PNG

我们看到推送之后会返回一个sha256的值,这个值在删除镜像的时候会用到,这里不过多讲述。
接着我们通过浏览器查看下有没有推送成功,通过浏览器访问:

https://<ip>:<port>/v2/_catalog

浏览器显示:

{"repositories":["redis"]}

表示刚才推送到私有镜像仓库是成功的。接下来我们测试从另一台服务器拉取刚才的镜像。当然这台服务器一定要按照之前的描述配置好CA证书,还要修改服务器hosts文件,配置好iphostname
拉取镜像:

docker pull ypc.registry.com:5000/redis:v4
# 查看
docker images

拉取镜像如下图所示:


图-3.PNG

根据显示可以看出拉取镜像是成功的。
到这里镜像仓库的搭建、推送和拉取都讲完了,接下来就看看怎么删除镜像。

三、私有仓库镜像删除

这里说的删除镜像是指从仓库中删除,即从服务器上删除。在构建仓库的时候我们将镜像的仓库容器内的目录挂载到了服务器的目录。镜像仓库内其实是没有镜像文件,都在服务器对应的目录下。在开发的时候我就遇到过这样一个问题,因为是开发环境项目编译、打包、镜像构建和推送都非常频繁,虽然新的镜像会覆盖老的镜像,但是原有的镜像文件本身并没有被覆盖,这样的结果就是虽然镜像仓库上看镜像只有一个,但是本地服务上存储的是很多个镜像文件(而且基本是没啥用的),最终导致了服务磁盘空间不足的情况。

我们依然以Redis举例,我将多不同版本的Redis多次像私有仓库推送,不管是Redis4.0、5.0、6.0,最终我向仓库推送的版本号都是redis:v4(过程省略),最终我们在镜像仓库目录(/home/registry/)下可以看到有多个sha256的值,详细目录:
/home/registry/docker/registry/v2/repositories/redis/_manifests/revisions/sha256

如下图:

图-4.PNG

我将Redis4.0、5.0、6.0版本各推送了一次,所以这里有三个sha256值文件夹。
这时候我们看下服务器的磁盘使用情况:

du -sh /home/registry/docker
499M    /home/registry/docker

Ⅰ、删除数据

如果要删除镜像首先需要修改配置文件,进入到docker容器内:

 docker exec -it registry sh
## 容器内执行
vi /etc/docker/registry/config.yml
## 添加内容:
storage:
  delete:
    enabled: true

保存之后退出容器。
我们进入到存放镜像的目录下,删除一个镜像的sha256的值

cd /home/registry/docker/registry/v2/repositories/redis/_manifests/revisions/sha256
rm -rf 5bd4fe08813b057df2ae55003a75c39d80a4aea9f1a0fbc0fbd7024edf555786
Ⅱ、垃圾回收

上面只是删除了镜像的sha256值,并没有删除镜像本身,我们需要调用垃圾回收的命令:

 docker exec -it registry sh -c 'registry garbage-collect /etc/docker/registry/config.yml'
## 或进入容器内执行
docker exec -it registry sh
## 容器内执行
registry garbage-collect /etc/docker/registry/config.yml

这时候会看到一些输出,比如:

31 blobs marked, 8 blobs and 0 manifests eligible for deletion

这时候我们在查看下对应目录的磁盘使用情况:

du -sh /home/registry/docker
492M    /home/registry/docker

但是变化不明显,那就在删除一个试试。

du -sh /home/registry/docker
456M    /home/registry/docker

除了手动删除之外还可以通过API来删除,这个方法我没有测试,感兴趣的小伙伴可以测试一下。在实际过程中我也是使用上述方法删除的,因为我一般都是磁盘使用率到一定比例才进行批量删除的,另外网上也有人通过脚本,感兴趣的小伙伴都可以尝试一下。

附:API删除

删除可以使用使用官方API删除:

curl -I -XDELETE http://<ip>:<port>/v2/<镜像名称>/manifests/sha256:<sha256的值>

查询镜像的sha256的值:

curl --header "Accept:application/vnd.docker.distribution.manifest.v2+json" -I -XGET  http://<ip>:<port>/v2/<镜像名称>/manifests/<tag>

今天关于docker私有镜像仓库的内容就讲到这里,如果对上面内容有什么疑问欢迎大家交流探讨,也欢迎大家多多点赞、分享、转发,谢谢大家~~~​

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345