千家信息网

nerdctl怎么使用

发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,这篇文章主要介绍"nerdctl怎么使用",在日常操作中,相信很多人在nerdctl怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"nerdctl怎么使用"的疑惑
千家信息网最后更新 2025年12月03日nerdctl怎么使用

这篇文章主要介绍"nerdctl怎么使用",在日常操作中,相信很多人在nerdctl怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"nerdctl怎么使用"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

现有 CLI 的不足

虽然 Docker 能干的事情,现在 Containerd 都能干,但 Containerd 还有一个非常明显的缺陷:CLI 不够友好。它无法像 Docker 和 Podman 一样通过一条简单的命令启动一个容器,它的两个 CLI 工具 ctr 和 crictl 都无法实现这么一件非常简单的需求,而这个需求是大多数人都需要的,我总不能为了在本地测试容器而专门部署一个 Kubernetes 集群吧?

ctr 的设计对人类不太友好,例如缺少以下这些和 Docker 类似的功能:

  • docker run -p

  • docker run --restart=always

  • 通过凭证文件 ~/.docker/config.json 来拉取镜像

  • docker logs

除此之外还有一个 CLI 工具叫 crictl,和 ctr 一样不太友好。

为了解决这个痛点,Containerd 官方推出了一个新的 CLI 叫 nerdctl。nerdctl 的使用体验和 docker 一样顺滑,例如:

????  → nerdctl run -d -p 8080:80 --name=nginx --restart=always nginx

nerdctl 只是 docker 的复制品?

nerdctl 的目标并不是单纯地复制 docker 的功能,它还实现了很多 docker 不具备的功能,例如延迟拉取镜像(lazy-pulling)、镜像加密(imgcrypt)等。

延迟拉取镜像功能可以参考这篇文章:Containerd 使用 Stargz Snapshotter 延迟拉取镜像。

虽然这些功能预计最终也会在 Docker 中实现,但可能需要几个月甚至几年的时间,因为 Docker 目前的设计只使用一小部分 Containerd 子系统。将来 Docker 有可能重构代码以使用完整的 Containerd,但目前还没看到什么实质性进展。所以 Containerd 社区决定创建一个新的 CLI 来更友好地使用 Containerd

nerdctl 试用

你可以从 nerdctl 的 release 中下载最新的可执行文件,每一个版本都有两种可用的发行版:

  • nerdctl--linux-amd64.tar.gz : 只包含 nerdctl。

  • nerdctl-full--linux-amd64.tar.gz : 包含了 nerdctl 和相关依赖组件(containerd, runc, CNI, …)。

如果你已经安装了 Containerd,只需要选择前一个发行版,否则就选择完整版。

安装好 nerdctl 后,就可以使用 nerdctl 来运行容器了:

????  → nerdctl run -d -p 80:80 --name=nginx --restart=always nginx:alpinedocker.io/library/nginx:alpine:                                                   resolved       |++++++++++++++++++++++++++++++++++++++|index-sha256:d33e9e24389d7d8b90fe2bcc2dd1bc09b4d235e916ba9d5d9a71cf52e340edb6:    done           |++++++++++++++++++++++++++++++++++++++|manifest-sha256:c1f4e1974241c3f9ddb2866b2bf8e7afbceaa42dae82aabda5e946d03f054ed2: done           |++++++++++++++++++++++++++++++++++++++|config-sha256:bfad9487e175364fd6315426feeee34bf5e6f516d2fe6a4e9b592315e330828e:   done           |++++++++++++++++++++++++++++++++++++++|layer-sha256:29d3f97df6fd99736a0676f9e57e53dfa412cf60b26d95008df9da8197f1f366:    done           |++++++++++++++++++++++++++++++++++++++|layer-sha256:9aae54b2144e5b2b00c610f8805128f4f86822e1e52d3714c463744a431f0f4a:    done           |++++++++++++++++++++++++++++++++++++++|layer-sha256:a5f0adaddd5456b7c5a3753ab541b5fad750f0a6499a15f63571b964eb3e2616:    done           |++++++++++++++++++++++++++++++++++++++|layer-sha256:5df810e1c460527fe400cdd2cab62228f5fb3da0f2dce86a6a6c354972f19b6e:    done           |++++++++++++++++++++++++++++++++++++++|layer-sha256:345aee38d3533398e0eb7118e4323a8970f7615136f2170dfb2b0278bbd9099d:    done           |++++++++++++++++++++++++++++++++++++++|layer-sha256:e6a4c36d7c0e358e5fc02ccdac645b18b85dcfec09d4fb5f8cbdc187ce9467a0:    done           |++++++++++++++++++++++++++++++++++++++|elapsed: 5.7 s                                                                    total:  9.4 Mi (1.6 MiB/s)27b55e0b18b10c4c8f34e3ba709614e7b1760a75db061d2ce5183e8b1101ce09

