containerd 导入镜像

containerd而非docker,需要离线导入镜像

解决原理
https://segmentfault.com/a/1190000019534913
ctr --namespace=k8s.io images ls
获取到你需要的镜像名称和版本之后 (参见后面的排查技巧)

docker pull mirrorgooglecontainers/$imageName:$imageVersion
docker tag mirrorgooglecontainers/$imageName:$imageVersion k8s.gcr.io/$imageName:$imageVersion
docker save k8s.gcr.io/$imageName:$imageVersion > $imageName.tar
microk8s.ctr -n k8s.io image import $imageName.tar
使用ctr命令导入镜像。
ctr image import app.tar #导入本地镜像
ctr images list|grep app #查看导入的镜像
crictl images list|grep app #此命令也可查看 命令介绍:
ctr:是containerd本身的CLI
crictl :是Kubernetes社区定义的专门CLI工具
Steps to reproduce:

 ctr images tag 192.168.56.1:8080/docker/alpine:latest 192.168.56.1:8080/docker/alpine:1.1
192.168.56.1:8080/docker/alpine:1.1 ctr images push 192.168.56.1:8080/docker/alpine:latest 192.168.56.1:8080/docker/alpine:1.1
index-sha256:c19173c5ada610a5989151111163d28a67368362762534d8a8121ce95cf2bd5a: waiting |--------------------------------------|
elapsed: 0.1 s total: 0.0 B (0.0 B/s)
ctr: content digest sha256:29a82d50bdb8dd7814009852c1773fb9bb300d2f655bd1cd9e764e7bb1412be3: not found
As you see this is quite powerful and you can do a lot with it.

Let’s start by pulling an image

# ctr image pull docker.io/library/hello-world

This would give you an error saying you missed an object, because Containerd requires you to specify the object like the command below:

# ctr image pull docker.io/library/hello-world:latest

You can replace object with whatever is available like ‘alpine’

Let’s try listing the image to confirm

# ctr image ls

This can be a bit unfriendly, so try the following command:

#ctr image ls -q

The above command will give only the image name and nothing else.

Now that we’ve got our image, we need to run a container.

#ctr container create docker.io/library/hello-world:latest demo

This would create a container with container id, ‘demo’, based on the image that we pulled.

There are a few things to notice here: The output is not redirected to the CLI by default. Unlike Docker, we need to use the full path with the object every time we use a container image. Also, the image needs to be pulled before being able to run a container.

We can list the containers created with the command below:

#ctr container list

You can see the demo container listed. You can even use -q to get just the container names.

Now to delete the image.

#ctr image remove docker.io/library/hello-world:latest

This would delete the image. What would happen to your container?

#ctr container list

Your container would still be running. This is because containerd works on references, and in this case, the image is no longer being referenced as an image but it is still being referenced by the container (as a snapshot), so it wouldn’t be deleted as long as it’s being referenced.

You’ll get a better picture when learning about snapshots, which would be a topic for another article.

For now, we’ll delete the image.

#ctr container remove demo

Please leave a comment with any suggestions.
常用技巧
containerd相关的CLI确实没有Docker CLI方便,比如笔者在使用containerd时碰到一个场景,期望实现对镜像重新tag的操作,这在Docker下非常容易做到,但是在containerd下非常麻烦。crictl中并不支持这种操作,社区中也有相关issue解释: https://github.com/kubernetes- ... s/438 所以我们只能使用其他方式,通常我会这样做:
在一台机去上使用docker tag转换image
导出镜像,并拷贝到k3s机器上
docker tag busybox busyboxaaa
docker save -o busybox.tar busyboxaaa
scp busybox.tar ubuntu@172.31.24.12:~/
用ctr导入
ctr image import busybox.tar
root@ubuntu:~# docker pull coredns/coredns:coredns-arm64
coredns-arm64: Pulling from coredns/coredns
Digest: sha256:e98e05b50afc6606d3e0a66e264175910651746262e4a4823299ec6c827ef72a
Status: Image is up to date for coredns/coredns:coredns-arm64
docker.io/coredns/coredns:coredns-arm64
root@ubuntu:~# docker tag coredns/coredns:coredns-arm64 k8s.gcr.io/coredns:1.6.7
root@ubuntu:~# docker save -o coredns:coredns-arm64.tar k8s.gcr.io/coredns:1.6.7
root@ubuntu:~# ctr image import coredns:coredns-arm64.tar
unpacking k8s.gcr.io/coredns:1.6.7 (sha256:19910cb28a673d9ad642c3762b71fb5da6668537d9417d14d4d0cbf82569d7a8)...done
root@ubuntu:~#
两者命令对比表:

