自我介绍
kubernetes
在1.24
版本之后就要抛弃docker-shim
组件,容器运行时也是从docker
转换到了containerd
,而containerd
自带的ctr
命令并不好用,并且自身不支持构建镜像
,并不像docker
一样可以通过docker build
来构建镜像containerd
有一个子项目:nerdctl
,用来兼容docker cli
,可以像docker
命令一样来管理本地的镜像和容器
wget
下载的时候,需要加上--no-check-certificate
参数,不然可能会返回Unable to establish SSL connection.
这样的报错
仅有
nerdctl
命令
- 无法使用
nerdctl build
命令,执行nerdctl build
会出现如下报错:ERRO[0000] buildctl needs to be installed and buildkitd needs to be running
- 不仅有
netdctl
命令,还包含了buildkitd
、buildctl
、ctr
、runc
等containerd
相关的命令,以及cni
插件的二进制文件
nerdctl 精简版使用方法
- 下载精简版二进制文件后,只需要把解压出来的文件放到
/usr/bin
目录下就可以了,当然有特殊需求,也可以解压到指定的路径,追加到PATH
变量也可以nerdctl
命令默认链接containerd.sock
文件路径是/run/containerd/containerd.sock
,如果和containerd
配置文件内配置的containerd.sock
不同,使用nerdctl
命令的时候需要加上-a
参数来指定containerd.sock
路径
tar xf nerdctl-1.0.0-linux-amd64.tar.gz -C /usr/bin
随后就可以跟
docker
命令一样去查看容器和镜像了
配置 nerdctl 参数自动补齐
参数自动补齐,需要系统已经安装了
bash-completion.noarch
工具
echo 'source <(nerdctl completion bash)' >> /etc/profile
# 重新加载 /etc/profile 文件
source /etc/profile
nerdctl 命令验证
containerd
和docker
在kubernetes
上使用的区别在于:containerd
作为容器运行时的情况下,需要把镜像放到k8s.io
这个namespace
下下载镜像
nerdctl -n k8s.io image pull centos:7
ctr 命令验证
ctr -n k8s.io image ls
nerdctl 完整版使用方法
- 用完整版是为了可以使用
nerdctl build
命令,而nerdctl build
命令其实时使用了buildctl
命令来构建镜像- 完整版的
lib
目录下有现成的buildkit.service
文件,不过需要注意buildkitd
命令的路径,文件内默认的路径是/usr/local/bin/buildkitd
,需要把二进制文件放到指定路径下,或者修改文件的默认路径
cp lib/systemd/system/buildkit.service /lib/systemd/system/
buildkitd
-buildkit 服务端命令
buildkitd
有两种可用的worker
,一个是runc
,一个是containerd
;默认使用runc
,在buildkitd
参数中为oci-worker
使用
containerd
作为worker
,需要增加--oci-worker=false --containerd-worker=true
参数
- 和
nerdctl
命令一样,默认调用的是/run/containerd/containerd.sock
文件,如果路径不一致,需要增加--containerd-worker-addr
参数来指定containerd.sock
文件的路径使用
containerd
作为worker
时,会自动创建buildkit
这个namespace
,可以通过nerdctl namespace ls
命令来查看
- 如果使用
nerdctl build
命令构建镜像,想把构建的镜像放到buildkit
这个namespace
下面,需要使用nerdctl -n buildkit build
命令来指定namespace
- 如果使用
buildctl
命令构建镜像,会自动将构建好的镜像放到buildkit
这个namespace
下面
buildctl
-buildkit 客户端命令
- 执行
nerdctl build
需要保证buildctl
命令在系统PATH
环境变量中可查启动 buildkit
systemctl enable buildkit.service --now
nerdcrtl 构建镜像
简单写一个
Dockerfile
验证一下
FROM alpine:3.16.3
ENV LANG=en_US.UTF-8
ENV TZ="Asia/Shanghai"
RUN echo '/bin/sleep 315360000' > start.sh
CMD ["sh","start.sh"]
构建镜像
nerdctl build -t alpine:3.16.3-test .
使用
buildctl
命令构建镜像
buildctl build --frontend dockerfile.v0 \
--local context=. \
--local dockerfile=. \
--output type=image,name=alpine:3.16.3-buildctl
--frontend
-使用 dockerfile.v0 作为前端,还有 gateway.v0 可以作为前端
--local context=
-Dockerfile 执行构建时的路径上下文,比如在从目录中拷贝文件到镜像里
--local dockerfile=
-Dockerfile 文件所在路径
--output name=
-构建后的镜像名称
挺麻烦的,我还是选择
nerdctl
命令把