查看创建的容器:

????  → nerdctl psCONTAINER ID    IMAGE                             COMMAND                   CREATED          STATUS    PORTS                 NAMES3b5faa266a43    docker.io/library/nginx:alpine    "/docker-entrypoint.…"    3 minutes ago    Up        0.0.0.0:80->80/tcp    nginx

和 Docker 一样,Containerd 也有一个子命令 network

????  → nerdctl network lsNETWORK ID    NAME               FILE0             bridge              k8s-pod-network    /etc/cni/net.d/10-calico.conflist              host              none

来看下默认的 bridge 配置:

????  → nerdctl network inspect bridge[    {        "CNI": {            "cniVersion": "0.4.0",            "name": "bridge",            "nerdctlID": 0,            "plugins": [                {                    "type": "bridge",                    "bridge": "nerdctl0",                    "isGateway": true,                    "ipMasq": true,                    "hairpinMode": true,                    "ipam": {                        "type": "host-local",                        "routes": [                            {                                "dst": "0.0.0.0/0"                            }                        ],                        "ranges": [                            [                                {                                    "subnet": "10.4.0.0/24",                                    "gateway": "10.4.0.1"                                }                            ]                        ]                    }                },                {                    "type": "portmap",                    "capabilities": {                        "portMappings": true                    }                },                {                    "type": "firewall"                },                {                    "type": "tuning"                }            ]        },        "NerdctlID": 0    }]

可以看到 network 子命令背后还是 CNI 在运作,与 docker network 子命令原理不同。

构建镜像

nerdctl 也可以和 buildkit 结合使用来构建容器镜像,需要先下载 buildkit 的可执行文件:

????  → wget https://github.com/moby/buildkit/releases/download/v0.8.2/buildkit-v0.8.2.darwin-amd64.tar.gz

将其解压到 $PATH 中:

????  → tar -C /usr/local/ -zxvf buildkit-v0.8.2.linux-amd64.tar.gz

编写 systemd unit 文件:

# /etc/systemd/system/buildkit.service[Unit]Description=BuildKitDocumentation=https://github.com/moby/buildkit[Service]ExecStart=/usr/local/bin/buildkitd --oci-worker=false --containerd-worker=true[Install]WantedBy=multi-user.target

启用 buildkit.service 并设置开机自动运行:

????  → systemctl enable --now buildkit.service

下面以 KubeSphere 项目为例,展示如何使用 nerdctl 来构建镜像。

首先克隆 KubeSphere 官方仓库:

????  → git clone --depth=1 https://github.com.cnpmjs.org/kubesphere/kubesphere.git

进入仓库目录,编译二进制文件:

????  → cd kubesphere????  → make ks-apiserver

将二进制文件拷贝到 Dockerfile 目录:

????  → cp bin/cmd/ks-apiserver build/ks-apiserver

进入 Dockerfile 目录,修改 Dockerfile:

# Copyright 2020 The KubeSphere Authors. All rights reserved.# Use of this source code is governed by an Apache license# that can be found in the LICENSE file.FROM alpine:3.11ARG HELM_VERSION=v3.5.2RUN apk add --no-cache ca-certificates# install helmRUN wget https://get.helm.sh/helm-${HELM_VERSION}-linux-amd64.tar.gz && \    tar xvf helm-${HELM_VERSION}-linux-amd64.tar.gz && \    rm helm-${HELM_VERSION}-linux-amd64.tar.gz && \    mv linux-amd64/helm /usr/bin/ && \    rm -rf linux-amd64# To speed up building process, we copy binary directly from make# result instead of building it again, so make sure you run the# following command first before building docker image#   make ks-apiserver#COPY  ks-apiserver /usr/local/bin/EXPOSE 9090CMD ["sh"]

构建镜像:

