Skip to content

containerd教程 - 5 containerd使用Harbor镜像仓库

我们可以使用 Dockerhub 作为镜像仓库,但是在国外太慢了,使用阿里云的只能免费使用个人版,如果想搭建企业级的私有镜像仓库,还是推荐使用 Harbor。

下面讲解一下 containerd 使用 Harbor 作为私有镜像仓库。

5.1 Harbor环境准备

Harbor 的安装,可以参考本站的 Harbor教程 中的 Harbor安装

这里就不赘述了。

5.2 配置containerd使用Harbor仓库

1 修改containerd主机域名解析

现在我这里 Harbor 是在主机 192.168.0.108 上。

containerd 是在主机 192.168.0.107 上。

这里我需要在 containerd 的主机上配置一个域名,指向 Harbor 主机地址,在 containerd 主机的 hosts 文件中配置如下:

ini
192.168.0.108			harbor.local

这里的 harbor.local 是因为在安装 Harbor 的时候,指定了 Harbor 的 hostnameharbor.local,所以这里与之对应。


hosts 配置完成,ping 一下看是否能访问 Harbor 主机,是否指向 Harbor 的主机地址:

shell
ping harbor.local

2 修改containerd配置文件

编辑 containerd 配置文件 sodu vim /etc/containerd/config.toml

配置文件的内容比较多,在下面的地方添加:

toml
[plugins."io.containerd.grpc.v1.cri".registry]
      config_path = "/etc/containerd/certs.d"		# 要添加的内容

      [plugins."io.containerd.grpc.v1.cri".registry.auths]

      [plugins."io.containerd.grpc.v1.cri".registry.configs]

      [plugins."io.containerd.grpc.v1.cri".registry.headers]

      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]

    [plugins."io.containerd.grpc.v1.cri".x509_key_pair_streaming]

/etc/containerd/certs.d 是一个文件夹,现在还没有,所以创建文件夹:

shell
mkdir -p /etc/containerd/certs.d/harbor.local

harbor.local 是和 Harbor 域名相同的文件夹,如果不是 443 端口,那么还需要补充端口,例如 harbor.local:8080

现在在 harbor.local 文件夹下新建 hosts.toml 文件,内容如下:

toml
server = "https://harbor.local"
[host."https://harbor.local"]
  capabilities = ["pull", "resolve", "push"]
  skip_verify = true

上面的配置不会验证 https 证书,如果要验证自签名的 https 证书,还需要配置 CA 证书:

shell
server = "https://harbor.local"
[host."https://harbor.local"]
  capabilities = ["pull", "resolve", "push"]
  ca = "/etc/containerd/certs.d/harbor.local/ca.crt"	# ca 证书
  skip_verify = false

配置完成,重启一下containerd :

shell
systemctl restart containerd

5.3 推送镜像到Harbor

1 准备镜像

首先从 dockerhub 下载一个镜像到本地:

shell
ctr images pull docker.io/library/nginx:latest

待会把这个镜像上传到私有仓库。

2 给镜像打标签

在上传之前,需要先给镜像打标签:

shell
ctr image tag docker.io/library/nginx:latest harbor.local/library/nginx:1.0.0

harbor.local 是私有仓库的主机;library 是 Harbor 中的项目名称,要与之对应;给 nginx 添加了 1.0.0 的tag。

打完标签,会多出一个镜像,这个镜像和原来的镜像是一样的,sha256 都是一样的。

3 推送镜像到Harbor

使用 pull 命令推送镜像:

shell
ctr image push --platform linux/arm64 --hosts-dir "/etc/containerd/certs.d" -u admin:Harbor12345 harbor.local/library/nginx:1.0.1
  • ctr image push :推送镜像的命令;
  • --platform linux/arm64 :指定平台,不指定可能会报错;
  • --hosts-dir "/etc/containerd/certs.d" :指定主机配置文件的目录;
  • -u admin:Harbor12345 :指定 Harbor 的用户名和密码;
  • harbor.local/library/nginx:1.0.1 :镜像名称;

如果 Harbor 是 http 协议,可以添加 --plain-http 参数使用 http 协议:

shell
ctr image push --platform linux/arm64 --plain-http --hosts-dir "/etc/containerd/certs.d" -u admin:Harbor12345 harbor.local/library/nginx:1.0.1

5.4 从Harbor下载镜像

上面已经将镜像上传到 Harbor 仓库了,现在可以从 Harbor 仓库拉取镜像了。

因为本地是已经存在了相同的镜像,所以先将本地的镜像删除,然后拉取镜像:

shell
ctr image pull --hosts-dir "/etc/containerd/certs.d" harbor.local/library/nginx:1.0.0

如果镜像仓库不是公开的,还需要添加用户名和密码:

shell
ctr image pull --hosts-dir "/etc/containerd/certs.d" -u admin:Harbor12345 harbor.local/library/nginx:1.0.0