containerd可用作Linux和Windows的守护程序。
它管理其主机系统的完整容器生命周期,从image传输和存储到容器执行和监控,再到低级存储,再到网络附件等。
准备一个虚拟机(此处用vagrant)
vagrant init envimation/ubuntu-xenial-docker
修改Vagrantfile
配置网络模式和Ip
config.vm.network "public_network", ip:"192.168.1.29"
配置内存大小,此处2G
config.vm.provider "virtualbox" do |vb|
vb.memory = "2048"
end
vagrant ssh
安装go和设置环境变量(省略)
获取cri
go get -v github.com/containerd/cri
编译containerd
进入$GOPATH/src/github.com/containerd/cri/cmd/containerd
注释掉
_ "github.com/containerd/cri"
执行
go install
编译ctr
进入$GOPATH/src/github.com/containerd/cri/cmd/ctr
执行
go install
准备config.toml如下
subreaper = true
oom_score = -999
[debug]
level = "debug"
[metrics]
address = "127.0.0.1:1338"
[plugins.linux]
runtime = "runc"
shim_debug = true
准备main.go,如下
package main
import (
"context"
"log"
"github.com/containerd/containerd"
"github.com/containerd/containerd/namespaces"
)
func main() {
if err := redisExample(); err != nil {
log.Fatal(err)
}
}
func redisExample() error {
client, err := containerd.New("/run/containerd/containerd.sock")
if err != nil {
return err
}
defer client.Close()
ctx := namespaces.WithNamespace(context.Background(), "default")
image, err := client.Pull(ctx, "docker.io/library/redis:alpine", containerd.WithPullUnpack)
if err != nil {
return err
}
return nil
}
试验
运行 contanerd
sudo containerd -c config.toml
运行main.go
sudo go run main.go
运行ctr
···
ctr images ls
···
可以看到镜像下载成功