docker私有鏡像服務搭建

    docker容器技術已經在部署服務上使用的非常普遍,主要是它的隔離性以及快速啓動的特性,一般啓動一個容器,如果鏡像不存在會先去dockerhub倉庫下載,然後存儲在本地,後續可以繼續或者反覆使用這個鏡像,但是一旦這個鏡像被刪除了,或者需要一個新的鏡像的時候,我們還是需要遠程下載,網速如果不給力的話,下載時間就會很漫長,爲此就誕生了docker鏡像私服這個服務,可以把需要的鏡像提交到私服上,一般私服是局域網內部的一臺服務器,當我們需要鏡像的時候,下載速度會大幅提升。

    docker私服不是一個管理docker容器和鏡像的服務,而是一個提供本地下載鏡像的服務,就好比maven本地倉庫,如果我們本地有了我們需要的依賴,會直接加載本地的依賴,只有本地沒有的時候,我們纔會去遠程服務器倉庫下載。

    docker私服的搭建很簡單,我們只需要運行一個名叫registry的docker鏡像並啓動,就構建了一個docker私服。這裏如果私服的服務器地址爲192.168.56.141對應主機名爲docker01,我們的docker服務器在另外一臺服務器上,服務器地址爲192.168.56.142,對應主機名爲docker02。一般爲了管理方便,我們的docker私服會單獨選擇一臺服務器,而真正運行docker容器的機器是另一臺服務器。下面給出兩臺服務器的信息:

docker01 -> ip: 192.168.56.141  -> docker run -d registry

docker02 -> ip:192.168.56.142  -> docker pull mongo  -> docker tag mongo:latest docker01:5000/mongo:latest -> docker push docker01:5000/mongo

    其實構建本地私服很簡單,我們假設docker01是私服服務器,docker02是運行docker其他容器的服務器。docker01只負責提供本地倉庫鏡像下載服務,docker02或者其他客戶端需要鏡像的時候,直接從docker01拉取,而不是從外網拉取,這樣節省鏡像下載時間。

    我們本次實驗的結果就是通過搭建docker私服最終感受一下從私服拉取鏡像是多麼快。

    這次實驗我採用的虛擬機是ubuntu1804,這樣,我們在開始之前,需要安裝docker,具體安裝,我直接採用的是sudo apt install docker.io。

    

    檢查安裝版本信息:

     

    直接安裝完成,docker服務就開啓了。

    開啓docker私服,其實很簡單,我們直接在docker01上運行registry鏡像即可。

    # docker run -d -p 5000:5000 --name registry registry

    

    運行完成,我們就開啓了一個docker私服,下面就是通過curl命令驗證一下私服倉庫最開始沒有鏡像的情況:

     

    我們需要向docker01私服上推送一些鏡像,這個鏡像第一次需要我們通過官方倉庫拉取:

     

    通過官方拉取鏡像會很慢,我們可以考慮增加鏡像加速器配置:第一次是新增,後面就是修改/etc/docker/daemon.json,我這裏是配置的阿里雲的加速器。

{
 "registry-mirrors": ["https://lz9fye6c.mirror.aliyuncs.com"]
}

    配置完成,需要我們重啓docker服務。

   # sudo systemctl daemon-reload

   # sudo systemctl restart docker

    

    拉取成功了,我們需要給這個鏡像打上標籤,就是tag,如下所示:

    # docker tag mongo:latest docker01:5000/mongo:latest

    接着我們需要push到docker01上。

    # docker push docker01:5000/mongo

    如果不出意外,肯定會失敗的,這是因爲我們使用的是http協議,而registry默認是使用的https協議:

     

    我們需要修改docker02,也就是docker私服對應客戶端這邊的daemon.json配置文件,增加安全選項配置:"insecure-registries":["docker01:5000"],最後完整的配置如下所示:

{
 "registry-mirrors": ["https://lz9fye6c.mirror.aliyuncs.com"],"insecure-registries":["docker01:5000"]
}

    我們再次push,就成功了。

     

     驗證推送成功: 

    

     這時候docker02上有兩個鏡像一個是原始拉取的,再一個是我們通過tag命令打出的。而在docker01的私服倉庫上有一個mongo的鏡像,不過docker01上通過docker images還是隻有一個registry的鏡像。這裏好像比較難以理解,docker01上的私服是通過docker運行的,而他私服倉庫中的鏡像不是docker images的鏡像,所以只能通過http://docker01:5000/v2/_catalog來查看。

    我們將docker02上的所有鏡像都刪除,通過如下命令:

    # docker rmi mongo 

    # docker rmi docker01:5000/mongo

    這是爲了演示,當我們從docker01私服上拉取鏡像的時候是多麼快速:

    

    拉取過來的鏡像:

     

     以上就是搭建私服的過程,這是簡單體驗了一下,一般私服是通過https協議來推送和拉取的,所以文中會有一個默認推送失敗的情況,但是也可以通過設置跳過這個限定。

    最後整理一下docker私服搭建的過程:

    1、私服搭建還是藉助於docker鏡像容器,鏡像的名字就是registry。默認開啓的端口是5000。

    2、私服搭建很簡單,我們一般把私服只作爲一個私服服務器,不會再當做除registry容器之外運行的docker服務器。

    3、推送鏡像的時候,默認是https協議,爲了繞過https,我們可以設置daemon.json配置文件中的參數insecure-registries。

    4、推送鏡像的時候 ,我們使用的命令是docker push docker01:5000/mongo,就將mongo鏡像推送到了私服倉庫。鏡像與私服倉庫建立關係就是靠的鏡像前面的這一串URL(docker01:5000/)。

    5、整個實驗比較繞的地方是docker02先從遠程倉庫拉取鏡像,然後tag,再push,最後刪除本地鏡像,再從docker01私服倉庫拉取鏡像,過程很複雜,主要是爲了演示私服搭建的過程以及使用。實際中不止一個docker02,好多個docker服務器,這個時候就能看出私服的威力。

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