私有镜像仓库配置了自签名证书,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。