您現在的位置是:首頁 > 網路遊戲首頁網路遊戲

初學者必會的docker倉庫相關概念

  • 由 全棧程式設計師 發表于 網路遊戲
  • 2022-01-01
簡介2 映象倉庫管理實戰需求:拉取官方apache映象,在本地執行容器並修改網站首頁,將修改首頁後的容器打包為映象,上傳到docker hub上前面建立的倉庫heimatengyuntest中,供以後下載使用

倉庫密碼忘記了怎麼辦

定期更新原創技術文章,歡迎關注檢視更多。

前文介紹了Docker映象及容器的基本概念和操作命令,本節繼續討論Docker倉庫相關概念及映象加速配置方法。

一、Docker倉庫簡介

1。1 倉庫概念

倉庫(Repository)

是集中存放映象的地方,支援映象分發和更新。

前文提到容器是透過映象來建立,那麼映象就需要存放在一定的地方,而存放映象的地方就稱為倉庫。因此根據倉庫存放的位置不同,又分為

共有倉庫

私有倉庫

公有倉庫是放在網際網路上供大家免費使用的倉庫,而私有倉庫則是創建於公司或組織內部區域網中僅供內部使用。

目前世界上最大最知名的公有倉庫是Docker官方提供的

Docker Hub

。截至筆者寫此文時為止,官宣已有超過10萬個映象,其中包括軟體商提供、開源專案、社群提供的映象。這些映象直接拉取就可以使用,幾乎能滿足日常工作的所有需求。(Browse over 100,000 container images from software vendors, open-source projects, and the community)摘自官網。

但遺憾的是,有時候在國內直接訪問官方的Docker Hub會比較慢,因此國內幾大雲廠商都提供了映象服務,供國內下載使用。簡單說就是可以理解為把官方的Docker Hub複製一份放到國內伺服器並保持與官方同步。

根據使用經驗一般採用阿里雲的映象加速器比較穩定

倉庫包括

映象儲存系統

賬戶管理系統

,映象儲存是透過註冊服務(registry)實現,而賬戶管理系統則使得多個不同賬戶可以各自管理自己的倉庫中的映象。

1。2 倉庫與映象的關係

註冊伺服器(Registry)

是存放倉庫的具體的伺服器,一個註冊伺服器上可以有多個倉庫,而每個倉庫裡可以有多個映象。

以官方Docker Hub中的Nginx映象為例,註冊伺服器、倉庫、映象之間的關係如下:

初學者必會的docker倉庫相關概念

如圖所示,在我們Docker Hub所在的伺服器為註冊伺服器(通常直接稱為官方倉庫),存在一個Nginx的倉庫,而該Nginx倉庫中又包含非常多不同版本的Nginx映象,不同版本之間透過tag標識其版本號。

Nginx只是Docker Hub中眾多倉庫中的一個,其中還包括非常多的其它型別的映象如:MySQL、Apache、Redis、mongoDB、golang等等,想要的映象基本上都可以找到。

接下來我們就演示下Docker Hub使用

二、官方倉庫Docker Hub

官方Docker Hub地址為:https://hub。docker。com/。我們既可以直接在Web頁面進行賬號及映象管理,也可以直接在Docker中使用命令進行管理。

2。1 Docker Hub賬號管理

Docker Hub賬戶不是必須的,如果你僅僅是下載映象的話,也可以不用註冊

只有當你需要將自己製作的映象上傳到Docker Hub倉庫,這時就需要擁有賬戶並且再登陸成功後才能執行push命令將自己本地的映象推送到遠端倉庫。

說明:官網可能會隨時更新,以下介面均為筆者寫作時最新的介面,如果以後你看到這篇文章時介面與官網有出入,請以官方為準。大多數情況下,大概步驟都相同,請舉一反三。

初次進入網站進行註冊

初學者必會的docker倉庫相關概念

在註冊介面輸入Docker ID、郵箱、密碼後進行人機驗證,驗證通過後點選註冊按鈕即可,進入註冊流程。

後續流程按照官網提示一步一步操作,註冊過程中會進行郵箱驗證,根據提示操作即可,在此就不再贅述了。

註冊並登陸成功後,即可進入主介面

初學者必會的docker倉庫相關概念

在這裡可以建立倉庫、修改密碼以及對賬號進行管理。

2。2 倉庫管理

在Docker Hub上建立映象倉庫

點選倉庫按鈕進入倉庫頁面,點選頁面上的建立倉庫按鈕

初學者必會的docker倉庫相關概念

