Containerd 客户端工具 nerdctl
相比Containerd自带的ctr工具,nerdctl操作方式更接近之前的docker命令。nerdctl 是一个与 docker cli 风格兼容的 containerd 客户端工具,而且直接兼容docker compose
的语法的。
仓库:https://github.com/containerd/nerdctl
1. 安装
二进制文件下载路径:https://github.com/containerd/nerdctl/releases
nerdctl 官方发布包含两个安装版本:
- Minimal:仅包含 nerdctl 二进制文件及 rootless 模式下的辅助安装脚本;
- Full:全量包,其中包含了 Containerd、CNI、runc、BuildKit 等完整组件。
wget https://github.com/containerd/nerdctl/releases/download/v2.0.0-beta.5/nerdctl-2.0.0-beta.5-linux-amd64.tar.gz
mkdir nerdctl
tar xf nerdctl-2.0.0-beta.5-linux-amd64.tar.gz -C nerdctl/
mv ./nerdctl/nerdctl /usr/bin/nerdctl
# 检查安装
root@master1:~# nerdctl version
WARN[0000] unable to determine buildctl version: exec: "buildctl": executable file not found in $PATH
Client:
Version: v2.0.0-beta.5
OS/Arch: linux/amd64
Git commit: 9236b9370203b7f3274ae8d1417cc6ddcbdd4511
buildctl:
Version:
Server:
containerd:
Version: 1.7.12
GitCommit:
runc:
Version: 1.1.12-0ubuntu3
2. nerdctl使用
2.1 可以将nerdctl更名为docker
# 创建docker执行文件,确保nerdctl路径正确
root@master1:~# cat << 'EOF' > /usr/local/bin/docker
#!/bin/bash
/usr/local/bin/nerdctl $@
EOF
root@master1:~# chmod +x /usr/local/bin/docker
这样就可以把使用docker作为命令了。
2.2 nerdctl bash自动补全
root@master1:~ # apt install bash-completion
root@master1:~ # nerdctl completion bash > /etc/bash_completion.d/nerdctl
root@master1:~ # source /etc/bash_completion.d/nerdctl
# 如果遇到如下问题,执行souce命令解决
root@master1:~# nerdctl image_get_comp_words_by_ref: command not found
_get_comp_words_by_ref: command not found
_get_comp_words_by_ref: command not found
^C
root@master1:~# source /usr/share/bash-completion/bash_completion
# 写入.bashrc文件
echo "source /etc/bash_completion.d/nerdctl" >> ~/.bashrc
echo "source /usr/share/bash-completion/bash_completion" >> ~/.bashrc
2.3 nerdctl在k8s下使用
k8s默认使用k8s.io
,而 nerdctl
默认使用default namspace
。如果需要查看 k8s 相关镜像需要加上"--namespace=k8s.io"
来指定。
# 打印k8s相关容器
nerdctl --namespace k8s.io ps -a
# 镜像列表
nerdctl images --namespace=k8s.io
nerdctl -n=k8s.io images
# 构建镜像
nerdctl --namespace k8s.io build -t nginx:nerdctl .
或者在 nerdctl
配置文件中指定nerdctl
默认使用 k8s.io namespace
root@master1:~# mkdir /etc/nerdctl/
root@master1:~# cat >> /etc/nerdctl/nerdctl.toml << EOF
namespace = "k8s.io"
EOF
3. 容器管理
运行容器:
root@master1:~# nerdctl images | grep nginx
nginx 1.27.0 91bb02101775 20 hours ago linux/amd64 192.8 MiB 182.9 MiB
# 运行容器
root@master1:~# nerdctl run -d -p 80:80 --name=nginx --restart=always nginx:1.27.0
f506dd37ea00a8f2581cfefec977d4189774960fe1ffe6567632ee331af80c78
# 进入容器
root@master1:~# nerdctl exec -it nginx /bin/bash
root@f506dd37ea00:/#
# 查看容器列表
root@master1:~# nerdctl ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0417a801d4e7 registry.cn-hangzhou.aliyuncs.com/chenby/pause:3.8 "/pause" 3 hours ago Up k8s://kube-system/kube-proxy-m6z76
...
# 获取容器的详细信息
root@master1:~# nerdctl inspect nginx
[
{
"Id": "f506dd37ea00a8f2581cfefec977d4189774960fe1ffe6567632ee331af80c78",
"Created":