Containerd相关使用
Containerd 安装
#依赖安装
rpm -qa |grep libseccomp
yum install wget -y
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/libseccomp-2.3.1-4.el7.x86_64.rpm
yum install libseccomp-2.3.1-4.el7.x86_64.rpm -y
#下载
wget https://github.com/containerd/containerd/releases/download/v1.5.5/cri-containerd-cni-1.5.5-linux-amd64.tar.gz
# 如果有限制,也可以替换成下面的 URL 加速下载
# wget https://download.fastgit.org/containerd/containerd/releases/download/v1.5.5/cri-containerd-cni-1.5.5-linux-amd64.tar.gz
#解压到系统各个目录中去
tar -C / -xzf cri-containerd-cni-1.5.5-linux-amd64.tar.gz
#环境变量设置
echo 'export PATH=$PATH:/usr/local/bin:/usr/local/sbin' >> ~/.bashrc
source ~/.bashrc
#生成默认配置
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
#查看启动配置文件
cat /etc/systemd/system/containerd.service
#启动
systemctl enable containerd --now
#查看版本
ctr version
#查看插件列表
ctr plugin ls
#配置加速器
[plugins."io.containerd.grpc.v1.cri".registry]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://bqr1dr1n.mirror.aliyuncs.com"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
endpoint = ["https://registry.aliyuncs.com/k8sxio"]
Containerd 使用
镜像相关
#要注意的是镜像地址需要加上 docker.io Host 地址, --platform 选项指定对应平台的镜像
ctr image pull docker.io/library/nginx:alpine
#推送镜像,如果是私有镜像则在推送的时候可以通过 --user 来自定义仓库的用户名和密码
ctr image push
#列出本地镜像 -q 参数只打印镜像名称
ctr image ls
#检测本地镜像,主要查看其中的 STATUS, complete 表示镜像是完整可用的状态
ctr image check
#重新打标签
ctr image tag docker.io/library/nginx:alpine harbor.k8s.local/course/nginx:alpine
#删除镜像 加上 --sync 选项可以同步删除镜像和所有相关的资源
ctr image rm harbor.k8s.local/course/nginx:alpine
#将镜像挂载到主机目录
ctr image mount docker.io/library/nginx:alpine /mnt
#将镜像从主机目录上卸载
ctr image unmount /mnt
#将镜像到处为压缩包
ctr image export --all-platforms nginx.tar.gz docker.io/library/nginx:alpine
#将压缩包导入镜像
ctr image import nginx.tar.gz
#直接导入可能会出现类似于 ctr: content digest sha256:xxxxxx not found 的错误,要解决这个办法需要 pull 所有平台镜像:
ctr i pull --all-platforms docker.io/library/nginx:alpine
ctr i export --all-platforms nginx.tar.gz docker.io/library/nginx:alpine
ctr i rm docker.io/library/nginx:alpine
ctr i import nginx.tar.gz
容器相关
#创建容器
ctr container create docker.io/library/nginx:alpine nginx
#列出容器 -q 精简内容
ctr container ls
#查看容器详细配置,类似docker inspect
ctr container info nginx
#删除容器 也可以使用 delete 或者 del 删除容器
ctr container rm nginx
ctr container ls
任务相关
#container create 命令创建的容器,并没有处于运行状态,只是一个静态的容器
#一个 container 对象只是包含了运行一个容器所需的资源及相关配置数据,表示 namespaces、rootfs 和容器的配置都已经初始化成功了,只是用户进程还没有启动
#一个容器真正运行起来是由 Task 任务实现的,Task 可以为容器设置网卡,还可以配置工具来对容器进行监控等
#运行容器
ctr container create docker.io/library/nginx:alpine nginx
ctr task start -d nginx
#查看正在运行的容器
ctr task ls
#获取容器的cgroup相关信息,还有内存、CPU 和 PID 的限额与使用量
ctr task metrics nginx
#查看容器中所有进程在宿主机中的 PID
ctr task ps nginx
#进入容器操作 --exec-id 后的id可以随意,唯一即可
ctr task exex --exec-id 0 -t nginx sh
#暂停容器
ctr task pause nginx
ctr task ls # STATUS 变成了PAUSED
#恢复容器
ctr task resume nginx
ctr task ls # STATUS 变成了RUNING
#杀掉容器 没有stop,只有暂停或者杀死
ctr task kill nginx
ctr task ls # STATUS 变成了STOPPED
#删除task
ctr task rm nginx
ctr task ls # 此时没有了
命名空间
#containerd支持命名空间概念,不指定命名空间就是在default
#查看命名空间
ctr ns ls
#创建命名空间
ctr ns creat test
#删除命名空间
ctr ns rm test # ctr ns remove test
#操作资源的时候就可以指定命名空间,使用 -n 参数指定即可
ctr -n test image ls
#Docker 使用的 containerd 下面的命名空间默认是 moby,而不是 default,所以假如我们有用 docker 启动容器,那么我们也可以通过 ctr -n moby 来定位下面的容器
ctr -n moby container ls
#同样 Kubernetes 下使用的 containerd 默认命名空间是 k8s.io,所以我们可以使用 ctr -n k8s.io 来查看 Kubernetes 下面创建的容器
Containerd 高级工具 nerdctl
安装
# 如果没有安装 containerd,则可以下载 nerdctl-full-<VERSION>-linux-amd64.tar.gz 包进行安装
wget https://github.com/containerd/nerdctl/releases/download/v0.12.1/nerdctl-0.12.1-linux-amd64.tar.gz
# 如果有限制,也可以替换成下面的 URL 加速下载
# wget https://download.fastgit.org/containerd/nerdctl/releases/download/v0.12.1/nerdctl-0.12.1-linux-amd64.tar.gz
mkdir -p /usr/local/containerd/bin/ && tar -zxvf nerdctl-0.12.1-linux-amd64.tar.gz nerdctl && mv nerdctl /usr/local/containerd/bin/
ln -s /usr/local/containerd/bin/nerdctl /usr/local/bin/nerdctl
nerdctl version
使用命令
容器相关
#运行容器
nerdctl run -d -p 80:80 --name=nginx --restart=always nginx:alpine
#进入容器
nerdctl exec -it nginx /bin/sh
#列出容器 -a -q
nerdctl ps
#获取容器详细信息
nerdctl inspect nginx
#查看容器日志
nerdctl logs -f nginx
#停止容器
nerdctl stop nginx
#删除容器 -f 或者 --force 强制删除
nerdctl rm nginx
镜像相关
#查看所有镜像
nerdctl images
#拉取镜像
nerdctl pull docker.io/library/busybox:latest
#推送镜像
nerdctl login --username xxx --password xxx #登录
nerdctl logout #注销退出登录
nerdctl push
#重新给镜像打标签
nerdctl tag nginx:alpine harbor.k8s.local/course/nginx:alpine
#导出镜像
nerdctl save -o busybox.tar.gz busybox:lastest
#删除镜像
nerdctl rmi busybox
#导入镜像
nerdctl load -i busybox.tar.gz
构建镜像
安装 buildctl
nerdctl build 需要依赖 buildkit 工具
buildkit 项目也是 Docker 公司开源的一个构建工具包,支持 OCI 标准的镜像构建。它主要包含以下部分
服务端 buildkitd:当前支持 runc 和 containerd 作为 worker,默认是 runc,我们这里使用 containerd
客户端 buildctl:负责解析 Dockerfile,并向服务端 buildkitd 发出构建请求
buildkit 是典型的 C/S 架构,客户端和服务端是可以不在一台服务器上,而 nerdctl 在构建镜像的时候也作为 buildkitd 的客户端,所以需要我们安装并运行 buildkitd
wget https://github.com/moby/buildkit/releases/download/v0.9.1/buildkit-v0.9.1.linux-amd64.tar.gz
# 如果有限制,也可以替换成下面的 URL 加速下载
# wget https://download.fastgit.org/moby/buildkit/releases/download/v0.9.1/buildkit-v0.9.1.linux-amd64.tar.gz
tar -zxvf buildkit-v0.9.1.linux-amd64.tar.gz -C /usr/local/containerd/
ln -s /usr/local/containerd/bin/buildkitd /usr/local/bin/buildkitd
ln -s /usr/local/containerd/bin/buildctl /usr/local/bin/buildctl
cat /etc/systemd/system/buildkit.service
[Unit]
Description=BuildKit
Documentation=https://github.com/moby/buildkit
[Service]
ExecStart=/usr/local/bin/buildkitd --oci-worker=false --containerd-worker=true
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable buildkit --now
systemctl status buildkit
构建
cat Dockerfile
FROM nginx
RUN echo 'Hello Nerdctl From Containerd' > /usr/share/nginx/html/index.html
#一定要关闭防火墙和selinux
nerdctl build -t nginx:nerdctl -f Dockerfile .
#查看是否构建成功
nerdctl images
#测试是否成功
nerdctl run -d -p 80:80 --name=nginx --restart=always nginx:nerdctl
crul 127.0.0.1
文档整理:https://www.qikqiak.com/k3s/