進入建立倉庫頁面

初學者必會的docker倉庫相關概念

在頁面中填寫倉庫名稱、倉庫的描述即可,其他都可以保持預設,然後點選建立即可。

說明

1、倉庫可見性:預設為公有,所有人都可以檢視;如果是私有倉庫則只能自己檢視。一個註冊賬戶預設可以建立一個私有倉庫,每月交7美元可以建立5個私有倉庫(以官方最新為準)。

2、自動構建:映象可以和原始碼託管倉庫(github或bitbacket)進行關聯,每當原始碼更新後就Docker Hub就會自動構建新版本的映象。這將在以後文章中進行演示。

建立成功之後,自動跳轉到該倉庫頁面

初學者必會的docker倉庫相關概念

至此,一個名為test的倉庫就建立好了,後續就可以在本地使用docker命令將本地映象上傳到此倉庫下。

2。3 倉庫命名規則

前面我們剛建立的倉庫名為:heimatengyun/test,很顯然預設由:使用者名稱/倉庫名,的形式構成。

以後上傳映象就上傳到heimatengyun/test倉庫下,假設上傳test的第一個版本test:1。0,則映象為heimatengyun/test:1。0。

細心的讀者,如果還記得第一篇文章中提到的hello-world映象,或許你就會覺得疑惑了,為什麼hello-world映象沒有使用者名稱字首,而我剛建立的映象還要加上使用者名稱呢?

非常棒!其實這就是官方設計來區別映象究竟是官方提供的還是使用者自定義的。所有官方提供的映象如hello-world、mysql、nginx等等都是不帶字首的,而使用者自己建立的則需要帶上使用者名稱進行標識。

三、Docker倉庫管理

3。1 Docker倉庫相關命令

Docker與倉庫相關的命令主要包括docker search、docker pull、docker push、docker login等命令。

這些命令在前面的文章中都略有介紹,因此接下來我們直接透過一個案例來進行演示docker倉庫相關命令的操作,我們還是以上一篇文章的apache映象為例進行演示。

3。2 映象倉庫管理實戰

需求:

拉取官方apache映象,在本地執行容器並修改網站首頁,將修改首頁後的容器打包為映象,上傳到docker hub上前面建立的倉庫heimatengyun/test中,供以後下載使用。

步驟:

(1)下載httpd映象

[root@docker ~]# docker pull httpd:2。42。4: Pulling from library/httpdDigest: sha256:946c54069130dbf136903fe658fe7d113bd8db8004de31282e20b262a3e106fbStatus: Image is up to date for httpd:2。4docker。io/library/httpd:2。4

上一篇文章中已經下載過了,如果沒下載的話此處會看到層層下載的結果。

(2)執行容器並修改首頁

這個過程就是模擬製作映象,製作映象通常有兩種方式:一種是透過現有的映象執行容器,然後在容器內進行各種定製化操作,完成後再commit為新映象;第二種是直接透過DockerFile檔案來編寫映象。很顯然此次演示的是第一種方法

[root@docker ~]# docker run ——name mywebsite -p 8080:80 -d httpd:2。4 dfdc1c5909cbee23ba78354d7ce42aa1e4143b0a7510f50c6bbf1eae26a31d5e[root@docker ~]# docker psCONTAINER ID     IMAGE     COMMAND     CREATED     STATUS   PORTS       NAMESdfdc1c5909cb     httpd:2。4     “httpd-foreground”   7 seconds ago Up 2 seconds       0。0。0。0:8080->80/tcp   mywebsite[root@docker ~]#

根據前一篇文章的介紹,很顯然現在就可以訪問該容器mywebsite中執行的預設網站了。

此時訪問網站預設頁面顯示的內容為:It works! 接下來我們要修改該首頁內容為:wellcome to heimatengyun‘s website! (此處就不詳細介紹了,忘記的返回檢視上一篇文章)

[root@docker ~]# echo “wellcome to heimatengyun’s website”>index。html [root@docker ~]# cat index。html wellcome to heimatengyun‘s website[root@docker ~]# docker cp index。html mywebsite:/usr/local/apache2/htdocs/index。html

此時再在瀏覽器中訪問,就會發現已經變為自己修改後的首頁內容了。

(3)將容器打包為新映象

將容器打包為映象使用docker commit命令,我們先來看看該命令的基本用法。

語法:docker commit [選項] 容器ID或名稱 [倉庫[:版本]]

選項:

引數作用

-a作者資訊-m提交描述資訊

