docker/docker desktop for window環(huán)境下創(chuàng)建本地鏡像倉庫方式
問題現(xiàn)象
最近在研究如何在window服務(wù)器環(huán)境中創(chuàng)建docker本地鏡像倉庫,由于網(wǎng)上幾乎都是基于Linux服務(wù)器環(huán)境的,所以就能通過參考學(xué)習(xí)和實(shí)踐,來完成這個(gè)目標(biāo)。
問題分析
通過自學(xué),發(fā)現(xiàn)了創(chuàng)建docker鏡像倉庫的一些基本的邏輯原理,這是無論在window還是linux環(huán)境下,都肯定是一樣的。
注意:docker中直接下載后的鏡像是存放在本地docker庫中,而不是本機(jī)私有鏡像倉庫的!
區(qū)別
本地docker庫:是安裝docker后,docker服務(wù)中自帶的庫。
本機(jī)私有鏡像倉庫:是在docker服務(wù)中,啟動(dòng) registry 容器,從而創(chuàng)建的一個(gè)用于存放鏡像的庫,由于容器可以和本機(jī)端口綁定,所以也被稱為本機(jī)私有鏡像倉庫。
配置
window,docker/docker desktop(window環(huán)境建議使用docker desktop)
步驟
1.啟動(dòng)docker desktop,打開cmd命令窗口,輸入:
docker search registry
2.看到registry鏡像,輸入:
docker pull registry
3.查看鏡像,看到已經(jīng)下載到本地的registry鏡像
docker images #查看本地鏡像,可以看到registry鏡像
4.查看鏡像,看到已經(jīng)下載到本地的registry鏡像,下一步就是部署registry服務(wù)容器,
先在本機(jī)創(chuàng)建一個(gè)文件夾(如:E盤 下創(chuàng)建一個(gè) registry 文件夾,并設(shè)置為共享)
輸入:
docker run -d -p 5000:5000 --restart=always -v E:/registry:/var/lib/registry registry:latest
設(shè)置自重啟,綁定本機(jī)5000端口,同時(shí)映射容器中鏡像存放位置的路徑到本機(jī)路徑中。
5.查看容器,看到已經(jīng)部署好的registry容器,輸入:
docker ps #查看運(yùn)行中的容器
6.容器部署好之后,本機(jī)的鏡像倉庫就建好了,接下來就是要添加倉庫地址,才能實(shí)現(xiàn)連接。
在docker desktop中可以直接實(shí)現(xiàn)可視化配置,簡單方便:把鏡像倉庫地址(本機(jī)ip:5000)添加到 insecure-registries 中:
7.重啟docker desktop,通過重命名(docker tag 鏡像id 鏡像新標(biāo)簽名)創(chuàng)建一個(gè)新鏡像,注意格式,必須是(本機(jī)ip:5000/)開頭
8.上傳鏡像到本地鏡像倉庫,輸入:
docker push
由于我事先上傳過一次,所以顯示 Layer already exists(數(shù)據(jù)已存在)
能看到 latest:digest:sha256:、、、 size:。。。(即為push成功)
下面演示一個(gè)首先上傳鏡像的結(jié)果圖例子:
9.查看本機(jī)鏡像倉庫地址中的鏡像,驗(yàn)證鏡像是否成功上傳:
方法1:打開瀏覽器,輸入 本機(jī)ip:5000/v2/_catalog 可以訪問docker接口,查看鏡像信息,(該方法是最準(zhǔn)確的):
方法2:直接打開 本機(jī)的 E:\registry\docker\registry\v2\repositories 文件路徑,因?yàn)樗戌R像都會(huì)存放在這個(gè)目錄下,可以看見里面有個(gè)registry文件夾,這個(gè)文件夾就是剛才push的鏡像數(shù)據(jù)文件:
注意:這里建議新手不要用registry鏡像來測試,因?yàn)檫@個(gè)鏡像的名字容易和路徑中的registry混淆,概念不同,需區(qū)別開來。
進(jìn)入該文件可以看到以下信息,則表示push成功:
10.刪除本機(jī)鏡像倉庫中的鏡像,一開始我想到在本機(jī)文件夾中直接刪除的方法,但是有弊端:
打開本機(jī)的 E:\registry\docker\registry\v2\repositories 文件路徑,刪除這個(gè) registry文件夾;
同理再打開 E:\registry\docker\registry\v2\blobs 文件路徑,刪除 sha256文件夾:
再用方法1驗(yàn)證:
看上去似乎刪除成功,但是事實(shí)并不是,因?yàn)楫?dāng)我們再push一次的時(shí)候會(huì)發(fā)現(xiàn)本機(jī)私有鏡像庫中已經(jīng)存在了,由此可知?jiǎng)h除并沒有成功:
于是我想到最直接的方法就是去到容器中,查看具體的鏡像庫存放位置中,到底還存在鏡像不,結(jié)果發(fā)現(xiàn)了神奇的事情:
當(dāng)我通過 ls 命令 和 cd 命令 一步步探索到 registry容器中的 /var/lib/registry/docker/registry/v2/repositories 路徑時(shí),發(fā)現(xiàn)了利用上面方法刪除的鏡像,依舊完好無損的存在于此處;也就是說刪除無效;
于是我又去看了 registry容器的配置文件:
看不出所以然,通過上網(wǎng)查閱資料得知:這是因?yàn)?strong>
registry容器的delete功能默認(rèn)是不啟動(dòng)的,
我覺得禁止刪除功能,應(yīng)該是為了安全因素的考慮吧。
但在好奇心的驅(qū)使下,我又去查閱資料,發(fā)現(xiàn)網(wǎng)上提供了一種修改配置文件的方法,可以啟動(dòng)刪除功能,如下:
這里我就不實(shí)踐了,網(wǎng)上還提供了另一種更安全的方法:
就是來到registry容器中的 /var/lib/registry/docker/registry/v2/repositories 路徑,直接刪除掉你想要?jiǎng)h除的鏡像即可:
或者更簡單的是
1.直接在cmd執(zhí)行以下命令:
docker exec <容器名> rm -rf /var/lib/registry/docker/registry/v2/repositories/<鏡像名>
通過 ls命令 查看,發(fā)現(xiàn)文件夾下已經(jīng)空,即刪除成功,可執(zhí)行 exit命令 退出容器:(疑問:不需要?jiǎng)h除blobs下的文件嗎?猜測這個(gè)blobs也許是臨時(shí)數(shù)據(jù))
2.然后還需要執(zhí)行垃圾回收操作:
docker exec registry bin/registry garbage-collect /etc/docker/registry/config.yml
結(jié)果反饋:
看到這個(gè)反饋中的3個(gè)0,總感覺這次可能沒有刪除成功。
然后我再push,發(fā)現(xiàn)還是存在,然而在多次實(shí)踐后,卻發(fā)現(xiàn)偶爾有一次是成功的:
所以我推測,是因?yàn)檫@個(gè)垃圾回收操作一般是不會(huì)立刻執(zhí)行的,可能是需要一段時(shí)間后才能保證真正清除掉緩存數(shù)據(jù),這個(gè)垃圾回收機(jī)制可能和blobs這個(gè)文件夾有關(guān)系。
驗(yàn)證:
于是我再刪除鏡像文件之后,等了10幾分鐘后,再去執(zhí)行這個(gè)垃圾回收操作,發(fā)現(xiàn)有了新的反饋:
感覺有希望了,然而當(dāng)我再次去push的時(shí)候,依舊是說已存在:
百般嘗試之后,我突然想到了傳說中那個(gè)能解決99%問題的方法:重啟。
于是我在執(zhí)行垃圾回收操作命令之后,執(zhí)行了 restart命令,重啟后再push,發(fā)現(xiàn)可以了,多次嘗試都可以成功刪除,至此終于解決了這個(gè)刪除鏡像的問題:
總結(jié):
- 沒事就還是不要?jiǎng)h鏡像吧,太折騰了。
- 刪除步驟為:
10.2.1:打開本機(jī) E:\registry\docker\registry\v2\repositories 文件路徑,刪除你想要?jiǎng)h除的鏡像文件。
10.2.2:cmd中,執(zhí)行垃圾回收操作命令:
docker exec b0533d3f7f8e bin/registry garbage-collect /etc/docker/registry/config.yml
10.2.3:重啟 registry容器
docker restart registry容器的id
10.2.4:再次push上傳本地docker庫鏡像
docker push 192.168.2.120:5000/minio
11.服務(wù)器間的鏡像倉庫地址訪問:
如:A服務(wù)器(本機(jī))地址:192.168.2.120:5000
B服務(wù)器地址:192.168.2.220:5000
要在 A 中訪問 B 鏡像倉庫地址,實(shí)現(xiàn)從B的倉庫中拉取鏡像:
11.1 首先要在本機(jī)(A)的docker配置中,添加(B)鏡像倉庫地址:
11.2 然后 啟動(dòng)/重啟 本機(jī)(A)的docker desktop。
11.3 事先在B服務(wù)器上創(chuàng)建好B的鏡像倉庫,并創(chuàng)建以 B的ip:5000/ 開頭的鏡像,并push到b的鏡像倉庫地址中:
11.4 在本機(jī)(A)中打開瀏覽器查看 B 的鏡像庫中的信息,可以看到B庫中只有一個(gè)剛剛push的minio鏡像,同時(shí)說明訪問成功:
11.5 在本機(jī)(A)中拉取 B庫鏡像,輸入:
docker pull
下載中:
下載完成:
注意:這里是下載到本機(jī)(A)的docker倉庫,如果需要存放在本機(jī)私有鏡像倉庫,就需要和上面相同的方法,創(chuàng)建新的鏡像并push即可,如下:
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Docker一鍵部署springcloud項(xiàng)目的方法
本文主要介紹了Docker一鍵部署springcloud項(xiàng)目的方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12docker安裝并持久化postgresql數(shù)據(jù)庫的操作步驟
這篇文章主要介紹了docker安裝并持久化postgresql數(shù)據(jù)庫的操作步驟,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12Docker部署Java應(yīng)用程序的實(shí)現(xiàn)步驟
本文主要介紹了Docker部署Java應(yīng)用程序的實(shí)現(xiàn)步驟,通過將Java應(yīng)用程序打包成一個(gè)Docker鏡像,可以實(shí)現(xiàn)快速部署、資源隔離和靈活擴(kuò)展,感興趣的可以了解一下2024-03-03docker for windonws之Windows 10 家庭中文版安裝cl
這篇文章主要介紹了docker for windonws之Windows 10 家庭中文版安裝clickhouse 22.3版本及配置,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-083分鐘帶你學(xué)會(huì)docker搭建帕魯服務(wù)器
幻獸帕魯已經(jīng)正式開服,目前在線人數(shù)已經(jīng)超過7W+,很多玩家想自己創(chuàng)建服務(wù)器和朋友一起聯(lián)機(jī)游玩,本文主要介紹了3分鐘帶你學(xué)會(huì)docker搭建帕魯服務(wù)器,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01