【Docker&Containerd】使用docker pull 和crictl pull命令拉取镜像导入至本地仓库

场景需求说明

因docker镜像下载受阻。

登录亚马逊云控制台,创建EC2实例

image-20240613112847056

SSH连接EC2实例

C:\Users\xyb>ssh -i <密钥.pem> ec2-user@<公网IP地址/弹性IP地址>

image-20240613112716078

安装Docker

[root@ip-10-0-10-183 ~]# yum install -y docker


[root@ip-10-0-10-183 ~]# systemctl daemon-reload
[root@ip-10-0-10-183 ~]# systemctl start docker && systemctl enable docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.


[root@ip-10-0-10-183 ~]# docker info
Client:
 Version:    25.0.3
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.0.0+unknown
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 25.0.3
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: systemd
 Cgroup Version: 2
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 64b8a811b07ba6288238eefc14d898ee0b5b99ba
 runc version: 4bccb38cc9cf198d52bebf2b3a90cd14e7af8c06
 init version: de40ad0
 Security Options:
  seccomp
   Profile: builtin
  cgroupns
 Kernel Version: 6.1.92-99.174.amzn2023.x86_64
 Operating System: Amazon Linux 2023.4.20240611
 OSType: linux
 Architecture: x86_64
 CPUs: 2
 Total Memory: 3.813GiB
 Name: ip-10-0-10-183.ec2.internal
 ID: 437e11f3-e1e3-4507-bc6d-2de96b64a77d
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

拉取所需要的镜像