[root@docker ~]# docker commit -a “heimatengyun <2319704788@qq。com>” -m “my test imgages based on httpd:2。4” mywebsite test:0。1sha256:6036477c63eef58da0ce7219f67f9d21c389d51d129826e496e49a8161d94cfc[root@docker ~]# docker images          REPOSITORY       TAG       IMAGE ID         CREATED             SIZEtest             0。1       6036477c63ee     3 seconds ago       165MB

這樣我們就將mywebsite容器打包為了一個我們自定義的映象test,版本為0。1,接下來將進行上傳到遠端倉庫。

(4)將映象上傳到倉庫

還記得2。3中倉庫頁面上提示上傳的命令嗎?頁面上明確提示用命令docker push heimatengyun/test:tagname ,但是上一步我們打包的映象名稱為test:0。1,這在本地使用是沒有任何問題的,但是如果要上傳到遠端倉庫就要遵守他的規則,在打包映象名稱前需要新增使用者名稱。

因此有兩種選擇:

第一種是在上一步打包時,映象名稱前要加使用者名稱字首:heimatengyun/test:0。1;

另外一種用法是可以用docker tag命令重新命名映象。此處是為了演示docker tag的用法因此上一步故意沒有加上字首。在具體使用時你可以任意選擇一種。

docker tag命令的作用是新建一個新名稱的映象指向原來的映象,其語法:

docker tag 原來映象名[:TAG] 新映象名[:TAG]

[root@docker ~]# docker tag test:0。1 heimatengyun/test:0。1[root@docker ~]# docker imagesREPOSITORY         TAG       IMAGE ID           CREATED             SIZEheimatengyun/test   0。1       6036477c63ee       14 minutes ago     165MBtest               0。1       6036477c63ee       14 minutes ago     165MB

這樣我們就準備好了映象。根據輸出可以看到很明確的看到新老映象id相同,因此tag命令並非真正意義上新建立映象。

上傳之前需要先在docker客戶端登入到倉庫中,否則將會得到許可權拒絕的提示

[root@docker ~]# docker push heimatengyun/test:0。1The push refers to repository [docker。io/heimatengyun/test]4b5531dd46d8: Preparing 25a92d79dbfe: Preparing b5432b464616: Preparing e6699b4fc2e3: Preparing 762ba19e7ef1: Preparing f2cb0ecef392: Waiting denied: requested access to the resource is denied[root@docker ~]#

登入採用docker login命令。

基於安全性考慮,建議不要在一行命令中輸入使用者名稱和密碼直接登入,而是直接不帶賬號密碼等引數進行登入,在根據提示輸入賬號密碼。

[root@docker ~]# docker login。。。省略輸入賬號密碼步驟Login Succeeded[root@docker ~]#

登入成功後,會在當前使用者根目錄下建立。docker/config。json檔案,用於儲存使用者的認證資訊,下次就無須再手動登入。

[root@docker ~]# ll 。docker/config。json -rw————- 1 root root 181 Mar 4 10:14 。docker/config。json[root@docker ~]#

萬事具備,只欠上傳

[root@docker ~]# docker push heimatengyun/test:0。1The push refers to repository [docker。io/heimatengyun/test]4b5531dd46d8: Pushed 25a92d79dbfe: Mounted from library/httpd b5432b464616: Mounted from library/httpd e6699b4fc2e3: Mounted from library/httpd 762ba19e7ef1: Mounted from library/httpd f2cb0ecef392: Mounted from library/httpd 0。1: digest: sha256:0aadd890c2b083fcf52c1ab8b09aef1630ebf612de57429a36f7387bfacba6b3 size: 1574

上傳成功後,我們再次進入我們的倉庫,就可以看到剛上傳的0。1版本了。別人也可以透過映象名稱:heimatengyun/test 直接搜尋到。

初學者必會的docker倉庫相關概念

(5)下載使用

此時別人就可以下載使用我們上傳的映象了

為了演示,我們先刪除本地的映象heimatengyun/test:0。1和test:0。1,刪掉之前建立的mywebsite容器

[root@docker ~]# docker rmi heimatengyun/test:0。1Untagged: heimatengyun/test:0。1Untagged: heimatengyun/test@sha256:0aadd890c2b083fcf52c1ab8b09aef1630ebf612de57429a36f7387bfacba6b3[root@docker ~]# docker rmi test:0。1Untagged: test:0。1Deleted: sha256:6036477c63eef58da0ce7219f67f9d21c389d51d129826e496e49a8161d94cfcDeleted: sha256:cbfff65b403b2ed790072beab328976999c75ad7d2d9ca54a62a64491325ac3f[root@docker ~]# docker rm -f mywebsite mywebsite[root@docker ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES[root@docker ~]#

