抛弃 Docker:nerdctl 容器工具从入门到实战
命令和 Docker 99% 一样,生产环境首选的 containerd 管理工具。
为什么要用 nerdctl?
Docker 是大家最熟悉的容器工具,但在 K8s 生产环境里,容器运行时早就换成了 containerd。containerd 本身没有命令行工具,你得用 crictl 来操作,但 crictl 的命令参数和 Docker 完全不一样,学习成本很高。
nerdctl 就是来解决这个问题的:它是 containerd 官方出的命令行工具,语法和 Docker 几乎一模一样,你会 docker run 就会 nerdctl run,零学习成本迁移。
安装 nerdctl
# 下载安装
wget http://192.168.46.100/01.softwares/03.stage-3/nerdctl-1.7.7-linux-amd64.tar.gz
tar -xf nerdctl-1.7.7-linux-amd64.tar.gz -C /usr/bin/
# 安装 CNI 网络插件
mkdir -p /opt/cni/bin
tar -xf cni-plugins-linux-amd64-v1.6.0.tgz -C /opt/cni/bin
# 配置内核参数
cat > /etc/sysctl.d/k8s.conf << 'EOF'
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
EOF
sysctl -p /etc/sysctl.d/k8s.conf
验证安装:
nerdctl version
配置镜像加速
国内拉 Docker Hub 的镜像太慢,需要配置加速。nerdctl 用的是 certs.d 目录方式配置。
# 配置 docker.io 加速
mkdir -p /etc/containerd/certs.d/docker.io
cat > /etc/containerd/certs.d/docker.io/hosts.toml << EOF
server = "https://registry-1.docker.io"
[host."https://docker.m.daocloud.io"]
capabilities = ["pull", "resolve"]
EOF
# 配置私有仓库(HTTP 方式)
mkdir -p /etc/containerd/certs.d/hub.laoma.cloud
cat > /etc/containerd/certs.d/hub.laoma.cloud/hosts.toml << EOF
server = "http://hub.laoma.cloud"
[host."http://hub.laoma.cloud"]
capabilities = ["pull", "resolve"]
EOF
# 重启 containerd
systemctl restart containerd
镜像管理
命令和 Docker 完全一样:
# 查看镜像列表
nerdctl images
# 拉取镜像
nerdctl pull busybox
# 给镜像打标签
nerdctl tag busybox myrepo/busybox:v1
# 推送镜像
nerdctl login myrepo.com
nerdctl push myrepo/busybox:v1
# 导出镜像为 tar 文件
nerdctl save busybox -o busybox.tar
# 从 tar 文件导入镜像
nerdctl load -i busybox.tar
# 删除镜像
nerdctl rmi busybox
# 清理所有未使用的镜像
nerdctl image prune --all --force
容器管理
# 后台运行容器
nerdctl run -d --name nginx -p 8080:80 nginx
# 查看运行中的容器
nerdctl ps
# 查看所有容器(包括已停止的)
nerdctl ps -a
# 进入容器内部
nerdctl exec -it nginx bash
# 查看容器日志
nerdctl logs nginx
# 停止容器
nerdctl stop nginx
# 启动容器
nerdctl start nginx
# 重启容器
nerdctl restart nginx
# 删除容器
nerdctl rm nginx
# 查看端口映射
nerdctl port nginx
# 查看容器详细信息
nerdctl inspect nginx
网络原理
nerdctl 创建容器时,会自动创建一个叫 nerdctl0 的 Linux 网桥,容器的网关就是这个网桥。
# 查看主机上的网桥
ip addr show nerdctl0
# 查看网桥连接了哪些容器
brctl show
容器内的网卡是 eth0,通过 veth pair 和主机的网桥连接。容器之间通过网桥互通,访问外部网络通过 NAT。
存储挂载
和 Docker 一样,用 -v 参数挂载目录:
# 挂载主机目录(bind mount)
nerdctl run -d -v /data:/data busybox sleep infinity
# 使用命名卷(volume)
nerdctl run -d -v data:/data busybox sleep infinity
# 查看所有卷
nerdctl volume ls
和 crictl 的区别
| 对比项 | nerdctl | crictl |
|---|---|---|
| 命令风格 | 和 Docker 完全兼容 | K8s 专用,参数不同 |
| 适用场景 | 日常开发、测试 | K8s 排障 |
| 安装方式 | 需要手动安装 | K8s 节点默认自带 |
| 命名空间 | 默认 default | 默认 k8s.io |
一句话总结:日常用 nerdctl,K8s 排障用 crictl。
总结
nerdctl 是从 Docker 迁移到 containerd 生态的最佳桥梁。不用背新命令,不用改习惯,直接就能用。生产环境 K8s 节点上,配合 crictl 一起用,开发排障两不误。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/2301_80935320/article/details/168772262




