鏡像倉庫管理
docker倉庫,用來管理鏡像。主要分為公共倉庫和私人倉庫。下面介紹了公共倉庫Docker Hub、私人倉庫Registry和harbor。
DockerHUb倉庫管理
什么是DockerHUb
保存和分發(fā)鏡像的最直接方法就是使用 Docker Hub。
Docker Hub 是 Docker 公司維護的公共 Registry。用戶可以將自己的鏡像保存到 Docker Hub 免費的 repository 中,如果不希望別人訪問自己的鏡像,也可以購買私有 repository。
賬號注冊和登陸
一般,你需要先在docker中心創(chuàng)建一個賬戶(如果您尚未有)。你可以直接在Docker Hub創(chuàng)建你的賬戶。

如果有已有賬號可以點擊sign in 進行登錄,登陸后是這個樣子

Docker客戶端登錄
使用
docker login登錄dockerhub
這將提示您輸入用戶名,這個用戶名將成為你的公共存儲庫的命名空間名稱。如果你的名字可用,docker會提示您輸入一個密碼和你的郵箱,然后會自動登錄到Docker Hub,你現(xiàn)在可以提交和推送鏡像到Docker Hub的你的存儲庫。
docker login

出現(xiàn)
Login Succeeded就說明我們登錄成功注:你的身份驗證憑證將被存儲在你本地目錄的
.dockercfg文件中
管理鏡像
通過
docker images可以看到我們所有的鏡像列表
docker images
刪除鏡像
我們現(xiàn)在的
learn-docker-storage有三個版本,現(xiàn)在我們把前兩個有問題的版本刪除,docker rmi 鏡像ID可以刪除鏡像
docker rmi learn-docker-storage:0.0.1 learn-docker-storage:0.0.2

這樣我們就刪除了我們沒有用的鏡像了,可以節(jié)省內(nèi)存空間
修改鏡像命名
修改鏡像的 repository 使之與 Docker Hub 賬號匹配。
Docker Hub 為了區(qū)分不同用戶的同名鏡像,鏡像的 registry 中要包含用戶名,完整格式為:`[用戶名]/鏡像名:tag`
我們通過
docker tag命令重命名鏡像
docker tag learn-docker-storage:0.0.3 baiyp/learn-docker-storage:0.0.3

這樣就將我們的鏡像改名了,這個就符合我們的dockerhub的規(guī)范了
推送鏡像
推送鏡像
現(xiàn)在我們要將我們的鏡像推送到
docker hub推送鏡像的規(guī)范是
docker push 注冊用戶名/鏡像名:tag,因為我們上面已經(jīng)把鏡像名字改正確了,所以可以直接推送。
docker push baiyp/learn-docker-storage:0.0.3

這樣我們就將我們的數(shù)據(jù)推送到docker hub,我們發(fā)現(xiàn)只有最頂層的鏡像推送了,openjdk的鏡像并沒有推送,直接復(fù)用了倉庫的,這就是分層的好處
檢查鏡像
我們可以到
docker hub檢查我們的鏡像

可以看到我們的鏡像已經(jīng)推送過來了,點開詳情可以看到我們鏡像的內(nèi)容以及tag號

倉庫鏡像測試
刪除本地鏡像
可以通過
docker rmi 鏡像ID刪除本地鏡像
docker rmi baiyp/learn-docker-storage:0.0.3 learn-docker-storage:0.0.3

再次查看本地鏡像,已經(jīng)沒有了我們的微服務(wù)的鏡像
docker images

從倉庫拉取鏡像
這個時候可以從
docker hub拉取鏡像
docker pull baiyp/learn-docker-storage:0.0.3

這個時候已經(jīng)將鏡像拉取下來了,我們可以運行鏡像了
運行鏡像
執(zhí)行下面的命令進行創(chuàng)建鏡像
docker run -d \
-v /tmp/data/logs:/logs \
-p 8003:8003 \
--name learn-docker-storage \
--network=learn-docker-network \
baiyp/learn-docker-storage:0.0.3

訪問測試
我們訪問下,檢查下是否可以正常運行
curl http://192.168.64.153:8003/storage/employe/findByID/10001 | python -m json.tool

