迁移docker为containerd

技术 · 2022-10-05

2023-02-18更新

最近在升级nerdctl时发现有些地方变更了,最新的文档可以参考containerd官方的文档了


起因

一直在用nezha探针,服务端的部署方式很简单,直接用docker部署就可以了,但是自从上次迁移到racknerd之后出现了严重的内存泄露问题,如果一直看着dashboard,初始状态下从还不足50%会一直占用到70-80%,尝试各种限制但是效果并不明显。后来发现轻量级的containerd,进一步发现docker本身也是间接的管理containerd,既然都是containerd,那为什么还要装docker呢?于是尝试从docker迁移到containerd。

安装containerd

官方的安装说明也很简单,直接下载官方包,解压就可以了,具体安装如下:

#目前最新版为1.6.8,具体可以参考官方说明
wget https://github.com/containerd/containerd/releases/download/v1.6.8/cri-containerd-1.6.8-linux-amd64.tar.gz
#解压进行安装
tar -C / -xzf cri-containerd-1.6.8-linux-amd64.tar.gz

默认可以systemctl进行管理,比如开机自启等,操作如下:

#开机自启
systemctl enable containerd
#启动containerd
systemctl start containerd

安装nerdctl

containerd本身的管理太过简单,可以通过nerdctl进行管理,使用方式跟docker非常类似,具体安装如下:

#目前安装的是0.22.2,最新版参考官方
wget https://github.com/containerd/nerdctl/releases/download/v0.22.2/nerdctl-0.22.2-linux-amd64.tar.gz
#解压并安装到/usr/local/bin,仅限debian系,如果是centos则要么改路径,要么加环境变量
tar Cxzvvf /usr/local/bin nerdctl-0.22.2-linux-amd64.tar.gz

本身还需要cni-plugins,因此也需要安装

#当前最新版为1.1.1
wget https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz

#先创建所需的目录并解压安装
mkdir /opt/cni
mkdir /opt/cni/bin
tar Cxzvvf /opt/cni/bin cni-plugins-linux-amd64-v1.1.1.tgz

安装完之后如果没有其它问题就可以使用了。

遇到的问题

(1)runc无法启动,表现为启动镜像时报错:ctr: failed to create shim: OCI runtime create failed: unable to retrieve OCI runtime error (open /run/containerd/io.containerd.runtime.v2.task/xxxx/xxxxx/log.json: no such file or directory,刚开始时完全不知道怎么处理,后来通过爬文发现是runc的问题,最简单的可以直接执行runc命令,得到的错误是:runc: undefined symbol: seccomp_notify_respond,网上说是libseccomp版本问题,如果是centos则可以尝试更新依赖解决,由于我大部分都是debian,最简单的方式是替换runc,可以直接从这里下载,提供两种修复方式,一种是libseccomp-2.5.4.tar.gz源码,可以下载下来自己编译安装,另外一种是runc的可执行文件,我用的第二种,具体操作如下:

#下载runc
wget https://github.com/opencontainers/runc/releases/download/v1.1.4/runc.amd64
#重命名文件
mv runc.amd64 runc
#增加可执行权限
chmod +x runc
#查找当前runc所在目录
which runc
#替换当前runc,这是debian下的,centos下为/usr/bin/runc
mv runc /usr/local/sbin/runc

(2)缺少iptables组件,会提示:failed to locate iptables: exec: \"iptables\": executable file not found in $PATH",解决方法就是直接安装iptables就可以了

结束

最开始迁移的时候没有太在意,本身不太爱用docker的方式,感觉吃内存跟硬盘,但是最近看到可以用traffmonetizer挂机挣钱,手里小鸡也不算少,就打算部署一下,可官方并没有提供二进制的方式部署只有docker,没办法就用containerd进行部署了,也可以走我的aff,注册之后就可以得到5$,具体部署方式也很简单:

#拉取镜像
nerdctl pull traffmonetizer/cli:latest
# 启动
nerdctl run -d --name tm traffmonetizer/cli start accept --token  你的token

也不知道收益咋样,之前挂过peer2profit,但是感觉收益好少后面就放弃了,试试这个看看咋样😎。

containerd runc
Theme Jasmine by Kent Liao