id    containerd 命令    docker 命令    备注
1 ctr image ls docker images 获取image信息
2 ctr image pull nginx docker pull nginx pull 一个nginx的image
3 ctr image tag nginx nginx-test docker tag nginx nginx-test tag 一个nginx的image
4 ctr image push nginx-test docker push nginx-test push nginx-test的image
5 ctr image pull nginx docker pull nginx pull 一个nginx的image
6 ctr image import nginx.tar docker load<nginx.tar.gz 导入本地镜像ctr不支持压缩
7 ctr run -d --env 111 nginx-test nginx docker run -d --name=nginx nginx-test 运行的一个容器
8 ctr task ls docker ps 查看运行的容器

https://github.com/kubernetes/kubeadm/issues/1885

root@ubuntu:~# kubeadm init --kubernetes-version=v1.18.1  --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=10.10.16.82 --ignore-preflight-errors=all unix:///run/containerd/containerd.sock  --image-repository registry.aliyuncs.com/google_containers
unknown command "unix:///run/containerd/containerd.sock" for "kubeadm init"
To see the stack trace of this error execute with --v=5 or higher
root@ubuntu:~# kubeadm init --kubernetes-version=v1.18.1 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=10.10.16.82 --ignore-preflight-errors=all unix:///run/containerd/containerd.sock --image-repository registry.aliyuncs.com/google_containers --v=5
unknown command "unix:///run/containerd/containerd.sock" for "kubeadm init"
root@ubuntu:~#
root@ubuntu:~# ctr images  -help
NAME:
ctr images - manage images USAGE:
ctr images command [command options] [arguments...] COMMANDS:
check check that an image has all content available locally
export export images
import import images
list, ls list images known to containerd
pull pull an image from a remote
push push an image to a remote
remove, rm remove one or more images by reference
tag tag an image
label set and clear labels for an image OPTIONS:
--help, -h show help root@ubuntu:~#
root@ubuntu:~# ctr images list -help
NAME:
ctr images list - list images known to containerd USAGE:
ctr images list [command options] [flags] [<filter>, ...] DESCRIPTION:
list images registered with containerd OPTIONS:
--quiet, -q print only the image refs root@ubuntu:~# ctr images list -q
docker.io/library/nginx:alpine
k8s.gcr.io/coredns:1.6.7
k8s.gcr.io/etcd-arm64:3.4.3-0
k8s.gcr.io/kube-apiserver:v1.18.1
k8s.gcr.io/kube-controller-manager:v1.18.1
k8s.gcr.io/kube-proxy:v1.18.1
k8s.gcr.io/kube-scheduler:v1.18.1
k8s.gcr.io/pause-arm64:3.2
root@ubuntu:~#
root@ubuntu:~# ctr images list -q
docker.io/library/nginx:alpine
k8s.gcr.io/coredns:1.6.7
k8s.gcr.io/etcd-arm64:3.4.3-0
k8s.gcr.io/kube-apiserver:v1.18.1
k8s.gcr.io/kube-controller-manager:v1.18.1
k8s.gcr.io/kube-proxy:v1.18.1
k8s.gcr.io/kube-scheduler:v1.18.1
k8s.gcr.io/pause-arm64:3.2
root@ubuntu:~# ctr images rm $(ctr images list -q)
docker.io/library/nginx:alpine
k8s.gcr.io/coredns:1.6.7
k8s.gcr.io/etcd-arm64:3.4.3-0
k8s.gcr.io/kube-apiserver:v1.18.1
k8s.gcr.io/kube-controller-manager:v1.18.1
k8s.gcr.io/kube-proxy:v1.18.1
k8s.gcr.io/kube-scheduler:v1.18.1
k8s.gcr.io/pause-arm64:3.2
root@ubuntu:~# ctr images list -q
root@ubuntu:~#
root@ubuntu:~# ctr -n  k8s.gcr.io images list -q
k8s.gcr.io/coredns:1.6.7
k8s.gcr.io/etcd-arm64:3.4.3-0
k8s.gcr.io/kube-apiserver:v1.18.1
k8s.gcr.io/kube-controller-manager:v1.18.1
k8s.gcr.io/kube-proxy:v1.18.1
k8s.gcr.io/kube-scheduler:v1.18.1
k8s.gcr.io/pause-arm64:3.2
root@ubuntu:~# ctr -n k8s.gcr.io images rm $(ctr -n k8s.gcr.io images list -q)
k8s.gcr.io/coredns:1.6.7
k8s.gcr.io/etcd-arm64:3.4.3-0
k8s.gcr.io/kube-apiserver:v1.18.1
k8s.gcr.io/kube-controller-manager:v1.18.1
k8s.gcr.io/kube-proxy:v1.18.1
k8s.gcr.io/kube-scheduler:v1.18.1
k8s.gcr.io/pause-arm64:3.2
root@ubuntu:~# ctr -n k8s.gcr.io images list -q
root@ubuntu:~#
root@ubuntu:~# kubeadm config images list --image-repository k8s.gcr.io
I1015 09:51:08.165119 47994 version.go:252] remote version is much newer: v1.19.3; falling back to: stable-1.18
W1015 09:51:08.786382 47994 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
k8s.gcr.io/kube-apiserver:v1.18.9
k8s.gcr.io/kube-controller-manager:v1.18.9
k8s.gcr.io/kube-scheduler:v1.18.9
k8s.gcr.io/kube-proxy:v1.18.9
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.7
root@ubuntu:~#