到這里我們就完成dockerhub倉庫的發(fā)布與拉取
直接運行測試
在真實環(huán)境中,我們一般不會拉取在運行,一般都是直接運行,如果docker檢查鏡像不存在會自動拉取
停止服務(wù)并刪除鏡像
docker rm -f learn-docker-storage
docker rmi baiyp/learn-docker-storage:0.0.3

我們直接運行容器
docker run -d \
-v /tmp/data/logs:/logs \
-p 8003:8003 \
--name learn-docker-storage \
--network=learn-docker-network \
baiyp/learn-docker-storage:0.0.3

這一個run命令就解決了容器的拉取以及容器運行的問題
registry倉庫管理
registry簡介
官方提供了Docker Hub網(wǎng)站來作為一個公開的集中倉庫。然而,本地訪問Docker Hub速度往往很慢,并且很多時候我們需要一個本地的私有倉庫只供網(wǎng)內(nèi)使用。
Docker倉庫實際上提供兩方面的功能,一個是鏡像管理,一個是認證。前者主要由docker-registry項目來實現(xiàn),通過http服務(wù)來上傳下載;后者可以通過docker-index(閉源)項目或者利用現(xiàn)成認證方案(如nginx)實現(xiàn)http請求管理。
docker registry 就是管理 docker 鏡像的服務(wù), Docker 公司維護的 registry 就是 http://hub.docker.com ,它可以讓我們方便的下載預(yù)先做好的鏡像。
安裝registry
我們可以通過獲取官方的
registry鏡像來運行。
這將使用官方提供的 `registry` 鏡像來啟動私有倉庫,默認情況下,倉庫會被創(chuàng)建在容器的 `/var/lib/registry` 目錄下。我們可以通過 `-v` 參數(shù)將鏡像文件存放在本地的指定路徑。
docker run -d \
-p 5000:5000 \
-v /tmp/data/registry:/var/lib/registry \
--restart=always \
registry

這樣我們的registry已經(jīng)啟動起來了
訪問測試
這時我們可以通過瀏覽器訪問
http://ip:5000/v2/_catalog查看倉庫是否啟動成功。
curl http://192.168.64.152:5000/v2/_catalog

上傳鏡像
registry 上傳鏡像的命名規(guī)范是
倉庫IP:5000/鏡像名稱:tag
修改鏡像名稱
將我們的鏡像改成服務(wù)規(guī)范的名字
docker tag baiyp/learn-docker-storage:0.0.3 192.168.64.153:5000/learn-docker-storage:0.0.3

推送鏡像
使用命令推送鏡像
docker push 192.168.64.153:5000/learn-docker-storage:0.0.3
我們發(fā)現(xiàn)推送報錯了,這是因為docker推送默認使用的https的方式,而我們的registry只支持http的方式

修改Docker推送配置
對于 Linux 系統(tǒng),我們可以在
/etc/docker/daemon.json(daemon.josn文件不存在則新建該文件)
vi /etc/docker/daemon.json
添加下面的配置
{ "insecure-registries": ["倉庫IP:5000"] }
完整的配置如下
{
"insecure-registries": ["192.168.64.153:5000"],
"registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]
}
執(zhí)行以下命令重啟重新加載配置并生效
systemctl daemon-reload
service docker restart

再次進行推送
執(zhí)行命令再次推送
docker push 192.168.64.153:5000/learn-docker-storage:0.0.3

我們發(fā)現(xiàn)這次推送成功了
再次訪問registry
訪問測試檢查是否已經(jīng)推送
curl http://192.168.64.153:5000/v2/_catalog | python -m json.tool

我們發(fā)現(xiàn)我們的鏡像已經(jīng)推送到了registry,我們通過以下URL訪問下tag列表
curl http://192.168.64.153:5000/v2/learn-docker-storage/tags/list | python -m json.tool

registry鏡像測試
刪除本地鏡像
可以通過
docker rmi 鏡像ID刪除本地鏡像
docker rmi baiyp/learn-docker-storage:0.0.3 192.168.64.153:5000/learn-docker-storage:0.0.3

