前文我們已經介紹了 docker 并安裝了 docker,下面我們將正式步入使用環節,本章是第一個使用教學:docker 鏡像倉庫。
一、什么是鏡像倉庫
所謂鏡像倉庫,其實就是負責存儲、管理和分發鏡像的倉庫,并且建立了倉庫的索引,提供了登錄認證能力。
鏡像倉庫可以看做一個大倉庫,其內部又管理多個小鏡像倉庫(Repository),這些小鏡像倉庫通過命名來區分。
每個 Repository 包含一個或多個鏡像,鏡像之間則通過鏡像名稱和標簽 (Tag)來區分。

大鏡像倉庫(Registry)
鏡像倉庫可以看做一個大倉庫,要從哪一個鏡像倉庫拉取鏡像,通常通過 DNS 或 IP 地址來確定一個鏡像倉庫(如hub.docker.com)。一個 Registry 中可以存在多個 Repository。
小鏡像倉庫(Repository)?
由某特定的 docker 鏡像的所有迭代版本組成的鏡像倉庫;又可分為“頂層倉庫”和“用戶倉庫”,用戶倉庫名稱格式為“用戶名 /?倉庫名”。
每個倉庫可以包含多個 Tag(標簽),每個標簽對應一個鏡像。(鏡像名稱(name)+標簽(tag):如 nginx:latest)認證能力:
提供用戶注冊,登錄、登出鏡像倉庫的能力。
索引:
提供鏡像的索引信息,方便檢索。
一個容器鏡像實際包含了兩個部分:
一個是元數據(存儲鏡像信息的數據),其實就是由 dockerfile 構建出來的描述文件,這個描述文件會說這個容器鏡像有多少層,每一層里面有什么內容,它的 checksum 這些信息都會記錄下來,還有最終的可執行文件在哪,都是在這個元數據里面。
還有一個是 blob 文件,它真正保存了數據,也真正占用空間。
二、鏡像倉庫的分類
1、以是否對外開放劃分種類(研發人員常用):
(1)公有倉庫:像阿里云、docker hub 等放到公有網絡上的鏡像倉庫,不用登錄就可以下載鏡像,供大家訪問使用。
(2)私有倉庫:不對外開放,往往位于私有網絡,只有公司內部人員可以使用。
2、按供應商和面向群體劃分種類
(1)sponsor(贊助) registry:第三方的 registry,供客戶和 docker 社區版使用。
(2)mirror(鏡像) registry:第三方的 registry,只讓客戶使用,例如阿里云必須注冊才能使用。
(3)vendor(供應商) registry:由發布 docker 鏡像的供應商提供的 registry,例如像 Google 和 Redhat 提供了鏡像倉庫服務。
(4)private registry:通過沒有防火墻和額外的安全層的私有實體提供的 registry,僅供內部使用。
三、鏡像倉庫的工作機制
1、鏡像倉庫的使用流程
(1)通過 docker login 登錄倉庫
(2)Docker pull 拉取需要的鏡像
(3)通過 dockerfile 或者 commit 等方式制作完鏡像再通過 docker push 上傳到倉庫
2、在實際研發中鏡像倉庫如何使用
Docker Registry 中的鏡像通常由開發人員制作,而后推送至“公共”或“私有”Registry 上保存,供其他人員使用,例如“部署”到生產環境。