containerd 导入镜像的更多相关文章

  1. docker 导出导入镜像

    1.docker export jenkins > my_jenkins.tar   导出镜像到本地 cat my_jenkins | docker import my_jenkens:0.0. ...

  2. docker怎么导出导入镜像

    https://blog.csdn.net/dest_dest/article/details/80612231 把某个docker镜像保存到本地文件,命令如下docker save -o 镜像名.t ...

  3. Docker镜像保存为文件及从文件导入镜像的方法

    参考 1.概述 我们制作好镜像后,有时需要将镜像复制到另一台服务器使用. 能达到以上目的有两种方式,一种是上传镜像到仓库中(本地或公共仓库),但是另一台服务器很肯能只是与当前服务器局域网想通而没有公网 ...

  4. 导入镜像后,容器内httpd起不来

    导入镜像后发现bash进程为1 与之前apache启动的进程冲突了 解决办法:删除apache进程号,通过apachectl重启apache进程

  5. Flask15 远程开发环境搭建、安装虚拟机、导入镜像文件、创建开发环境、pycharm和远程开发环境协同工作

    1 安装VM虚拟机 待更新... 2 导入镜像文件 待更新... 3 启动虚拟机 4 远程连接虚拟机 4.1 安装xShell软件 待更新... 4.2 创建一个新的连接 4.2.1 在虚拟机中获取虚 ...

  6. SUSE12Sp3-使用Docker导入镜像并安装redis,zookeeper,kafka

    首先在另外一台联网电脑拉取最新的redis,zookeeper,kafka镜像 docker pull redis docker pull zookeeper docker pull wurstmei ...

  7. openstack导入镜像

    本文以制作CentOS7.2镜像为例,详细介绍手动制作OpenStack镜像详细步骤,解释每一步这么做的原因.镜像上传到OpenStack glance,支持以下几个功能: 支持密码注入功能(nova ...

  8. docker通过dockerfile构建JDK最小镜像,Docker导出导入镜像

    docker通过dockerfile构建JDK最小镜像,Docker导出导入镜像 一.docker通过dockerfile构建JDK最小镜像 1.1 下载JRE 1.2 解压JRE,删除相关不需要文件 ...

  9. 导入镜像文件,分区启动liunx

    1:更改虚拟机配置 2:导入系统镜像 3:启动虚拟机,选择第一个选项回车 4:这里问你是否检查镜像,我们的镜像肯定没问题不需要检查,点击Skip 5:语言选择,按提示默认下一步 6:主机名也默认 7: ...

  10. Docker 本地导入镜像/保存镜像/载入镜像/删除镜像

    1.Docker导入本地镜像 有时候我们自己在本地或者其它小伙伴电脑上拷贝了一份镜像,有了这个镜像之后,我们可以把本地的镜像导入,使用docker import 命令. 例如这里下载了一个 aliba ...

随机推荐

  1. Sealos Devbox 发布,珍爱生命,远离 CI/CD

    水滴攻击太阳系用的是最原始的攻击方式:撞击!却又如此有效率. 当我们搞了一堆容器.编排.CI/CD.DevOps,发明了一大堆没什么用的名词之后,最终发现这些操作都是花里胡哨,让开发者越陷越深. 最终 ...

  2. Java实用小工具系列2---使用StopWatch统计多个任务耗时分布

    在Java中经常需要统计程序的使用时间,如果只是一个时间段统计比较好处理,可以直接使用System.currentTimeMillis().但如果一个程序中包含多个步骤,需要统计每个步骤耗时,并且需要 ...

  3. Oracle 23c 新特性实操体验优质文章汇总 | 有奖征文进行中欢迎参与

    继4月3日甲骨文宣布推出免费开发者版 Oracle Database 23c后,墨天轮社区发起 "Oracle 23c 免费开发者版特性体验"有奖征文活动,邀请大家分享Oracle ...

  4. iOS开发Block使用详解

    项目开发中经常会用到页面之间传值的问题,常用的方法是通知.单例.代理.block等.最近项目忙完,有空细细研究了一下block的用法,收货多多. block又称闭包,它的实现原理是c语言的函数指针.函 ...

  5. DirectoryOpus插件:“照得标管理器”-海量照片分类管理好帮手!

      照得标管理器 前言   名词解释:"照得标管理器",即:照片得到标签管理器,后文统一简称"照得标管理器"或"照得标".  注:请不要和抖 ...

  6. 在 Azure CNI 中启用 Calico WireGuard

    作者:Peter Kelly 译者:Wendi Wang 注:本文已取得作者本人的翻译授权! 去年6月,Tigera 宣布首次在 K8s 上支持用于集群内加密传输的开源 VPN - WireGuard ...

  7. Jenkins执行appium没有界面得处理

    原文1:https://www.cnblogs.com/wangjunjiehome/p/10100852.html 原文2:https://www.cnblogs.com/wangjunjiehom ...

  8. AOT漫谈专题(第七篇): 聊一聊给C#打造的节点依赖图

    一:背景 1. 讲故事 上一篇我们聊过AOT编程中可能会遇到的三大件问题,而这三大件问题又是考验你对AOT中节点图的理解,它是一切的原点,接下来我就画几张图以个人的角度来解读下吧,不一定对. 二:理解 ...

  9. VMware安装Ubuntu操作系统 2024.9.27

    1.安装 Ubuntu的官方网站是:https://www.ubuntu.com/download 点进去可以直接下载 文件下载会比较慢,我这点用了约5分钟 然后就可以打开vmware,选择: 就可以 ...

  10. spool参数详解

    SQL*PLUS维护系统变量,也称SET变量,利用它可为SQL*PLUS交互建立一个特殊的环境,如:设置NUMBER数据的显示宽度;设置每页的行数;设置列的宽度等.可用SET命令改变这些系统变量,也可 ...