私有鏡像倉庫配置了自簽名證書,https訪問,好處是不需要處理免費證書和付費證書帶來的證書文件變更,證書文件變更后需要重啟服務,自簽名證書需要將一套客戶端證書存放在/etc/docker/cert.d目錄下,或者/etc/containerd/certs.d下
一、docker和containerd配置Harbor TLS
docker和containerd都放在certs.d目錄下
/etc/docker/certs.d/
├── harbor.devops.baga.life
│ ├── ca.crt
│ ├── harbor.devops.baga.life.cert
│ └──harbor.devops.baga.life.key
docker可以去login測試harbor的登錄
docker login harbor.devops.baga.life -u 'robot$robot' -p 'xxxxxxx'
containerd不能直接登錄harbor倉庫,通過賬號密碼訪問,配置在/etc/containerd/config.toml下
[plugins."io.containerd.grpc.v1.cri".registry]config_path = "/etc/containerd/certs.d"[plugins."io.containerd.grpc.v1.cri".registry.configs][plugins."io.containerd.grpc.v1.cri".registry.configs."sealos.hub:5000".auth]username = "admin"password = "passw0rd"[plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.devops.baga.life".auth]username = "robot$robot"password = "xxxxxxx"
配置完成以后可以重啟一下docker或者containerd
二、拉取測試
用ctr操作推送失敗了,換個思路,我先在其他機器上用docker拉取鏡像,打tag以后推送至鏡像倉庫。最后讓ctr去進行拉取
1、docker拉取鏡像
docker pull ubuntu
2、打tag
docker tag ubuntu:latest harbor.devops.baga.life/base/ubuntu:tmp
3、推送鏡像
$ docker push harbor.devops.baga.life/base/ubuntu:tmp
The push refers to repository [harbor.devops.baga.life/base/ubuntu]
4b7c01ed0534: Pushed
tmp: digest: sha256:104f82606ea66da00e6cfecbcccdb53ba4238a7057bed809f004107ad8e90c97 size: 529? docker push 只會推送本地和遠程不同的層,如果 harbor.devops.baga.life 已經有相同的鏡像層,那么 Docker 只會推送元數據,實際數據不會重復上傳。? size: 529 代表的是 manifest 文件的大小,而不是整個鏡像的大小。
4、拉取鏡像
crictl pull harbor.devops.baga.life/base/ubuntu:tmp
三、不同點
首先是docker命令和ctr展示不同,containerd用了命名空間,默認default,但很多鏡像存儲在k8s.io中
可以通過crictl命令操作containerd,和docker操作方式類似,但無法給鏡像打tag和推送,只能拉取
鏡像大小不同
# 這是docker鏡像大小
redis latest 43724892d6db 7 weeks ago 117MB
# 這是containerd鏡像大小
harbor.devops.baga.life/base/redis tmp 43724892d6db0 45.9MB
可以看到鏡像id相同,但是大小差了很多
差異主要原因如下:
1、Docker和CRI(容器運行時接口)報告大小的方式不同:
- Docker通常顯示鏡像的"虛擬大小"(所有層的總和)
- crictl/containerd通常顯示鏡像的"壓縮大小"或者僅特定層的大小
2、共享層的計算方式:Docker可能將已有的共享層計入總大小,而crictl可能只計算唯一層。
3、虛擬大小與實際占用空間:117MB可能是鏡像的"虛擬大小",而實際存儲空間占用更小,約45.9MB。