[root@ip-10-0-10-183 ~]# docker pull docker.io/calico/cni:v3.25.0
v3.25.0: Pulling from calico/cni
bc84ed7b6a65: Pull complete
ae5822c70dac: Pull complete
5e4c3414e9ca: Pull complete
8833c0c1f858: Pull complete
8729f736e48f: Pull complete
79eb57bec78a: Pull complete
84d025afc533: Pull complete
df79b6dbf625: Pull complete
4f4fb700ef54: Pull complete
Digest: sha256:a38d53cb8688944eafede2f0eadc478b1b403cefeff7953da57fe9cd2d65e977
Status: Downloaded newer image for calico/cni:v3.25.0
docker.io/calico/cni:v3.25.0
[root@ip-10-0-10-183 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
calico/cni   v3.25.0   d70a5947d57e   17 months ago   198MB

使用SecureFX传输工具拉取镜像至本地

image-20240613112508446

上传镜像至本地服务器中

image-20240613113100920

使用crictl命令导入镜像

docker pull docker.io/calico/kube-controllers:v3.26.1
#docker拉取镜像
 
docker save -o kube-controllers.tar docker.io/calico/kube-controllers:v3.26.1
#docker导出镜像
 
ctr -n k8s.io  image import cni.tar  docker.io/calico/cni:v3.25.0

ctr -n k8s.io  image import cni.tar  registry.aliyuncs.com/google_containers/cni:v3.25.0
#ctr导入镜像
 
crictl images
#查看镜像是否导入成功
 
kubectl get pod -A -o wide	
#查看pod是否运行
 
sudo scp kube-controllers.tar k8s@node1:/home/k8s
#把docker导出的包传到其它节点


#使用ctr命令指定命名空间导入镜像
ctr -n=k8s.io image import cni.tar

#查看镜像,可以看到可以查询到了
crictl images

[root@node01 ~]# kubectl get pods -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-658d97c59c-fzmmj   1/1     Running   0          56m
calico-node-5fdwc                          1/1     Running   0          23m
calico-node-k5smq                          1/1     Running   0          56m
coredns-66f779496c-5qxnw                   1/1     Running   0          88m
coredns-66f779496c-tg9vb                   1/1     Running   0          88m
etcd-master01                              1/1     Running   0          89m
kube-apiserver-master01                    1/1     Running   0          89m
kube-controller-manager-master01           1/1     Running   0          89m
kube-proxy-thm89                           1/1     Running   0          89m
kube-proxy-tpcdh                           1/1     Running   0          23m
kube-scheduler-master01                    1/1     Running   0          89m
<think>好的,我现在需要回答用户关于如何使用crictl导出镜像以便Docker使用的问题。首先,我得理解crictlDocker之间的关系。根据用户提供的引用[1],cri-dockerd是一个容器运行时,让Kubernetes通过CRI接口与Docker交互。所以用户可能在Kubernetes环境中使用Docker作为运行时,现在需要将crictl管理的镜像导出给Docker使用。 接下来,我需要回忆crictldocker命令区别。crictl主要用于与CRI兼容的运行时交互,而Docker有自己的CLI工具。用户想要将镜像crictl导出,然后用Docker加载。通常,Docker可以使用`docker load`来导入镜像,但crictl是否有类似的功能呢? 查找crictl的文档,发现它有一个`crictl images`命令来列出镜像,但导出镜像可能需要用`crictl pull`先,或者使用`crictl inspect`获镜像的详细信息。不过更直接的方法可能是找到镜像在文件系统中的存储位置,然后导出为tar文件。 容器镜像通常以OCI格式存储,Docker也可以导入这种格式。可能需要使用工具如`ctr`(containerd的CLI)来导出,但用户可能没有安装containerd。或者,可以通过找到镜像的存储路径,直接打包成tar文件,再用docker加载。 另外,用户提供的引用[3]提到重新安装kubelet等组件,但可能与当前问题无关。引用[2]涉及metrics-server的访问,暂时不需要考虑。 可能的步骤是: 1. 使用`crictl images`找到目标镜像的ID。 2. 使用`crictl inspecti`获镜像的存储路径。 3. 将镜像的存储目录打包成tar文件。 4. 使用`docker load`导入该tar文件。 但需要确认crictl是否支持直接导出镜像为tar。另一种方法是使用`crictl pull`镜像本地,然后通过某种方式转换为Docker可用的格式。或者,可能需要使用`docker save`,但需要镜像Docker中已经存在。 或者,使用skopeo工具在不同容器工具之间转换镜像。但用户可能没有安装skopeo,所以需要给出更基础的命令。 总结,可能的步骤是: 1. 使用crictl导出镜像为tar文件: - `crictl pull <image>` 如果镜像不存在本地。 - `crictl inspecti <image-id> | grep repoDigests` 获镜像的digest。 - 找到镜像存储的位置,通常在`/var/lib/containers`或类似路径,然后使用`tar`命令打包。 但不确定具体路径。或者,使用`crictl image pull``crictl image export`命令。查证发现,crictl的export子命令可能存在,例如: `crictl image export -o image.tar <image-id>` 然后`docker load -i image.tar`。 需要确认crictl是否有export选项。查阅文档,发现crictl的image子命令确实有export选项,可以将镜像导出为tar文件。因此步骤应该是: 1. 使用`crictl images`列出镜像,获目标镜像的ID。 2. 使用`crictl image export -o image.tar <image-id>`导出为tar文件。 3. 使用`docker load -i image.tar`导入Docker中。 这样就能将镜像crictl导出供Docker使用了。需要注意的是,导出的镜像的格式是否符合Docker的要求。由于两者都遵循OCI标准,应该可以兼容。因此,这个方法是可行的。</think>### 如何通过`crictl`导出镜像Docker使用 1. **列出所有可用镜像** 使用以下命令查看当前通过`crictl`管理的镜像,并记录目标镜像的ID: ```bash crictl images ``` 2. **导出镜像为`.tar`文件** 使用镜像ID或名称+标签导出镜像本地文件: ```bash crictl image export -o <导出文件名>.tar <镜像ID或名称:标签> ``` 例如: ```bash crictl image export -o nginx.tar docker.io/nginx:latest ``` 3. **通过Docker加载镜像** 使用`docker load`命令导入生成的`.tar`文件: ```bash docker load -i <导出文件名>.tar ``` 例如: ```bash docker load -i nginx.tar ``` 4. **验证镜像是否可用** 检查Docker镜像列表: ```bash docker images | grep nginx ``` ### 关键说明 - `crictl`导出的镜像格式为符合OCI标准的tar文件,Docker可以直接加载[^1]。 - 如果镜像在`crictl`中未找到,需先通过`crictl pull <镜像名>`镜像
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云矩阵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值