Docker和Containerd打包镜像并上传到远程

目前不管是K8S还是普通的Docker/Containerd容器部署,都强依赖于Docker镜像的下载,目前主流大多数的镜像都在DockerHub当中,但是因为墙的原因,在国内进行镜像的下载,变得极其困难。 我们可以从https://docker.aityp.com/当中根据镜像名称找到国内可用的镜

目前不管是K8S还是普通的Docker/Containerd容器部署,都强依赖于Docker镜像的下载,目前主流大多数的镜像都在DockerHub当中,但是因为墙的原因,在国内进行镜像的下载,变得极其困难。

我们可以从https://docker.aityp.com/当中根据镜像名称找到国内可用的镜像,可以使用docker pull(对于Docker)/ctr images pull(对于Containerd)将镜像拉取到本地之后,这个镜像有几种方式给我们进行使用。

  • 1.直接使用国内云厂商镜像的地址,比如swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.elastic.co/elasticsearch/elasticsearch:8.7.0,好处是很方便,坏处是如果这个私有镜像的地址不可用,那么可能会大范围影响我们内部的服务进行镜像的拉取。
  • 2.(推荐)在内部部署一个私有的Docker镜像仓库Harbor,将云厂商的镜像地址转换成为我们内部维护的Harbor仓库的地址,比如harbor.example.com/docker.elastic.co/elasticsearch/elasticsearch:8.7.0,我们直接在部署服务时,直接基于我们的Harbor仓库进行镜像的拉取即可。
  • 3.重新打个tag,放到本地进行使用,比如我们可以将swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.elastic.co/elasticsearch/elasticsearch:8.7.0去重新打个tag变成docker.elastic.co/elasticsearch/elasticsearch:8.7.0进行使用,在一些内网的场景下可能用到,比如说机器不能连接外网,可以基于压缩包的方式去上传,并在内网服务器上进行镜像的加载。

1.Docker

比如如果无法拉取到镜像docker.io/kubesphere/pause:3.9,此时可以找一台可以拉取外部镜像的机器去下载镜像,并打包再上传到目标机器上进行解压。

首先,我们找一台机器基于Docker去拉取镜像,并打包成为压缩包。

# 拉取镜像
docker pull kubesphere/pause:3.9
# 打包镜像成为压缩包
docker save -o pause.tar kubesphere/pause:3.9

接着将pause.tar上传到需要加载镜像的机器,使用docker load命令加载镜像,根据压缩包去导入成为镜像并放到到机器的Docker本地仓库。

docker load -i pause.tar

2.Containerd

如果无法拉取到镜像docker.io/kubesphere/pause:3.9,此时可以找一台可以拉取外部镜像的机器去下载镜像,并打包再上传到目标机器上进行解压。

首先,我们找一台机器基于Docker去拉取镜像,并打包成为压缩包。

# 拉取镜像
docker pull kubesphere/pause:3.9
# 打包镜像成为压缩包
docker save -o pause.tar kubesphere/pause:3.9

接着将pause.tar上传到需要加载镜像的机器,使用ctr images import命令,根据压缩包去导入成为镜像并放到到机器的本地Containerd镜像仓库。

# 将镜像解压缩并上传到containerd的本地仓库
ctr images import pause.tar

# 验证pause镜像是否已经被我们上传成功
ctr images list | grep pause

注意:如果是给K8S使用的镜像,需要指定Namespace为k8s.io,因为Containerd是存在有Namespace的概念的,K8S需要使用自己独有的Namespace。

ctr --namespace k8s.io images import pause.tar
ctr --namespace k8s.io images list | grep pause
Comment