nerdctl使用

官方地址:https://github.com/containerd/nerdctl

参考文档:https://blog.csdn.net/catoop/article/details/128033743

nerdctl是什么

nerdctl是一个专门用于containerd且兼容docker cli的命令行工具,有如下特征:

  • 与docker的UI/UX相同

  • 支持docker-compose(例如nerdctl compose up)

  • 【可选】支持rootless模式,无slirp开销,参考这里

  • 【可选】支持延迟拉取(Stargz, Nydus, OverlayBD

  • 【可选】支持加密镜像(ocicrypt

  • 【可选】支持P2P镜像分发(IPFS

  • 【可选】支持容器镜像签名和验证(cosign

下载安装

官方下载地址:https://github.com/containerd/nerdctl/releases

nerdctl的安装分为Minimal精简安装和包含一些插件的full完整安装。精简版只包含nerdctl,完整版则包含nerdctl和CNI插件等依赖

  • Minimal(nerdctl-1.0.0-linux-amd64.tar.gz):仅包含nerdctl
  • Full(nerdctl-full-1.0.0-linux-amd64.tar.gz):包含containerd、runc、CNI等依赖
~]# wget https://github.com/containerd/nerdctl/releases/download/v1.0.0/nerdctl-1.0.0-linux-amd64.tar.gz
~]# tar xf nerdctl-1.0.0-linux-amd64.tar.gz -C /usr/local/bin/
~]# nerdctl --version
nerdctl version 1.0.0

如果习惯了docker的话可以设置一个别名,绝大多数情况下docker命令和nerdctl命令是等价的

~]# echo 'alias docker=nerdctl' >> ~/.bashrc

动机

nerdctl的目标是促进试验Docker中没有的最前沿的容器特性。这些特性包括但不限于lazy-pulling(stargz)和镜像加密(ocicrypt)。这些功能预计最终也会在Docker中实现,然而,这可能需要几个月,甚至几年的时间,因为Docker目前只设计使用了容器子系统的一小部分
此外,nerdctl可能对调试 Kubernetes 集群很有用,但这不是主要目标。

nerdctl中存在但是docker中不存在的特性