運行registry中的鏡像
docker run -d \
-v /tmp/data/logs:/logs \
-p 8003:8003 \
--name learn-docker-storage \
--network=learn-docker-network \
192.168.64.153:5000/learn-docker-storage:0.0.3

我們發(fā)現(xiàn)自己的registry很快就拉取并且運行起來了
訪問微服務(wù)測試
curl http://192.168.64.153:8003/storage/employe/findByID/10001 | python -m json.tool

使用Harbor管理倉庫
什么是Harbor
harbor是一個由vm公司開源的企業(yè)級容器鏡像倉庫,有以下功能
- 管理用戶界面
- 基于角色的訪問控制
- LDAP/AD 集成及日志審計等基本運維操作
harbor是構(gòu)建企業(yè)級私有docker鏡像的倉庫的開源解決方案,它是 Docker Registry的更高級封裝,它除了提供友好的Web UI界面,角色和用戶權(quán)限管理,用戶操作審計等功能外,它還整合了K8s的插件(Add-ons)倉 庫,即Helm通過chart方式下載,管理,安裝K8s插件,而chartmuseum 可以提供存儲chart數(shù)據(jù)的倉庫。
另外它還整合了兩個開源的安全組件,一個是Notary,另一個是Clair,Notary類似 于私有CA中心,而Clair則是容器安全掃描工具,它通過各大廠商提供的 CVE漏洞庫來獲取最新漏洞信息,并掃描用戶上傳的容器是否存在已知的 漏洞信息,這兩個安全功能對于企業(yè)級私有倉庫來說是非常具有意義的。
Harbor的三種安裝方式
這里我們使用離線安裝
- 在線安裝:從Docker Hub下載Harbor相關(guān)鏡像,因此安裝軟件包非常小
- 離線安裝:安裝包包含部署的相關(guān)鏡像,因此安裝包比較大
- OVA安裝程序(第三方):當用戶具有vCenter環(huán)境時,使用此安裝程序,在部署 OVA后啟動Harbor
為什么使用私用倉庫
公司的項目一般不予許我們上傳到 Docker Hub 這類的公共倉庫中,所有學(xué)會創(chuàng)建一個私有倉庫也是非常必要的
雖然`hub.docker.com`上可以保存鏡像,但是網(wǎng)速相對較慢,在內(nèi)部環(huán)境中搭建一個私有的公共倉庫是個更好的方案。
harbor 的基本組件
| 組件 | 功能 |
|---|---|
| harbor-adminserver | 配置管理中心 |
| harbor-db | 數(shù)據(jù)庫 |
| harbor-jobservice | 鏡像復(fù)制 |
| harbor-log | 日志操作 |
| harbor-ui | Web管理頁面和API |
| nginx | 前端代理,負責前端頁面和鏡像上傳/下載轉(zhuǎn)發(fā) |
| redis | 會話 |
| registry | 鏡像存儲 |
前置工作
下載安裝包
Harbor官方地址:https://github.com/goharbor/harbor/releases 下載最新版安裝包

準備環(huán)境
需要安裝docker以及docker-compose的環(huán)境上面我們已提前安裝了
- 安裝Docker環(huán)境
- 安裝docker-compose環(huán)境
離線安裝
解壓安裝包
解壓harbor的安裝包
tar -zxf harbor-offline-installer-v2.1.4.tgz
進入目錄 然后將
harbor.yml.tmp復(fù)制一份并該命為harbor.yml
cd harbor
cp harbor.yml.tmpl harbor.yml

注意: 這里跟老版本不一樣,沒有了harbor.cfg文件,我們需要手動復(fù)制harbor.yml.tmpl在做修改即可
修改harbor.yml
harbor作為私有倉庫作用在公司內(nèi)網(wǎng),一般都是信任關(guān)系,沒多大必要做https,使用http即可!
所以 把https相關(guān)的已經(jīng)注釋掉

并注意配置文件的用戶名密碼配置,默認是 用戶名是:admin,密碼是:Harbor12345,如果修改需要安裝前修改
加載本地鏡像
使用
docker load命令加載本地鏡像,不用再從dockerhub下載了
docker load -i harbor.v2.1.4.tar.gz

