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看這個還是會有這個東西,需要手工把這個東西給刪除掉即可,但是因爲掛載在宿主機上,所以可以直接刪除宿主機即可,然後再看就發現這個東西已經沒有了。

 

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