主要的:

  • 按需拉取镜像(延迟拉取):nerdctl --snapshotter=stargz|nydus|overlaybd run IMAGE
  • 对镜像加密和解密:nerdctl image (encrypt|decrypt) SRC DST
  • 使用IPFS的P2P分发镜像:nerdctl run ipfs://CID
  • 绑定挂载时候支持递归只读权限:(nerdctl run -v /mnt:/mnt:rro使子/mnt/usb级也成为只读)。需要内核 >= 5.12,并且 crun >= 1.4 或 runc >= 1.1 (PR #3272 )。
  • Cosign 集成nerdctl pull --verify=cosignand nerdctl push --sign=cosign在 Compose 中
  • 使用byass4net加速rootless容器:nerdctl run --label nerdctl/bypass4netns=true

次要的:

  • 命名空间:nerdctl --namespace=<NS> ps. (注意:所有 Kubernetes 容器都在k8s.io命名空间中)
  • 导出 Docker/OCI 两种格式的压缩文件:nerdctl save
  • 导入 OCI和Docker 两种格式的压缩文件:nerdctl load
  • 指定一个非图像根文件系统:nerdctl run -it --rootfs <ROOTFS> /bin/sh。CLI 语法符合 Podman 约定。
  • 一次将容器连接到多个网络:nerdctl run --net foo --net bar
  • Running FreeBSD jails.
  • 更好的多平台支持,例如:nerdctl pull --all-platforms IMAGE
  • 将(现有的)AppArmor 配置文件应用于无根容器:nerdctl run --security-opt apparmor=<PROFILE>. 用于sudo nerdctl apparmor load加载nerdctl-default配置文件。

其他类似工具

ctr

ctr: 不兼容Docker CLI,对用户不友好。值得注意的是,ctr缺少以下 nerdctl 命令的等效项:

  • nerdctl run -p <PORT>
  • nerdctl run --restart=always --net=bridge
  • nerdctl pullwith~/.docker/config.json和凭据助手二进制文件,例如docker-credential-ecr-login
  • nerdctl logs
  • nerdctl build
  • nerdctl compose up

crictl

crictl:不兼容Docker CLI,对用户不友好,不支持非CRI特性

pouchcontainer

PouchContainer(被遗弃?):需要一个额外的守护进程

nerdctl常见用法

列出本地kubernetes容器

# nerdctl --namespace k8s.io ps -a

列出本地kubernetes镜像

# nerdctl -n k8s.io image ls

为本地kubernetes构建镜像,且不使用镜像仓库

# nerdctl --namespace k8s.io build -t foo /some-dockerfile-directory
# kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: foo
spec:
  containers:
    - name: foo
      image: foo
      imagePullPolicy: Never
EOF

将镜像文件加载到本地kubernetes

# nerdctl --namespace k8s.io load < /path/to/image.tar

创建rootless容器

参考:https://github.com/containerd/nerdctl/blob/main/docs/rootless.md
#启用rootless容器
$ containerd-rootless-setuptool.sh install
#使用rootless containerd运行容器
$ nerdctl run -d -p 8080:80 --name nginx nginx:alpine

运行docker-compose

# nerdctl compose -f ./examples/compose-wordpress/docker-compose.yaml up

所有命令参考

命令参数太多,有部分命令和参数和docker有区别,具体看官方文档:https://github.com/containerd/nerdctl#whale-blue_square-nerdctl-run

容器管理

  • nerdctl run
  • nerdctl exec
  • nerdctl create
  • nerdctl ps
  • nerdctl inspect
  • nerdctl logs
  • nerdctl port
  • nerdctl rm
  • nerdctl stop
  • nerdctl start
  • nerdctl restart
  • nerdctl update
  • nerdctl wait
  • nerdctl kill
  • nerdctl pause
  • nerdctl unpause
  • nerdctl rename
  • nerdctl container prune

构建镜像

  • nerdctl build
  • nerdctl commit

镜像管理

  • nerdctl images
  • nerdctl pull
  • nerdctl push
  • nerdctl load
  • nerdctl save
  • nerdctl tag
  • nerdctl rmi
  • nerdctl image inspect
  • nerdctl image history
  • nerdctl image prune
  • nerdctl image convert
  • nerdctl image encrypt
  • nerdctl image decrypt

镜像仓库

  • nerdctl login
  • nerdctl logout

网络管理

  • nerdctl network create
  • nerdctl network ls
  • nerdctl network inspect
  • nerdctl network rm
  • nerdctl network prune

存储卷管理

  • nerdctl volume create
  • nerdctl volume ls
  • nerdctl volume inspect
  • nerdctl volume rm
  • nerdctl volume prune

命名空间管理

  • nerdctl namespace create
  • nerdctl namespace inspect
  • nerdctl namespace ls
  • nerdctl namespace remove
  • nerdctl namespace update

AppArmor

  • nerdctl apparmor inspect
  • nerdctl apparmor load
  • nerdctl apparmor ls
  • nerdctl apparmor unload

system

  • nerdctl events
  • nerdctl info
  • nerdctl version
  • nerdctl system prune

stats

  • nerdctl stats
  • nerdctl top

命令行补全

编辑 ~/.bash_profile:

source <(nerdctl completion bash)

compose

  • nerdctl compose
  • nerdctl compose up
  • nerdctl compose logs
  • nerdctl compose build
  • nerdctl compose down
  • nerdctl compose images
  • nerdctl compose stop
  • nerdctl compose ps
  • nerdctl compose pull
  • nerdctl compose push
  • nerdctl compose config
  • nerdctl compose kill
  • nerdctl compose restart
  • nerdctl compose rm
  • nerdctl compose run
  • nerdctl compose version

IPFS

全局配置

  • 🤓 🟦 --address: containerd 地址,可选择带有“unix://”前缀
  • 🤓 🟦 -a, --host, -H: 弃用的别名--address
  • 🤓 🟦 --namespace: containerd 命名空间
  • 🤓 🟦 -n: 弃用的别名--namespace
  • 🤓 🟦 --snapshotter: 容器快照
  • 🤓 🟦 --storage-driver: 弃用的别名--snapshotter
  • 🤓 🟦 --cni-path: CNI 二进制路径 (默认: /opt/cni/bin) [ $CNI_PATH]
  • 🤓 🟦 --cni-netconfpath: CNI netconf 路径 (默认: /etc/cni/net.d) [ $NETCONFPATH]
  • 🤓 🟦 --data-root: nerdctl 数据根,例如“/var/lib/nerdctl”
  • 🤓--cgroup-manager=(cgroupfs|systemd|none): cgroup 管理员
    • 默认值:cgroup v2(rootful 和 rootless)上的“systemd”,v1 rootful 上的“cgroupfs”,v1 rootless 上的“none”
  • 🤓 --insecure-registry: 跳过验证 HTTPS 证书,并允许回退到纯 HTTP

全局标志也可以在/etc/nerdctl/nerdctl.toml(rootful) 和~/.config/nerdctl/nerdctl.toml(rootless) 中指定。看./docs/config.md

还未实现的docker命令

容器管理:

  • docker attach
  • docker diff
  • docker checkpoint *

镜像:

  • docker exportdocker import
  • docker trust *(相反,nerdctl 支持nerdctl pull --verify=cosignnerdctl push --sign=cosign。请参阅./docs/cosign.md。)
  • docker manifest *

网络管理:

  • docker network connect
  • docker network disconnect

registry:

  • docker search

compose:

  • docker-compose create|events|exec|pause|port|scale|start|top|unpause

其他:

  • docker system df
  • docker context
  • Swarm 命令未实现,将不执行:docker swarm|node|service|config|secret|stack *
  • 插件命令未实现,不会实现:docker plugin *

其他文档

配置指南:

基本特点:

高级功能:

实验特点:

实施细节:

杂项: