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