這樣容器鏡像就被加載到了本地,我們可以通過
docker images命令查看導(dǎo)入的鏡像
docker images

執(zhí)行安裝命令
先執(zhí)行預(yù)處理命令,會創(chuàng)建一些文件夾,初始化一些文件
./prepare

然后開始真正的安裝過程
./install.sh

如果出現(xiàn)
-Harbor has been installed and started successfully表示安裝成功,并查看docker進程
docker ps

可以看到很多服務(wù)已經(jīng)起來了。
啟動和停止harbor
在harbor的安裝目錄執(zhí)行以下命令就可以啟動和停止了
# 啟動
docker-compose up -d
# 停止
docker-compose stop
# 重新啟動
docker-compose restart
harbor使用
訪問harbor
輸入
http://harborIP就可以直接訪問了,這里訪問我們的地址http://192.168.64.153/

輸入用戶名密碼就可以登錄了 ,如果沒有修改配置文件 默認是 用戶名是:admin,密碼是:Harbor12345

登錄后就可以進行操作了
Docker登錄harbor
使用docker login命令就可以登錄harbor了
docker login -u admin -p Harbor12345 192.168.64.153

我們發(fā)現(xiàn)登錄報錯了,這和registry一樣,docker模式使用https方式,而我們使用的是http的方式登錄
修改Docker配置
對于 Linux 系統(tǒng),我們可以在
/etc/docker/daemon.json(daemon.josn文件不存在則新建該文件)
vi /etc/docker/daemon.json
添加下面的配置
{ "insecure-registries": ["harbor地址"] }
完整的配置如下
{
#因為默認端口號是80 所以不需要加端口號
"insecure-registries": ["192.168.64.153"],
"registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]
}
執(zhí)行以下命令重啟重新加載配置并生效
systemctl daemon-reload
service docker restart

再次進行登錄
docker login -u admin -p Harbor12345 192.168.64.153
這次我們就成功登錄了

到這里我們就已經(jīng)登錄成功了
修改鏡像tag
我們推送鏡像我要把我們的鏡像名稱改成符合規(guī)范的格式
docker tag \
192.168.64.153:5000/learn-docker-storage:0.0.3 \
192.168.64.153/library/learn-docker-storage:0.0.3

這里有一個
library路徑,是harbor默認的項目名稱

推送鏡像
可以通過
docker push進行推送鏡像,注意需要先登錄在進行推送
docker push 192.168.64.153/library/learn-docker-storage:0.0.3

到這里我們已經(jīng)推送到了harbor,我們可以登錄library頁面查看

harbor 測試
刪除本地鏡像
可以通過
docker rmi 鏡像ID刪除本地鏡像
docker rmi \
192.168.64.153:5000/learn-docker-storage:0.0.3 \
192.168.64.153/library/learn-docker-storage:0.0.3

運行harbor 中的鏡像
執(zhí)行運行命令
docker run -d \
-v /tmp/data/logs:/logs \
-p 8003:8003 \
--name learn-docker-storage \
--network=learn-docker-network \
192.168.64.153/library/learn-docker-storage:0.0.3

訪問微服務(wù)測試
curl http://192.168.64.153:8003/storage/employe/findByID/10001 | python -m json.tool

查看harbor詳情
詳情里面會顯示拉取次數(shù)

HarBor用戶權(quán)限說明
HarBor用戶角色在項目(項目-成員-新加成員)中為3類:項目管理員、開發(fā)人員、訪客
- 項目管理員:增刪改查
- 開發(fā)人員:上傳和下載
- 訪客:只允許下載
HarBor權(quán)限配置
新建用戶
點擊創(chuàng)建用戶可以創(chuàng)建一個用戶

我們創(chuàng)建一個itcast的用戶

用戶授權(quán)
創(chuàng)建用戶后進入項目模塊添加成員

選擇成員后并選擇權(quán)限

訪客只能進行拉取不能推送和管理

用戶登錄測試
我們用
itcast用戶通過web端登錄測試下,我們發(fā)現(xiàn)用戶是沒有修改權(quán)限的

