鏡像倉庫管理 docker倉庫,用來管理鏡像。主要分為公共倉庫和私人倉庫。下麵介紹了公共倉庫Docker Hub、私人倉庫Registry和harbor。 DockerHUb倉庫管理 什麼是DockerHUb 保存和分發鏡像的最直接方法就是使用 Docker Hub。 Docker Hub 是 ...
鏡像倉庫管理
docker倉庫,用來管理鏡像。主要分為公共倉庫和私人倉庫。下麵介紹了公共倉庫Docker Hub、私人倉庫Registry和harbor。
DockerHUb倉庫管理
什麼是DockerHUb
保存和分發鏡像的最直接方法就是使用 Docker Hub。
Docker Hub 是 Docker 公司維護的公共 Registry。用戶可以將自己的鏡像保存到 Docker Hub 免費的 repository 中,如果不希望別人訪問自己的鏡像,也可以購買私有 repository。
賬號註冊和登陸
一般,你需要先在docker中心創建一個賬戶(如果您尚未有)。你可以直接在Docker Hub創建你的賬戶。
如果有已有賬號可以點擊sign in 進行登錄,登陸後是這個樣子
Docker客戶端登錄
使用
docker login
登錄dockerhub
這將提示您輸入用戶名,這個用戶名將成為你的公共存儲庫的命名空間名稱。如果你的名字可用,docker會提示您輸入一個密碼和你的郵箱,然後會自動登錄到Docker Hub,你現在可以提交和推送鏡像到Docker Hub的你的存儲庫。
docker login
出現
Login Succeeded
就說明我們登錄成功註:你的身份驗證憑證將被存儲在你本地目錄的
.dockercfg
文件中
管理鏡像
通過
docker images
可以看到我們所有的鏡像列表
docker images
刪除鏡像
我們現在的
learn-docker-storage
有三個版本,現在我們把前兩個有問題的版本刪除,docker rmi 鏡像ID
可以刪除鏡像
docker rmi learn-docker-storage:0.0.1 learn-docker-storage:0.0.2
這樣我們就刪除了我們沒有用的鏡像了,可以節省記憶體空間
修改鏡像命名
修改鏡像的 repository 使之與 Docker Hub 賬號匹配。
Docker Hub 為了區分不同用戶的同名鏡像,鏡像的 registry 中要包含用戶名,完整格式為:[用戶名]/鏡像名:tag
我們通過
docker tag
命令重命名鏡像
docker tag learn-docker-storage:0.0.3 baiyp/learn-docker-storage:0.0.3
這樣就將我們的鏡像改名了,這個就符合我們的dockerhub的規範了
推送鏡像
推送鏡像
現在我們要將我們的鏡像推送到
docker hub
推送鏡像的規範是
docker push 註冊用戶名/鏡像名:tag
,因為我們上面已經把鏡像名字改正確了,所以可以直接推送。
docker push baiyp/learn-docker-storage:0.0.3
這樣我們就將我們的數據推送到docker hub,我們發現只有最頂層的鏡像推送了,openjdk的鏡像並沒有推送,直接復用了倉庫的,這就是分層的好處
檢查鏡像
我們可以到
docker hub
檢查我們的鏡像
可以看到我們的鏡像已經推送過來了,點開詳情可以看到我們鏡像的內容以及tag號
倉庫鏡像測試
刪除本地鏡像
可以通過
docker rmi 鏡像ID
刪除本地鏡像
docker rmi baiyp/learn-docker-storage:0.0.3 learn-docker-storage:0.0.3
再次查看本地鏡像,已經沒有了我們的微服務的鏡像
docker images
從倉庫拉取鏡像
這個時候可以從
docker hub
拉取鏡像
docker pull 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
訪問測試
我們訪問下,檢查下是否可以正常運行
curl http://192.168.64.153:8003/storage/employe/findByID/10001 | python -m json.tool
到這裡我們就完成dockerhub倉庫的發佈與拉取
直接運行測試
在真實環境中,我們一般不會拉取在運行,一般都是直接運行,如果docker檢查鏡像不存在會自動拉取
停止服務並刪除鏡像
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網站來作為一個公開的集中倉庫。然而,本地訪問Docker Hub速度往往很慢,並且很多時候我們需要一個本地的私有倉庫只供網內使用。
Docker倉庫實際上提供兩方面的功能,一個是鏡像管理,一個是認證。前者主要由docker-registry項目來實現,通過http服務來上傳下載;後者可以通過docker-index(閉源)項目或者利用現成認證方案(如nginx)實現http請求管理。
docker registry 就是管理 docker 鏡像的服務, Docker 公司維護的 registry 就是 http://hub.docker.com ,它可以讓我們方便的下載預先做好的鏡像。
安裝registry
我們可以通過獲取官方的
registry
鏡像來運行。
這將使用官方提供的 registry
鏡像來啟動私有倉庫,預設情況下,倉庫會被創建在容器的 /var/lib/registry
目錄下。我們可以通過 -v
參數將鏡像文件存放在本地的指定路徑。
docker run -d \
-p 5000:5000 \
-v /tmp/data/registry:/var/lib/registry \
--restart=always \
registry
這樣我們的registry已經啟動起來了
訪問測試
這時我們可以通過瀏覽器訪問
http://ip:5000/v2/_catalog
查看倉庫是否啟動成功。
curl http://192.168.64.152:5000/v2/_catalog
上傳鏡像
registry 上傳鏡像的命名規範是
倉庫IP:5000/鏡像名稱:tag
修改鏡像名稱
將我們的鏡像改成服務規範的名字
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
我們發現推送報錯了,這是因為docker推送預設使用的https的方式,而我們的registry只支持http的方式
修改Docker推送配置
對於 Linux 系統,我們可以在
/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"]
}
執行以下命令重啟重新載入配置並生效
systemctl daemon-reload
service docker restart
再次進行推送
執行命令再次推送
docker push 192.168.64.153:5000/learn-docker-storage:0.0.3
我們發現這次推送成功了
再次訪問registry
訪問測試檢查是否已經推送
curl http://192.168.64.153:5000/v2/_catalog | python -m json.tool
我們發現我們的鏡像已經推送到了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
我們發現自己的registry很快就拉取並且運行起來了
訪問微服務測試
curl http://192.168.64.153:8003/storage/employe/findByID/10001 | python -m json.tool
使用Harbor管理倉庫
什麼是Harbor
harbor是一個由vm公司開源的企業級容器鏡像倉庫,有以下功能
- 管理用戶界面
- 基於角色的訪問控制
- LDAP/AD 集成及日誌審計等基本運維操作
harbor是構建企業級私有docker鏡像的倉庫的開源解決方案,它是 Docker Registry的更高級封裝,它除了提供友好的Web UI界面,角色和用戶許可權管理,用戶操作審計等功能外,它還整合了K8s的插件(Add-ons)倉 庫,即Helm通過chart方式下載,管理,安裝K8s插件,而chartmuseum 可以提供存儲chart數據的倉庫。
另外它還整合了兩個開源的安全組件,一個是Notary,另一個是Clair,Notary類似 於私有CA中心,而Clair則是容器安全掃描工具,它通過各大廠商提供的 CVE漏洞庫來獲取最新漏洞信息,並掃描用戶上傳的容器是否存在已知的 漏洞信息,這兩個安全功能對於企業級私有倉庫來說是非常具有意義的。
Harbor的三種安裝方式
這裡我們使用離線安裝
- 線上安裝:從Docker Hub下載Harbor相關鏡像,因此安裝軟體包非常小
- 離線安裝:安裝包包含部署的相關鏡像,因此安裝包比較大
- OVA安裝程式(第三方):當用戶具有vCenter環境時,使用此安裝程式,在部署 OVA後啟動Harbor
為什麼使用私用倉庫
公司的項目一般不予許我們上傳到 Docker Hub 這類的公共倉庫中,所有學會創建一個私有倉庫也是非常必要的
雖然hub.docker.com
上可以保存鏡像,但是網速相對較慢,在內部環境中搭建一個私有的公共倉庫是個更好的方案。
harbor 的基本組件
組件 | 功能 |
---|---|
harbor-adminserver | 配置管理中心 |
harbor-db | 資料庫 |
harbor-jobservice | 鏡像複製 |
harbor-log | 日誌操作 |
harbor-ui | Web管理頁面和API |
nginx | 前端代理,負責前端頁面和鏡像上傳/下載轉發 |
redis | 會話 |
registry | 鏡像存儲 |
前置工作
下載安裝包
Harbor官方地址:https://github.com/goharbor/harbor/releases 下載最新版安裝包
準備環境
需要安裝docker以及docker-compose的環境上面我們已提前安裝了
- 安裝Docker環境
- 安裝docker-compose環境
離線安裝
解壓安裝包
解壓harbor的安裝包
tar -zxf harbor-offline-installer-v2.1.4.tgz
進入目錄 然後將
harbor.yml.tmp
複製一份並該命為harbor.yml
cd harbor
cp harbor.yml.tmpl harbor.yml
註意: 這裡跟老版本不一樣,沒有了harbor.cfg文件,我們需要手動複製harbor.yml.tmpl在做修改即可
修改harbor.yml
harbor作為私有倉庫作用在公司內網,一般都是信任關係,沒多大必要做https,使用http即可!
所以 把https相關的已經註釋掉
並註意配置文件的用戶名密碼配置,預設是 用戶名是:admin,密碼是:Harbor12345,如果修改需要安裝前修改
載入本地鏡像
使用
docker load
命令載入本地鏡像,不用再從dockerhub下載了
docker load -i harbor.v2.1.4.tar.gz
這樣容器鏡像就被載入到了本地,我們可以通過
docker images
命令查看導入的鏡像
docker images
執行安裝命令
先執行預處理命令,會創建一些文件夾,初始化一些文件
./prepare
然後開始真正的安裝過程
./install.sh
如果出現
-Harbor has been installed and started successfully
表示安裝成功,並查看docker進程
docker ps
可以看到很多服務已經起來了。
啟動和停止harbor
在harbor的安裝目錄執行以下命令就可以啟動和停止了
# 啟動
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
我們發現登錄報錯了,這和registry一樣,docker模式使用https方式,而我們使用的是http的方式登錄
修改Docker配置
對於 Linux 系統,我們可以在
/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"]
}
執行以下命令重啟重新載入配置並生效
systemctl daemon-reload
service docker restart
再次進行登錄
docker login -u admin -p Harbor12345 192.168.64.153
這次我們就成功登錄了
到這裡我們就已經登錄成功了
修改鏡像tag
我們推送鏡像我要把我們的鏡像名稱改成符合規範的格式
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
到這裡我們已經推送到了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 中的鏡像
執行運行命令
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
訪問微服務測試
curl http://192.168.64.153:8003/storage/employe/findByID/10001 | python -m json.tool
查看harbor詳情
詳情裡面會顯示拉取次數
HarBor用戶許可權說明
HarBor用戶角色在項目(項目-成員-新加成員)中為3類:項目管理員、開發人員、訪客
- 項目管理員:增刪改查
- 開發人員:上傳和下載
- 訪客:只允許下載
HarBor許可權配置
新建用戶
點擊創建用戶可以創建一個用戶
我們創建一個itcast的用戶
用戶授權
創建用戶後進入項目模塊添加成員
選擇成員後並選擇許可權
訪客只能進行拉取不能推送和管理
用戶登錄測試
我們用
itcast
用戶通過web端登錄測試下,我們發現用戶是沒有修改許可權的
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
我們發現是無法進行推送鏡像的
拉取鏡像測試
先刪除本地的容器以及鏡像
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
微服務訪問測試
curl http://192.168.64.153:8003/storage/employe/findByID/10001 | python -m json.tool
Harbor支持Https(擴展)
為了支持微服務推送我們需要將
HarBor
設置為https,可以讓HarBor
在任何地方使用以及推送
生成SSL證書
前面說了怎麼搭建harbor倉庫,這裡講一講harbor實現https訪問,因為只需要內網訪問,沒必要去申請一個ssl證書,所以我就用
openssl
頒發自簽名證書,實現https訪問。
創建證書目錄
mkdir -p /tmp/data/cert && cd /tmp/data/cert && ll
創建 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=省(市),L=區(縣、市),O=組織機構,OU=組織單位,CN=通用名稱
生成證書簽名
生成一個證書簽名, 設置訪問功能變數名稱為
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或功能變數名稱,不要用迴環地址,localhost等
- certificate,yourdomain.com.crt的路徑
/tmp/data/cert/itcastharbor.com.crt
- private_key,yourdomainr.com.key的路徑
/tmp/data/cert/itcastharbor.com.key
重新安裝harbor服務
停止harbor
停止運行中的服務
docker-compose down
運行目錄harbor下的prepare完成https的配置
./prepare
重新安裝
在harbor目錄下運行安裝命令
./install.sh
修改Docker推送配置
我們需要將推送的IP改成功能變數名稱
vi /etc/docker/daemon.json
上文中我們對registry已經操作了,這裡需要改用harbor,需要重新配置
#因為預設埠號是80 所以不需要加埠號
{ "insecure-registries": ["倉庫IP或功能變數名稱"] }
完整的配置如下
{
"insecure-registries": ["itcastharbor.com"],
"registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]
}
執行以下命令重啟重新載入配置並生效
systemctl daemon-reload
service docker restart
修改本地host文件
為了讓本機能夠正常訪問到harbor的web環境需要配置本地的hosts文件增加如下配置
192.168.64.153 itcastharbor.com
windows環境下host路徑在
C:\Windows\System32\drivers\etc
功能變數名稱訪問harbor
通過功能變數名稱訪問harbor,功能變數名稱就是我們剛纔配置的
itcastharbor.com
功能變數名稱訪
因為我們的證書是自簽的,不是第三方認證的,素以有安全性提示,點擊繼續就可以訪問
到這裡登錄後就可以訪問了
本文由
傳智教育博學谷
教研團隊發佈。如果本文對您有幫助,歡迎
關註
和點贊
;如果您有任何建議也可留言評論
或私信
,您的支持是我堅持創作的動力。轉載請註明出處!