docker搭建私有仓库笔记

安装之前需要docker环境,安装docker环境参考:http://www.runoob.com/docker/centos-docker-install.html

10.138.60.136:5000是私有仓库的地址

1、私有仓库也是通过docker来实现的,所以需要拉取一个仓库镜像

docker pull registry

2、将该镜像运行起来成为一个容器,执行下面命令,复制命令粘贴一直报错,得手工敲进去才行。

docker run -d -p 5000:5000 -v /home/lwt/registry:/var/lib/registry --restart=always --privileged=true registry

-p 5000:5000    端口映射,前面是主机的端口号,后面是容器的端口号

-d    指明是后台运行容器

-v /home/lwt/registry:/var/lib/registry registry    将仓库存放于容器内的/tmp/registry目录下,将本地目录/home/hzq/registry挂载到容器,可以防止容器意外停止后镜像的丢失。

--restart=always    在容器退出时总是重启容器,主要应用在生产环境

--privileged=true    在CentOS7中的安全模块selinux把权限禁掉了,参数给容器加特权,不加上传镜像会报权限错误:OSError: [Errno 13] Permission denied或者(Received unexpected HTTP status: 500 Internal Server Error)错误

 

到这里仓库就搭建完成了,接下来就打包一个镜像搞上去看看吧。

首先给这个镜像添加一个带有私有仓库IP的TAG,这样后面才能成功推送到私有仓库,我服务器上就有一个叫dockertest的镜像文件。

所以先执行下面命令给这个镜像打上标记,我这里都没有加版本号,默认就是latest,如果是生产环境最好打上版本号,进行回退版本也会很方便,我这里都没有加版本号,版本号格式为10.138.60.136:5000/dockertest:1.0

docker tag 044ddfc1fe00 10.138.60.136:5000/dockertest

然后在将这个镜像推送到搭建的私有仓库去,然后你会发现出来一个问题。

docker push 10.138.60.136:5000/dockertest

错误信息:Get https://10.138.60.136:5000/v1/_ping: http: server gave HTTP response to HTTPS client

这个问题需要你在/etc/docker/daemon.json文件中添加一段配置信息,注意,注意,注意,因为之前配置过镜像加速节点,格式需要注意,地一个图片也就是我一开始写的,是错误的,需要写在一起。第二张图片的格式。

 

{ "insecure-registries":["10.138.60.136:5000"] }

然后重新启动下

systemctl daemon-reload

systemctl restart docker

 

然后重新push,你会发现成功了。

然后浏览器打开仓库:http://10.138.60.136:5000/v2/_catalog,完工。

 

来练习下从私有仓库拉取镜像吧,首先将我原本打标记的镜像删除,docker rmi 镜像id,然后你会发现报错。

Error response from daemon: conflict: unable to delete 044ddfc1fe00 (must be forced) - image is referenced in multiple repositories

意思是说,镜像有其余引用,这个时候你会发现,你打标签的镜像的ID和你原始的镜像ID是相同的。

所以你删除的其实是原始镜像,所以出现这个问题,这个时候我们根据镜像名来删除即可。

拉取私有仓库镜像很简单:docker pull 10.138.60.136:5000/dockertest

 

接下来删除私有仓库的镜像笔记

首先查看仓库中的景象已经tag(其实就是版本),在浏览器输入下面的地址,我的镜像就叫dockertest

http://10.138.60.136:5000/v2/dockertest/tags/list

删除仓库私有镜像需要先将配置文件调整一下,启用删除功能。

首先进入私有仓库的容器内部:docker exec -it c8aa1a12db2c /bin/sh

然后查看仓库环境的配置文件:cat /etc/docker/registry/config.yml

然后添加一个可以进行删除的节点:sed -i '/storage:/a\ delete:' /etc/docker/registry/config.yml

添加完成,我们在看看配置文件成什么样子了,多了个delete标签,但是没有值。

然后我们给这个标签添加一个值:sed -i '/delete:/a\ enabled: true' /etc/docker/registry/config.yml

好,到这里配置就算是完成了,然后退出容器重新启动下

docker restart c8aa1a12db2c

 

想要删除,需要一个digest的东西,但是这个东西需要添加一个http请求头Accept:application/vnd.docker.distribution.manifest.v2+json,所以命令如下,其中Docker-Content-Digest就是需要的内容。

curl --header "Accept:application/vnd.docker.distribution.manifest.v2+json" -I -XGET 10.138.60.136:5000/v2/dockertest/manifests/latest

然后我们开始进行删除操作

curl -XDELETE 10.138.60.136:5000/v2/dockertest/manifests/sha256:9cfeb6314649807b2230bfb5db72e6efec8be5505fb828070520849e12ed6f46

然后再去看就会发现没有了。

看似已经删除了,其实硬盘地址并没有释放。是因为docker删除image只是删除的image的元数据信息。层数据并没有删除。现在进入registry中进行垃圾回收。

进入容器:docker exec -it c8aa1a12db2c /bin/sh

切换到镜像目录:cd /var/lib/registry

查看占用空间:du -sch

启动垃圾回收:registry garbage-collect /etc/docker/registry/config.yml

查看占用空间:du -sch

第二次运行du -sch你会发现空间少了很多。

但是http://10.138.60.136:5000/v2/_catalog看这个还是会有这个东西,需要手工把这个东西给删除掉即可,但是因为挂载在宿主机上,所以可以直接删除宿主机即可,然后再看就发现这个东西已经没有了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章