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

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

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

# 5.1 Harbor环境准备

Harbor 的安装,可以参考本站的 Harbor教程 (opens new window) 中的 Harbor安装 (opens new window)

这里就不赘述了。

# 5.2 配置containerd使用Harbor仓库

# 1 修改containerd主机域名解析

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

containerd 是在主机 192.168.0.107 上。

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

192.168.0.108			harbor.local
1

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


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

ping harbor.local
1

# 2 修改containerd配置文件

编辑 containerd 配置文件 sodu vim /etc/containerd/config.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]
1
2
3
4
5
6
7
8
9
10
11
12

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

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

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

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

server = "https://harbor.local"
[host."https://harbor.local"]
  capabilities = ["pull", "resolve", "push"]
  skip_verify = true
1
2
3
4

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

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
1
2
3
4
5

配置完成,重启一下containerd :

systemctl restart containerd
1

# 5.3 推送镜像到Harbor

# 1 准备镜像

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

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

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

# 2 给镜像打标签

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

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

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

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

# 3 推送镜像到Harbor

使用 pull 命令推送镜像:

ctr image push --platform linux/arm64 --hosts-dir "/etc/containerd/certs.d" -u admin:Harbor12345 harbor.local/library/nginx:1.0.1
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 协议:

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

# 5.4 从Harbor下载镜像

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

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

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

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

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