????  → cd build/ks-apiserver????  → nerdctl build -t ks-apiserver .[+] Building 22.6s (9/9) FINISHED => [internal] load build definition from Dockerfile                                                                                                                                0.0s => => transferring dockerfile: 812B                                                                                                                                                0.0s => [internal] load .dockerignore                                                                                                                                                   0.0s => => transferring context: 2B                                                                                                                                                     0.0s => [internal] load metadata for docker.io/library/alpine:3.11                                                                                                                      1.0s => [1/4] FROM docker.io/library/alpine:3.11@sha256:bf5fa774f08a9ed2cb301e522b769d43d48124315a4ec50eae3228d03b9dc558                                                                7.9s => => resolve docker.io/library/alpine:3.11@sha256:bf5fa774f08a9ed2cb301e522b769d43d48124315a4ec50eae3228d03b9dc558                                                                0.0s => => sha256:9b794450f7b6db7c944ba1f4161edb68cb535052fe7db8ac06e613516c4a658d 2.10MB / 2.82MB                                                                                     21.4s => => extracting sha256:9b794450f7b6db7c944ba1f4161edb68cb535052fe7db8ac06e613516c4a658d                                                                                           0.1s => [internal] load build context                                                                                                                                                   1.0s => => transferring context: 115.87MB                                                                                                                                               1.0s => [2/4] RUN apk add --no-cache ca-certificates                                                                                                                                    2.7s => [3/4] RUN wget https://get.helm.sh/helm-v3.5.2-linux-amd64.tar.gz &&     tar xvf helm-v3.5.2-linux-amd64.tar.gz &&     rm helm-v3.5.2-linux-amd64.tar.gz &&     mv linux-amd64  4.7s => [4/4] COPY  ks-apiserver /usr/local/bin/                                                                                                                                        0.2s => exporting to oci image format                                                                                                                                                   5.9s => => exporting layers                                                                                                                                                             4.6s => => exporting manifest sha256:d7eb2a90496678d11ac5c363b7743ffe2b8e23e7071b94556a5e3231f50f5a6e                                                                                   0.0s => => exporting config sha256:8eb6a5187ce958e76c8d37e18221d88f25b48dd7e6672021d0fce21bb071f284                                                                                     0.0s => => sending tarball                                                                                                                                                              1.3sunpacking docker.io/library/ks-apiserver:latest (sha256:d7eb2a90496678d11ac5c363b7743ffe2b8e23e7071b94556a5e3231f50f5a6e)...doneunpacking overlayfs@sha256:d7eb2a90496678d11ac5c363b7743ffe2b8e23e7071b94556a5e3231f50f5a6e (sha256:d7eb2a90496678d11ac5c363b7743ffe2b8e23e7071b94556a5e3231f50f5a6e)...done

查看构建好的镜像:

????  → nerdctl imagesREPOSITORY                                                   TAG       IMAGE ID        CREATED          SIZEalpine                                                       3.11      bf5fa774f08a    3 seconds ago    2.7 MiBks-apiserver                                                 latest    d7eb2a904966    6 minutes ago    57.7 MiB

到此,关于"nerdctl怎么使用"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

镜像 文件 功能 容器 命令 学习 目录 延迟 二进制 仓库 官方 工具 更多 篇文章 需求 发行 帮助 设计 运行 选择 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 unix数据库怎么看版本 为啥使用服务器 网络安全态势感知软件十大厂家 国家网络安全观后感500 云平台用什么软件开发 虹口区网络技术开发材料 首届国家网络安全宣传周启动在哪 云服务器阿里和腾讯哪个好 传奇账号找不到原来的服务器 数据库改字符编码格式 有关网络安全课件免费 mc服务器可以看记录吗 服务器如何自动获取ip 数据库与工作区的关系 中国网络技术杂志社 如何开发自己的网络技术 关于网络安全教育的通讯稿 大专学计算机软件开发 软件开发过程的几个主要阶段 武汉电商网络安全维护机构整顿 gdc服务器网页登录权限 河南107区有哪些服务器 怎样在数据库清空用户名 软件开发入 扬州宇泰网络安全技术有限公司 华为云怎么设置远程服务器 软件开发技术工程师能干啥 物联网数据采集软件开发 数据库同时删除多个工作表数据 互联网科技企业文化墙
0