docker登錄測試
登錄docker客戶端
docker login -u itcast -p Qwert123 192.168.64.153

嘗試推送鏡像
docker push 192.168.64.153/library/learn-docker-storage:0.0.3

我們發(fā)現(xiàn)是無法進行推送鏡像的
拉取鏡像測試
先刪除本地的容器以及鏡像
docker rm -f learn-docker-storage
docker rmi 192.168.64.153/library/learn-docker-storage:0.0.3

嘗試拉取并啟動本地鏡像
docker run -d \
-v /tmp/data/logs:/logs \
-p 8003:8003 \
--name learn-docker-storage \
--network=learn-docker-network \
192.168.64.153/library/learn-docker-storage:0.0.3

微服務(wù)訪問測試
curl http://192.168.64.153:8003/storage/employe/findByID/10001 | python -m json.tool

Harbor支持Https(擴展)
為了支持微服務(wù)推送我們需要將
HarBor設(shè)置為https,可以讓HarBor在任何地方使用以及推送
生成SSL證書
前面說了怎么搭建harbor倉庫,這里講一講harbor實現(xiàn)https訪問,因為只需要內(nèi)網(wǎng)訪問,沒必要去申請一個ssl證書,所以我就用
openssl頒發(fā)自簽名證書,實現(xiàn)https訪問。
創(chuàng)建證書目錄
mkdir -p /tmp/data/cert && cd /tmp/data/cert && ll

創(chuàng)建 CA 根證書
openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 365 -out ca.crt -subj "/C=CN/L=beijing/O=itcast/CN=harbor-registry"
這里subj是主題的意思含義如下
C=國家,S=?。ㄊ校琇=區(qū)(縣、市),O=組織機構(gòu),OU=組織單位,CN=通用名稱
生成證書簽名
生成一個證書簽名, 設(shè)置訪問域名為
itcastharbor.com
openssl req -newkey rsa:4096 -nodes -sha256 -keyout itcastharbor.com.key -out server.csr -subj "/C=CN/L=beijing/O=itcast/CN=itcastharbor.com"
生成主機證書
openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out itcastharbor.com.crt
操作步驟如下

配置harbor.yml
然后進入harbor安裝目錄修改
harbor.yml,修改下面幾個選項
- hostname,使用IP或域名,不要用回環(huán)地址,localhost等
-
certificate,yourdomain.com.crt的路徑
/tmp/data/cert/itcastharbor.com.crt -
private_key,yourdomainr.com.key的路徑
/tmp/data/cert/itcastharbor.com.key

重新安裝harbor服務(wù)
停止harbor
停止運行中的服務(wù)
docker-compose down
運行目錄harbor下的prepare完成https的配置
./prepare

重新安裝
在harbor目錄下運行安裝命令
./install.sh

修改Docker推送配置
我們需要將推送的IP改成域名
vi /etc/docker/daemon.json
上文中我們對registry已經(jīng)操作了,這里需要改用harbor,需要重新配置
#因為默認端口號是80 所以不需要加端口號
{ "insecure-registries": ["倉庫IP或域名"] }
完整的配置如下
{
"insecure-registries": ["itcastharbor.com"],
"registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]
}
執(zhí)行以下命令重啟重新加載配置并生效
systemctl daemon-reload
service docker restart
修改本地host文件
為了讓本機能夠正常訪問到harbor的web環(huán)境需要配置本地的hosts文件增加如下配置
192.168.64.153 itcastharbor.com
windows環(huán)境下host路徑在
C:\Windows\System32\drivers\etc
域名訪問harbor
通過域名訪問harbor,域名就是我們剛才配置的
itcastharbor.com域名訪

因為我們的證書是自簽的,不是第三方認證的,素以有安全性提示,點擊繼續(xù)就可以訪問

到這里登錄后就可以訪問了

本文由育博學(xué)谷狂野架構(gòu)師發(fā)布
如果本文對您有幫助,歡迎關(guān)注和點贊;如果您有任何建議也可留言評論或私信,您的支持是我堅持創(chuàng)作的動力
轉(zhuǎn)載請注明出處!