时间:2026-02-02 22:11
人气:
作者:admin
nerdctl下载地址
https://github.com/containerd/nerdctl/releases
openEuler-22.03-LTS-SP4
registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.27.16
https://github.com/labring/sealos/releases/download/v5.1.1/sealos_5.1.1_linux_amd64.tar.gz
nerdctl是一款专为containerd设计的Docker兼容命令行工具(CLI),旨在为熟悉Docker的用户提供无缝迁移体验,同时解锁containerd的高级特性。其核心定位是填补“低级容器运行时(containerd)”与“高级用户体验(Docker CLI)”之间的 gap,让用户无需改变使用习惯即可享受containerd的性能与安全优势。
nerdctl的主要目标是降低containerd的使用门槛,推动其普及。具体来说:
nerdctl run、nerdctl build等命令与Docker完全兼容);nerdctl的特性围绕“兼容Docker”与“扩展containerd功能”展开,主要包括:
Docker CLI兼容:支持几乎所有常用Docker命令(如run、ps、build、push),甚至Docker Compose(nerdctl compose up),用户可直接替换docker为nerdctl使用;
Rootless无特权模式:允许非root用户运行容器,通过containerd-rootless-setuptool.sh安装配置,降低安全风险;
高级镜像特性:支持Stargz/Nydus/OverlayBD等懒加载技术(无需完全下载镜像即可启动)、镜像加密(ocicrypt)、P2P镜像分发(IPFS)及镜像签名验证(cosign);
Kubernetes集成:可直接管理Kubernetes集群中的容器(通过--namespace k8s.io参数),如nerdctl --namespace k8s.io ps -a查看集群容器;
多平台与构建支持:支持多平台镜像构建(nerdctl buildx build)、镜像格式转换(如Docker Manifest转OCI/estargz)及BuildKit依赖(用于镜像构建
k8s集群所有需要使用nerdctl的节点上部署
wget https://github.com/containerd/nerdctl/releases/download/v1.7.6/nerdctl-full-1.7.6-linux-amd64.tar.gz
tar -C /usr/local -xzf nerdctl-full-1.7.6-linux-amd64.tar.gz
ln -s /usr/local/bin/nerdctl /usr/bin/nerdctl
验证
# nerdctl --version
nerdctl version 1.7.6
参考链接:
https://github.com/containerd/nerdctl
Sealos 部署的 K8s 集群使用 k8s.io命名空间存储容器数据(containerd 的命名空间机制),而 nerdctl 默认使用 default命名空间。因此,需通过以下方式让 nerdctl 访问 K8s 容器:
临时指定:在执行 nerdctl 命令时,通过 --namespace=k8s.io参数指定命名空间(推荐,避免全局配置影响)。
示例:列出 K8s 集群中的所有容器(需指定命名空间)
# nerdctl ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# nerdctl --namespace=k8s.io ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
063e15488d95 sealos.hub:5000/cilium/cilium:v1.14.4 "cilium-agent --conf…" 3 days ago Created k8s://kube-system/cilium-2lrwx/cilium-agent
1006e0854b8b sealos.hub:5000/pause:3.5 "/pause" 3 days ago Up
...略
永久配置:创建 nerdctl 配置文件(/etc/nerdctl/nerdctl.toml),设置默认命名空间为 k8s.io:
# mkdir /etc/nerdctl
# vi /etc/nerdctl/nerdctl.toml
设置nerdctl.toml中增加以下全局配置,这样执行nerdctl命令时默认使用 k8s.io命名空间
namespace = "k8s.io"
debug = false
nerdctl 与 Sealos 集成后,主要用于容器调试(弥补 kubectl的不足),以下是常见操作:
# 列出所有 K8s 容器(包括停止的)
nerdctl --namespace=k8s.io ps -a
# 过滤特定 Pod 的容器(如 `nginx` Pod)
nerdctl --namespace=k8s.io ps -a | grep nginx
kubectl logs失效问题)当 kubectl logs <pod-name>无法获取日志(如容器崩溃、日志截断)时,nerdctl 可直接读取容器的标准输出日志:
# 查看容器实时日志(-f 跟踪日志,--tail 显示最后 N 行)
nerdctl --namespace=k8s.io logs -f --tail=100 <容器ID>
# 示例:查看 nginx Pod 的容器日志
nerdctl --namespace=k8s.io logs -f $(nerdctl --namespace=k8s.io ps -a | grep nginx | awk '{print $1}')
优势:nerdctl 日志直接来自 containerd,避免了 kubectl与 K8s API 之间的转发延迟,更适合调试容器启动失败等问题。
当需要进入 K8s 容器执行命令(如查看配置文件、调试应用)时,nerdctl 可直接附加到容器进程:
# 进入容器(--it 交互式终端,/bin/sh 进入 shell)
nerdctl --namespace=k8s.io exec -it <容器ID> /bin/sh
# 示例:进入 `nginx` 容器
nerdctl --namespace=k8s.io exec -it $(nerdctl --namespace=k8s.io ps -a | grep nginx | awk '{print $1}') /bin/sh
注意:需确保容器处于 Up状态,且镜像包含 shell(如 nginx:alpine包含 /bin/sh)。
通过 nerdctl inspect可获取容器的底层信息(如网络配置、挂载点、环境变量),帮助排查网络或存储问题:
# 查看容器详细信息(JSON 格式)
nerdctl --namespace=k8s.io inspect <容器ID>
# 过滤关键信息(如 IP 地址、挂载点)
nerdctl --namespace=k8s.io inspect <容器ID> | grep -A 10 "NetworkSettings"
输出说明:包含容器的网络配置(如 IPAddress、Gateway)、挂载点(如 Mounts)、环境变量(如 Env)等,比 kubectl describe pod更详细。
nerdctl 可直接操作 Sealos 集群节点上的容器镜像(如拉取、删除、打标签),补充 Sealos 离线镜像管理的不足:
# 登录仓库(有些镜像仓库要求登录后才可以执行其它操作,比如阿里云)
# nerdctl login sealos.hub:5000 #说明:回车后会要求输入账号,输入账号后回车会要求输入密码
# 拉取镜像(支持镜像加速,如阿里云)
# nerdctl pull registry.cn-hangzhou.aliyuncs.com/library/nginx:alpine
# 列出本地镜像
# nerdctl --namespace=k8s.io images
REPOSITORY TAG IMAGE ID CREATED PLATFORM SIZE BLOB SIZE
docker.xuanyuan.me/library/nginx 1.25 a484819eb602 2 days ago linux/amd64 192.8 MiB 67.7 MiB
sealos.hub:5000/cilium/cilium v1.14.4 57b1a0413723 3 days ago linux/amd64 520.1 MiB 183.7 MiB
sealos.hub:5000/cilium/cilium <none> 57b1a0413723 3 days ago linux/amd64 520.1 MiB 183.7 MiB
sealos.hub:5000/kube-proxy v1.22.17 614ec43f14e1 3 days ago linux/amd64 104.8 MiB 34.3 MiB
...略
# 批量删除所有 tag 为 None的镜像
# 通过 nerdctl images命令过滤无标签镜像,并结合管道操作批量删除:
# 列出所有无标签镜像的 ID
# nerdctl --namespace=k8s.io images --all --filter "dangling=true"
REPOSITORY TAG IMAGE ID CREATED PLATFORM SIZE BLOB SIZE
sealos.hub:5000/cilium/cilium <none> 57b1a0413723 3 days ago linux/amd64 520.1 MiB 183.7 MiB
...略
# 批量删除(谨慎操作!)
nerdctl images --all --filter "dangling=true" -q | xargs nerdctl rmi -f
# 给本地镜像打一个标记(`tag`),可将其归入某一仓库
# nerdctl --namespace=k8s.io tag docker.xuanyuan.me/library/nginx:1.25 my-registry/nginx:v1
# nerdctl --namespace=k8s.io images
REPOSITORY TAG IMAGE ID CREATED PLATFORM SIZE BLOB SIZE
my-registry/nginx v1 a484819eb602 10 seconds ago linux/amd64 192.8 MiB 67.7 MiB
docker.xuanyuan.me/library/nginx 1.25 a484819eb602 2 days ago linux/amd64 192.8 MiB 67.7 MiB
...略
# 删除本地镜像
nerdctl rmi a484819eb602
# 到导出镜像包将:镜像`my-registry/nginx:v1`保存为`my-nginx.tar`
# nerdctl --namespace=k8s.io image save -o my-nginx.tar my-registry/nginx:v1
# 删除镜像
# nerdctl --namespace=k8s.io rmi my-registry/nginx:v1
# 导入镜像
# nerdctl --namespace=k8s.io image load -i my-nginx.tar
说明:基于sealos部署k8s,会自动创建一个本地私有仓库,仓库默认地址:sealos.hub:5000,登录账号,密码存放在/etc/containerd/config.toml ,如下
# cat /etc/containerd/config.toml
...略
[plugins]
...略
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"
[plugins."io.containerd.grpc.v1.cri".registry.configs]
[plugins."io.containerd.grpc.v1.cri".registry.configs."sealos.hub:5000".auth]
username = "admin"
password = "passw0rd"
/run/containerd/containerd.sock),因此需以 root用户执行(或通过 sudo提升权限)。
作者:授客
微信/QQ:1033553122
全国软件测试QQ交流群:7156436
Git地址:https://gitee.com/ishouke
友情提示:限于时间仓促,文中可能存在错误,欢迎指正、评论!
作者五行缺钱,如果觉得文章对您有帮助,请扫描下边的二维码打赏作者,金额随意,您的支持将是我继续创作的源动力,打赏后如有任何疑问,请联系我!!!
微信打赏
支付宝打赏 全国软件测试交流QQ群
Ubuntu离线环境部署Kubernetes v1.31.3(ARM64)