開發環境:開發人員使用的一套環境
測試環境:需求開發完成后,發布到供測試人員進行測試的環境
預發布環境:版本測試完成后,發布到和生產類似的環境,提前模擬生產發布
生產環境:真正面向客戶的環境
3、鏡像倉庫的拉取機制
啟動容器時,docker daemon 會試圖從本地獲取相關的鏡像;本地鏡像不存在時,其會從 Registry 中下載該鏡像并保存到本地。
四、常見的鏡像倉庫
1、docker hub(已被封禁,可以拉取公有鏡像,但無法登陸私有倉庫)
注意:截止至文章發布,因某些原因,docker hub 在國內已經被封禁,無法通過國內網絡訪問,僅可以拉取公有鏡像!
Docker Hub 是 Docker 提供的托管存儲庫服務,用于查找容器映像并與團隊共享。
具有以下功能:
(1)個人可以注冊私有倉庫,能夠發布自己的鏡像
(2)提供鏡像檢索能力
(3)提供海量官方和認證組織的鏡像
(4)從 GitHub 和 Bitbucket 自動構建容器鏡像并將它們推送到 Docker Hub
(5)支持 webhook(webhook 是一種基于 HTTP 的回調函數,發生指定的事件時,服務器會自動將相關的有效負載發送到客戶端的 webhook URL)
docker hub 的功能瀏覽
1、搜索鏡像
?2、鏡像 tag 查找
3、對應版本拉取命令
4、鏡像的大小,id,cpu 架構查看
2、國內公有鏡像倉庫
由于 docker hub 已經被封禁,通過正常渠道,我們只能訪問國內各大云服務商提供的鏡像倉庫,如騰訊、阿里、華為等,筆者由于云服務器是華為云的,因此這里給出華為云鏡像倉庫的鏈接以及如何創建私有的鏡像倉庫:
華為開源鏡像倉庫
Docker華為云創建私人鏡像倉庫
3、私有倉庫
私有鏡像倉庫則是指部署在公司或組織內部的,用于自身應用 Docker 鏡像存儲、分發的鏡像倉庫。
在構建公司內部使用的自動化發布系統的過程中,從安全的角度出發,應用的打包鏡像一般情況下只會被存儲在私有鏡像倉庫中,CI / CD 流程的銜接點也是通過向私有鏡像倉庫上傳鏡像和拉取鏡像的操作來完成的。
常見的私有倉庫工具:
Harbor:Harbor:?
VMware 公司最近開源的企業級 Docker Registry 項目, 其目標是幫助用戶迅速搭建一個企業級的 Docker registry 服務。它以 Docker 公司開源的registry 為基礎,提供了管理 UI, 基于角色的訪問控制(Role Based Access Control),AD/LDAP 集成、以及審計日志(Audit logging) 等企業用戶需求的功能,同時還原生支持中文。Harbor 的每個組件都是以 Docker 容器的形式構建的,使用 Docker Compose 來對它進行部署。
Nexus:
Nexus 是 Sonatype 公司發布的一款倉庫(Repository)管理軟件,目前常被用來作為 Maven 私服、Docker 私服。
Docker registry:
由 docker 官方提供的私服,類似于 docker hub。用于保存公司內部上傳的 Docker 鏡像。
五、核心:鏡像倉庫相關命令
命令清單
命令 | 別名 | 功能 | 備注 |
docker login | 登錄倉庫(在拉取私人鏡像 / 向個人倉庫推送鏡像時,需要使用) | 必須掌握 | |
docker logout | 登出倉庫 | ||
docker pull | docker image pull | 從倉庫拉取鏡像(拉取公有鏡像不需要登錄) | 必須掌握 |
docker push | docker image push | 向倉庫推送鏡像 | 必須掌握 |
docker search | 查找鏡像倉庫中某個鏡像(一般直接在網頁查詢了,用的較少) |
1、docker login
# 注意:[]表示可選項,可有可無,后面都是如此,這里特別說明,后面不再贅述
docker login [核心參數] [鏡像倉庫地址]
核心參數:
-u(鏡像倉庫的用戶名)
-p(鏡像倉庫的密碼,建議不要在命令行中輸入,會被看見)
功能:登陸到一個 Docker 鏡像倉庫,如果未指定鏡像倉庫地址,默認為官方倉庫 Docker Hub。?

2、docker pull
# 此處的 TAG 指的是鏡像標簽;DIGEST則是另一種表示,sha256的值
docker pull [關鍵參數] 鏡像倉庫名[:TAG 或者 @DIGEST]
關鍵參數:
-a:拉取指定倉庫中的某一鏡像的所有不同版本。
--disable-content-trust :忽略鏡像的校驗,默認開啟
功能:從鏡像倉庫中拉取指定鏡像
# 示例:拉取 nginx 1.23.3 版本
docker pull nginx:1.23.3
3、docker push
docker push [關鍵參數] 鏡像名稱[:TAG]
關鍵參數:
-a:推送某一鏡像的所有不同版本。
--disable-content-trust :忽略鏡像的校驗,默認開啟
功能:把本地鏡像上傳至當前登錄的鏡像倉庫
# 示例:向自己的的倉庫推送 myapache v1 版本
docker push myapache:v1
4、docker search
# 因 docker hub 被國內封禁,此命令暫時無法實操
docker search [關鍵參數] 鏡像名稱
關鍵參數
--no-trunc:顯示完整的鏡像描述;
?-f <過濾條件>:列出收藏數不小于指定值的鏡像。
功能:查找鏡像倉庫中某個鏡像(一般直接在網頁查詢了,用的較少)
# 從 Docker Hub 查找所有鏡像名包含 nginx,并且 star 數大于 10 的鏡像
docker search -f stars=10 nginx
?5、docker logout
docker logout [鏡像倉庫地址]
功能:登出鏡像倉庫