ctr查看镜像
# 拉取镜像到 k8s.io 命名空间 sudo nerdctl --namespace k8s.io pull nginx:1.23.4 # 验证镜像是否已下载 sudo nerdctl --namespace k8s.io images
下载镜像到k8s.io名称空间下
nerdctl --namespace k8s.io pull zookeeper:3.6.2
sudo ctr image pull --namespace k8s.io docker.io/zookeeper:3.6.2
sudo ctr -n k8s.io images ls | grep redis
sudo ctr -n k8s.io images ls
一、使用 nerdctl
构建到 k8s.io
命名空间
nerdctl
是最简便的方式,直接通过 --namespace
参数指定目标命名空间:
bash
# 构建镜像并存储到 k8s.io 命名空间
sudo nerdctl --namespace k8s.io build -t myimage:latest .例如sudo nerdctl --namespace k8s.io build -t your-registry/goodskill-web:latest .# 验证镜像是否已在 k8s.io 命名空间中
sudo nerdctl --namespace k8s.io images
二、使用 buildkitd
+ buildctl
构建到 k8s.io
命名空间
如果你使用 BuildKit 原生工具链,需要通过 --output
参数指定存储位置:
1. 启动 buildkitd 服务(如果未运行)
bash
sudo buildkitd --oci-worker-no-process-sandbox &
2. 使用 buildctl 构建并输出到 k8s.io 命名空间
bash
buildctl build \--frontend dockerfile.v0 \--local context=. \--local dockerfile=. \--output type=image,name=docker.io/library/myimage:latest \--export-attr containerd.io/gateway.address=unix:///run/containerd/containerd.sock \--export-attr containerd.io/namespace=k8s.io例如# 1. 构建并导出为 OCI 格式
buildctl build \--frontend dockerfile.v0 \--local context=. \--local dockerfile=. \--output type=oci,dest=/tmp/image.tar,name=docker.io/library/your-registry/goodskill-gateway:latest# 2. 导入到 containerd 的 k8s.io 命名空间
sudo ctr --namespace k8s.io images import /tmp/image.tar或者buildctl build \--frontend dockerfile.v0 \--local context=. \--local dockerfile=. \--output type=image,name=docker.io/library/your-registry/goodskill-gateway:latest,push=false \--output type=containerd,ref=docker.io/library/your-registry/goodskill-gateway:latest, \opt=containerd-gateway=unix:///run/containerd/containerd.sock, \opt=containerd-namespace=k8s.iobuildctl build --frontend dockerfile.v0 --local context=. --local dockerfile=. --output type=image,name=video:latest,push=false
参数说明:
--export-attr containerd.io/gateway.address
:指定 containerd 的 socket 地址。--export-attr containerd.io/namespace=k8s.io
:指定目标命名空间。
三、使用 ctr
构建到 k8s.io
命名空间
ctr
本身构建功能有限,需结合 BuildKit 后端:
1. 确保 containerd 已启用 BuildKit 支持
编辑 /etc/containerd/config.toml
,添加:
toml
[plugins."io.containerd.buildkit.v1"]enabled = true
重启 containerd:
bash
sudo systemctl restart containerd
2. 使用 ctr
调用 BuildKit 构建
bash
sudo ctr --namespace k8s.io build -t myimage:latest .
四、验证镜像是否在 k8s.io
命名空间中
bash
# 使用 nerdctl 查看
sudo nerdctl --namespace k8s.io images# 或使用 ctr 查看
sudo ctr --namespace k8s.io images ls
五、注意事项
- 权限问题:所有操作需要 root 权限或
sudo
。 - 命名空间隔离:
k8s.io
命名空间中的镜像可直接被 Kubernetes Pod 使用。- 普通用户操作默认使用
default
命名空间,需显式指定k8s.io
。
- 私有仓库认证:
- 如果需要从私有仓库拉取基础镜像,确保认证信息已配置到
k8s.io
命名空间 -
sudo nerdctl --namespace k8s.io login my-registry.example.com
- 如果需要从私有仓库拉取基础镜像,确保认证信息已配置到
要将 Docker 格式的镜像 tar 文件导入到 containerd 的 k8s.io
命名空间,可以使用 ctr
命令结合格式转换。以下是具体步骤:
方法一:使用 ctr
直接导入(需转换格式)
Docker 导出的 tar 文件默认是 Docker 格式,需要先转换为 OCI 格式才能被 containerd 正确识别:
bash
# 1. 加载 Docker 格式的 tar 文件到临时命名空间
sudo ctr -n default images import --all-platforms your-image.tar# 2. 查看镜像名称和标签
sudo ctr -n default images ls# 3. 转换并导出为 OCI 格式
sudo ctr -n default images export /tmp/oci-image.tar your-image:tag# 4. 导入到 k8s.io 命名空间
sudo ctr -n k8s.io images import /tmp/oci-image.tar# 5. 清理临时文件
rm /tmp/oci-image.tar
方法二:使用 nerdctl
导入(更简单)
如果已安装 nerdctl
,可以直接导入 Docker 格式的 tar 文件:
bash
# 直接导入到 k8s.io 命名空间
sudo nerdctl --namespace k8s.io load -i your-image.tar
验证导入结果
bash
# 使用 ctr 查看 k8s.io 命名空间中的镜像
sudo ctr --namespace k8s.io images ls | grep your-image# 或使用 nerdctl 查看
sudo nerdctl --namespace k8s.io images | grep your-image
常见问题
-
镜像名称冲突:
- 导入时可能需要指定新的名称:
sudo ctr -n k8s.io images import --ref your-image:new-tag /tmp/oci-image.tar
- 导入时可能需要指定新的名称:
-
权限问题:
- 确保当前用户有权限访问
/run/containerd/containerd.sock
- 确保当前用户有权限访问
-
格式不兼容:
- 如果直接导入 Docker 格式的 tar 文件出现问题,请使用方法一进行格式转换
通过以上方法,你可以将 Docker 镜像 tar 文件成功导入到 containerd 的 k8s.io
命名空间,供 Kubernetes 直接使用。