1. 容器运行时选型背景
在云原生技术栈中,容器运行时作为承上启下的关键组件,直接影响着容器化应用的性能和稳定性。传统Docker方案虽然简单易用,但其厚重的架构设计(内置containerd、runc等多个组件)在追求轻量化的生产环境中逐渐显露出局限性。这正是containerd作为CNCF毕业项目脱颖而出的根本原因——它剥离了Docker的UI层和集群管理功能,专注于核心的容器生命周期管理。
nerdctl的出现则填补了containerd生态的工具链空白。作为containerd的官方CLI工具,它提供了类似docker命令的使用体验,同时完全基于containerd原生API构建。这种组合既保留了轻量化优势,又兼顾了开发者的使用习惯。实测在Kubernetes生产环境中,containerd+nerdctl方案相比传统Docker方案可减少约30%的内存占用,容器启动速度提升15%以上。
2. 基础环境准备
2.1 系统要求与内核配置
推荐使用Linux内核版本4.14及以上,关键内核模块需预先加载:
bash复制lsmod | grep overlay # 检查overlay文件系统支持
modprobe overlay # 若无输出则手动加载
对于CentOS/RHEL系列需额外配置:
bash复制cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
sudo sysctl --system # 应用网络相关内核参数
2.2 依赖组件安装
不同发行版的依赖处理方式:
-
Debian/Ubuntu:
bash复制sudo apt-get update && sudo apt-get install -y \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common -
RHEL/CentOS:
bash复制sudo yum install -y yum-utils device-mapper-persistent-data lvm2
注意:对于国内服务器建议配置镜像源加速,例如阿里云或腾讯云的镜像站
3. Containerd安装详解
3.1 官方二进制安装
推荐从GitHub releases页面获取最新稳定版:
bash复制export CTDR_VERSION=1.6.8
wget https://github.com/containerd/containerd/releases/download/v${CTDR_VERSION}/containerd-${CTDR_VERSION}-linux-amd64.tar.gz
sudo tar Cxzvf /usr/local containerd-${CTDR_VERSION}-linux-amd64.tar.gz
验证安装:
bash复制containerd --version # 应输出类似 containerd github.com/containerd/containerd v1.6.8
3.2 系统服务配置
创建systemd单元文件:
bash复制sudo mkdir -p /usr/local/lib/systemd/system
sudo containerd config default | sudo tee /etc/containerd/config.toml
关键配置项调优建议:
toml复制[plugins."io.containerd.grpc.v1.cri".containerd]
snapshotter = "overlayfs"
disable_snapshot_annotations = true
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true # 使用systemd作为cgroup驱动
启动服务:
bash复制sudo systemctl daemon-reload
sudo systemctl enable --now containerd
4. nerdctl安装与配置
4.1 二进制安装方式
获取对应架构的最新版本:
bash复制export NERDCTL_VERSION=0.22.2
wget https://github.com/containerd/nerdctl/releases/download/v${NERDCTL_VERSION}/nerdctl-${NERDCTL_VERSION}-linux-amd64.tar.gz
sudo tar Cxzvf /usr/local/bin nerdctl-${NERDCTL_VERSION}-linux-amd64.tar.gz
验证安装:
bash复制nerdctl --version
4.2 命名空间配置
nerdctl默认使用default命名空间,建议为不同项目创建独立命名空间:
bash复制sudo nerdctl namespace create project-a
export CONTAINERD_NAMESPACE=project-a # 临时切换
# 或写入bashrc持久化:echo 'export CONTAINERD_NAMESPACE=project-a' >> ~/.bashrc
4.3 镜像加速配置
创建配置文件/etc/containerd/certs.d/docker.io/hosts.toml:
toml复制server = "https://docker.io"
[host."https://registry-1.docker.io"]
capabilities = ["pull", "resolve"]
[host."https://registry-1.docker.io".header]
X-Mirror-Accel = "https://<your-mirror>.mirror.aliyuncs.com"
5. 核心功能验证
5.1 容器生命周期测试
完整工作流验证:
bash复制nerdctl pull nginx:alpine
nerdctl run -d --name web -p 8080:80 nginx:alpine
nerdctl exec web nginx -t # 验证容器内命令执行
nerdctl logs web
nerdctl stop web && nerdctl rm web
5.2 构建功能测试
创建简单Dockerfile:
dockerfile复制FROM alpine
RUN apk add --no-cache curl
CMD ["curl", "--version"]
构建并运行:
bash复制nerdctl build -t curl-test .
nerdctl run --rm curl-test
6. 生产环境调优指南
6.1 存储驱动选择
根据文件系统类型选择最优snapshotter:
- ext4/xfs: overlayfs(默认)
- btrfs: btrfs
- zfs: zfs
检查当前配置:
bash复制nerdctl info | grep Storage
6.2 资源限制配置
通过cgroups v2实现精细控制:
bash复制nerdctl run -d \
--cpus 1.5 \
--memory 512M \
--memory-reservation 256M \
--blkio-weight 500 \
--name constrained-app nginx
验证限制生效:
bash复制cat /sys/fs/cgroup/system.slice/nerdctl-$(nerdctl inspect -f '{{.Id}}' constrained-app)/cpu.max
6.3 网络方案选型
内置支持的网络类型对比:
| 网络类型 | 适用场景 | 性能损耗 | 隔离性 |
|---|---|---|---|
| bridge | 单机多容器互通 | 中等 | 弱 |
| host | 高性能场景 | 最低 | 无 |
| none | 特殊网络配置 | - | 完全 |
| macvlan | 直接暴露到物理网络 | 低 | 强 |
创建macvlan网络示例:
bash复制sudo nerdctl network create \
--driver macvlan \
--subnet 192.168.1.0/24 \
--gateway 192.168.1.1 \
-o parent=eth0 \
prod-net
7. 常见问题排查
7.1 镜像拉取失败
典型错误现象:
code复制ERROR: failed to solve: failed to do request: Head "https://registry-1.docker.io/v2/...": x509: certificate signed by unknown authority
解决方案:
bash复制sudo mkdir -p /etc/containerd/certs.d/docker.io
sudo curl -o /etc/containerd/certs.d/docker.io/ca.crt https://curl.se/ca/cacert.pem
sudo systemctl restart containerd
7.2 容器启动超时
检查点:
- 确认cgroup驱动一致性(kubelet与containerd都使用systemd)
- 检查内核日志是否有OOM事件:
dmesg | grep oom - 验证存储驱动是否匹配文件系统:
nerdctl info | grep Storage
7.3 网络连通性问题
诊断命令集:
bash复制nerdctl network ls
nerdctl network inspect [NETWORK_NAME]
ip link show | grep veth
iptables -L -n -v --line-numbers
8. 进阶功能探索
8.1 容器镜像构建增强
使用BuildKit提升构建性能:
bash复制nerdctl build --buildkit-host=tcp://127.0.0.1:1234 .
# 需先启动buildkitd服务
8.2 Kubernetes集成
配置CRI使用containerd:
bash复制cat <<EOF | sudo tee /etc/containerd/config.toml
version = 2
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.k8s.io/pause:3.6"
EOF
验证kubelet配置:
bash复制cat /var/lib/kubelet/kubeadm-flags.env | grep -- --container-runtime-endpoint
# 应包含:--container-runtime-endpoint=unix:///run/containerd/containerd.sock
8.3 根文件系统加密
使用eCryptfs保护容器数据:
bash复制sudo apt-get install ecryptfs-utils
sudo mount -t ecryptfs ~/encrypted ~/encrypted # 按提示配置
nerdctl run -v ~/encrypted:/data alpine ls /data