Containerd命令行工具-nerdctl

764 字
4 分钟
Containerd命令行工具-nerdctl

习惯了使用 docker cli,ctr 使用起来可能还是不太顺手,为了能够让大家更好的转到 containerd 上面来,社区提供了一个新的命令行工具:nerdctl。nerdctl 是一个与 docker cli 风格兼容的 containerd 客户端工具,而且直接兼容 docker compose 的语法的.

安装#

Terminal window
wget https://github.com/containerd/nerdctl/releases/download/v1.6.2/nerdctl-1.6.2-linux-amd64.tar.gz
# 如果有限制,也可以替换成下面的 URL 加速下载
# wget https://download.fastgit.org/containerd/nerdctl/releases/download/v1.6.2/nerdctl-1.6.2-linux-amd64.tar.gz
# 最下化安装
tar Cxzvvf /usr/local/bin nerdctl-1.6.2-linux-amd64.tar.gz

image-20231016101552884
image-20231016101552884

命令#

  • run#

    nerdctl rundocker run 类似 可以使用 nerdctl run 命令运行容器

    Terminal window
    nerdctl run -d -p 80:80 --name=nginx --restart=always nginx:alpine

    image-20231016102757105
    image-20231016102757105

  • exec#

    Terminal window
    nerdctl exec -it nginx /bin/sh

    image-20231016103856190
    image-20231016103856190

  • ps#

    使用 nerdctl ps 命令可以列出所有容器

    Terminal window
    nerdctl ps

    image-20231016104003495
    image-20231016104003495

    同样可以使用 -a 选项显示所有的容器列表,默认只显示正在运行的容器,不过需要注意的是 nerdctl ps 命令并没有实现 docker ps 下面的 --filter--format--last--size 等选项

  • inspect#

    显示结果和 docker inspect 基本一致

    Terminal window
    nerdctl inspect nginx
  • logs#

    —tail 5 : 从最后5行开始显示

    Terminal window
    nerdctl logs -f nginx --tail 5

    image-20231016104515183
    image-20231016104515183

  • stop#

    Terminal window
    nerdctl stop nginx

    image-20231016104614294
    image-20231016104614294

  • rm#

    Terminal window
    nerdctl rm nginx

    image-20231016104726339
    image-20231016104726339

    rm不能直接杀掉正在运行的容器 要想杀掉正在运行的容器需要加上-f强制删除

  • images

    Terminal window
    nerdctl images

    image-20231016104955438
    image-20231016104955438

  • pull#

    Terminal window
    nerdctl pull busybox

    image-20231016105131475
    image-20231016105131475

  • tag#

    Terminal window
    nerdctl tag busybox registry.cn-hangzhou.aliyuncs.com/tianchunhui/busybox:231016

    image-20231016105501575
    image-20231016105501575

  • push#

    推送镜像之前也可以使用 nerdctl login 命令登录到镜像仓库,然后再执行 push 操作

    Terminal window
    nerdctl push registry.cn-hangzhou.aliyuncs.com/tianchunhui/busybox:231016

    image-20231016105551521
    image-20231016105551521

    image-20231016105623053
    image-20231016105623053

  • save#

    Terminal window
    nerdctl save -o busybox.tar.gz busybox:latest

    image-20231016105742772
    image-20231016105742772

  • rmi#

    Terminal window
    nerdctl rmi busybox

    image-20231016105920930
    image-20231016105920930

  • load#

    使用 -i--input 选项指定需要导入的压缩包

    Terminal window
    nerdctl load -i busybox.tar.gz

    image-20231016110015340
    image-20231016110015340

  • build#

    ctr 并没有构建镜像的命令,而现在又不使用 Docker 了, nerdctl 提供了 nerdctl build 这样的镜像构建命令

    1. 新建一个如下的Dockerfile文件

      FROM nginx
      RUN echo 'Hello Nerdctl From Containerd' > /usr/share/nginx/html/index.html
    2. 在文件所在目录执行镜像构建命令

      Terminal window
      nerdctl build -t nginx:nerdctl -f Dockerfile .

      image-20231016110417256
      image-20231016110417256

      可以看到有一个错误提示,需要安装 buildctl 并运行 buildkitd,这是因为 nerdctl build 需要依赖 buildkit 工具

      buildkit 项目也是 Docker 公司开源的一个构建工具包,支持 OCI 标准的镜像构建。它主要包含以下部分:

      • 服务端 buildkitd:当前支持 runc 和 containerd 作为 worker,默认是 runc,我们这里使用 containerd
      • 客户端 buildctl:负责解析 Dockerfile,并向服务端 buildkitd 发出构建请求

      buildkit 是典型的 C/S 架构,客户端和服务端是可以不在一台服务器上,而 nerdctl 在构建镜像的时候也作为 buildkitd 的客户端,所以需要我们安装并运行 buildkitd

    3. 安装 buildkit

      Terminal window
      mkdir -p /opt/nerdctl
      cd /opt/nerdctl
      wget https://github.com/moby/buildkit/releases/download/v0.12.2/buildkit-v0.12.2.linux-amd64.tar.gz
      tar -zxvf buildkit-v0.12.2.linux-amd64.tar.gz
      cp buildctl /usr/local/bin
      cp buildkitd /usr/local/bin

      使用 Systemd 来管理 buildkitd,创建如下所示的 systemd unit 文件:

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

      启动 buildkitd

      Terminal window
      systemctl daemon-reload
      systemctl enable buildkit --now
      systemctl status buildkit

      image-20231016134709582
      image-20231016134709582

    4. 重新执行构建命令

      Terminal window
      nerdctl build -t nginx:nerdctl -f Dockerfile .

      image-20231016135200764
      image-20231016135200764

    单机环境下使用 Docker Compose,在 containerd 模式下,也可以使用 nerdctl 来兼容该功能。同样可以使用 nerdctl composenerdctl compose upnerdctl compose logsnerdctl compose buildnerdctl compose down 等命令来管理 Compose 服务。这样使用 containerd、nerdctl 结合 buildkit 等工具就完全可以替代 docker 在镜像构建、镜像容器方面的管理功能了。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Containerd命令行工具-nerdctl
https://tianch.com.cn/posts/tutorials/containerd-ming-ling-xing-gong-ju-nerdctl/
作者
田小晖
发布于
2023-10-16
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
田小晖
记录技术成长,分享运维与开发经验。
公告
分类
标签
站点统计
文章
134
分类
9
标签
29
总字数
203,962
运行时长
0
最后活动
0 天前
站点信息
构建平台
Cloudflare Pages
博客版本
Firefly v6.15.6
文章许可
CC BY-NC-SA 4.0