注意觀察,刪除heimatengyun/test:0。1和test:0。1映象時,提示的區別。一個是Untagged,另外一個是Deleted,請大家自己分析這個原理。

排除干擾後,直接從遠端倉庫把映象拉下來再執行

[root@docker ~]# docker pull heimatengyun/test:0。10。1: Pulling from heimatengyun/test68ced04f60ab: Already exists 35d35f1e0dc9: Already exists 8a918bf0ae55: Already exists d7b9f2dbc195: Already exists d56c468bde81: Already exists 936d6a341573: Pull complete Digest: sha256:0aadd890c2b083fcf52c1ab8b09aef1630ebf612de57429a36f7387bfacba6b3Status: Downloaded newer image for heimatengyun/test:0。1docker。io/heimatengyun/test:0。1[root@docker ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEheimatengyun/test 0。1 6036477c63ee 40 minutes ago 165MBmysql latest c8ad2be69a22 6 days ago 465MBhttpd 2。4 c5a012f9cf45 6 days ago 165MBcentos latest 470671670cac 6 weeks ago 237MB[root@docker ~]#

這樣就把映象從遠端倉庫拉取到本地了,在執行之前,我們來觀察一個有趣的現象,這個拉取過程非常快,並且有很多層已經提示Already exists 了。

我們透過這個現象,仔細分析一下深層次的含義:

首先:部分層提示已經存在Already exists,原因是我們前面映象時透過httpd映象建立容器然後打包而來,在本地已經存在了httpd映象,我們在做映象時僅僅是將容器內部的網站首頁名稱修改而言,因此他們基礎層是一樣的,這正是映象核心理念,透過這種共享機制不僅節約了儲存成本,還能加速映象下載和共享。

其次:如果你細心觀察的話,可以看到每一層的下載互不影響,都是並行在執行下載。

這正是前文講到的docker映象採用分層結構的好處。

接下來我們就把剛從遠端倉庫下載的映象執行起來,將容器名稱設為mynewwebsite,宿主機埠對映為8081。

[root@docker ~]# docker run -d ——name mynewwebsite -p 8081:80 heimatengyun/test:0。1 a15f183ec42db5ee531aa8c3135ac3cd39eed0416aedbd955ccadc27c61a7722[root@docker ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESa15f183ec42d heimatengyun/test:0。1 “httpd-foreground” 4 seconds ago Up 3 seconds 0。0。0。0:8081->80/tcp mynewwebsite[root@docker ~]#

此時我們再透過宿主機ip:8081埠去訪問,就可以直接看到我們修改過後的網頁。

這樣就完成了映象的定製化操作和共享。是不是很方便呢?

四、第三方倉庫

前文提到,由於Docker Hub是在國外,因此有時候網路可能不太穩定,在這種情況下,可以有兩種選擇方案:一種是科學上網(至於怎麼上,自行查閱);第二種則是採用國內雲廠商提供的三房倉庫加速器。

原理很簡單,之前已提到過。只不過要注意的是,前面的倉庫操作都是針對Docker Hub倉庫,而如果換為第三方的話,相應的賬號、映象儲存的位置也是在國內第三方雲平臺上,而非Docker Hub中。只是需要配置docker映象倉庫的儲存位置而已,操作方式和使用命令都一樣。

國內的阿里雲、網易雲等都提供了映象容器服務,根據自己的經驗,如果要使用映象加速器建議使用阿里雲的即可。

如果採用阿里雲docker映象加速,則需要註冊阿里雲開發者賬戶,獲取私有的加速器地址,然後將其配置到/etc/docker/daemon。json檔案即可。這個過程類似於在Docker Hub上建立自己的賬戶及倉庫。

具體操作就不演示了,如果你不會操作,請留言,根據反饋看是否有必要單獨寫一篇文章進行介紹。

五、Docker私倉搭建

如果你只想在企業內部大家區域網內部使用的私有倉庫,則直接使用docker官方提供的registry映象即可。這種場景在一般中小企業中很少見,因此不再簡介,有興趣可以直接檢視官網,如果有問題也可以給我留言。

其他更高階的倉庫服務以及Registry鑑權機制、Restfull Api監控等知識,以後有機會再在進階篇中演示。

Top