containerd学习

  • 参考文档
    https://github.com/containerd/containerd/blob/master/README.md
    https://github.com/opencontainers/runc/blob/master/README.md
    https://github.com/opencontainers/runtime-spec/blob/master/config.md
    https://godoc.org/github.com/containerd/containerd/cmd/ctr/commands

    containerd学习
    文章图片
    containerd.png
  • 编译containerd/runc
    1. 在云厂商购买一台虚拟机,绑fip(116.196.115.229)
    2. 登录vm安装go,并设置GOROOT/GOPATH环境变量
      [root@containerd bin]# wget https://dl.google.com/go/go1.12.5.linux-amd64.tar.gz
      [root@containerd bin]# tar -xvf go1.12.5.linux-amd64.tar.gz -C /usr/local
      [root@containerd bin]# /usr/local/go/bin/go version
      go version go1.12.5 linux/amd64
      编辑/root/.bash_profile文件,添加如下设置后sourcePATH=$PATH:/usr/local/go/bin
      export PATH
      export GOROOT=/usr/local/go/
      export GOPATH=/root/go[root@containerd ~]# source .bash_profile
    3. Build the development environment
      [root@containerd ~]# go get github.com/containerd/containerd
      [root@containerd ~]# wget -c https://github.com/google/protobuf/releases/download/v3.5.0/protoc-3.5.0-linux-x86_64.zip
      [root@containerd ~]# unzip protoc-3.5.0-linux-x86_64.zip -d /usr/local
      [root@containerd ~]# yum install -y btrfs-progs-devel libseccomp-devel
    4. 编译runc
      [root@containerd ~]# go get github.com/opencontainers/runc[root@containerd containerd]# cd $GOPATH/src/github.com/opencontainers/runc
      [root@containerd runc]# make
      go build -buildmode=pie -ldflags "-X main.gitCommit="eb4aeed24ffbf8e2d740fafea39d91faa0ee84d0" -X main.version=1.0.0-rc8+dev " -tags "seccomp" -o runc .
      [root@containerd runc]# make install
      install -D -m0755 runc /usr/local/sbin/runc [root@containerd runc]# ls -rtl /usr/local/sbin
      total 11752
      -rwxr-xr-x 1 root root 12031832 May 10 17:33 runc
      [root@containerd runc]# runc --version
      runc version 1.0.0-rc8+dev
      commit: eb4aeed24ffbf8e2d740fafea39d91faa0ee84d0
      spec: 1.0.1-dev
    5. 编译containerd
      [root@containerd runc]# cd $GOPATH/src/github.com/containerd/containerd
      [root@containerd containerd]# make
      +bin/ctr
      +bin/containerd
      +bin/containerd-stress
      +bin/containerd-shim
      +bin/containerd-shim-runc-v1
      +bin/containerd-shim-runc-v2
      +binaries
      [root@containerd containerd]# make install
      +install bin/ctr bin/containerd bin/containerd-stress bin/containerd-shim bin/containerd-shim-runc-v1 bin/containerd-shim-runc-v2
      [root@containerd containerd]# ls -rtl /usr/local/bin
      total 133152
      -rwxr-x--- 1 root root 4433736 Nov 14 2017 protoc
      -rwxr-xr-x 1 root root 29709728 May 10 17:35 ctr
      -rwxr-xr-x 1 root root 51831136 May 10 17:35 containerd
      -rwxr-xr-x 1 root root 25094688 May 10 17:35 containerd-stress
      -rwxr-xr-x 1 root root 7302016 May 10 17:35 containerd-shim
      -rwxr-xr-x 1 root root 8980256 May 10 17:35 containerd-shim-runc-v1
      -rwxr-xr-x 1 root root 8980320 May 10 17:35 containerd-shim-runc-v2
      [root@containerd containerd]# containerd --version
      containerd github.com/containerd/containerd v1.2.0-551-g57fbb16 57fbb16234fa6c8a61e5e907a4148ea3b05bce1d
    6. containerd以daemon方式运行
      a.准备containered.service文件
      [root@containerd ~]# cat /usr/lib/systemd/system/containerd.service
      [Unit]
      Description=containerd container runtime
      Documentation=https://containerd.io
      After=network.target
      [Service]
      ExecStartPre=-/sbin/modprobe overlay
      ExecStart=/usr/local/bin/containerd
      Delegate=yes
      KillMode=process
      LimitNPROC=infinity
      LimitCORE=infinity
      LimitNOFILE=1048576
      [Install]
      WantedBy=multi-user.target
      [Install]
      WantedBy=multi-user.target
      b.enable设置开机自启动
      [root@containerd system]# systemctl enable containerd.service
      Created symlink from /etc/systemd/system/multi-user.target.wants/containerd.service to /usr/lib/systemd/system/containerd.service.
      c.准备containerd配置文件
      [root@containerd ~]# cat /etc/containerd/config.toml
      subreaper = true
      oom_score = -999
      [debug]
      level = "debug"
      [metrics]
      address = "127.0.0.1:1338"
      [plugins.linux]
      runtime = "runc"
      shim_debug = true
      d.启动containerd服务
      [root@containerd system]# systemctl start containerd.service
  • 准备rootfs和spec
    找另外一台安装了整套docker的机器(此处用本地oracle linux vm 10.12.162.67),制作测试所需的rootfs(bundle)文件
    1.创建 busybox/rootfs目录
    [root@localhost ~]# mkdir -p busybox/rootfs
    2.拉取busybox镜像
    [root@localhost ~]# docker pull busybox
    Using default tag: latest
    latest: Pulling from library/busybox
    53071b97a884: Pull complete
    Digest: sha256:32f65f5aae307c171fc69ce52be3c8b09675164a610a88efa607449311186378
    Status: Downloaded newer image for busybox:latest
    3.创建docker
    [root@localhost ~]# docker create --name tempbusybox busybox
    85b6e32db75da001669656b452a9a65fc2de7f1a9faac95c5aedf6de1127fa15
    4.导出rootfs和spec
    [root@localhost ~]# docker export tempbusybox | tar -C busybox/rootfs -xf -
    [root@localhost ~]# cd busybox/ && /usr/bin/docker-runc spec
    [root@localhost busybox]# ls
    config.json rootfs
    [root@localhost busybox]# ls rootfs/
    bin dev etc home proc root sys tmp usr var
    5.将rootfs和spec 拷贝到containered测试节点 116.196.115.229
    [root@localhost ~]# scp -r busybox/ root@116.196.115.229:/root
  • 测试
    【containerd学习】1.[root@containerd busybox]# cd /root/busybox
    2.利用containerd cli (/usr/local/bin/ctr)运行容器
    [root@containerd busybox]# ctr run -t -d --rootfs rootfs busybox /bin/sh
    [root@containerd busybox]# ctr container list
    CONTAINER IMAGE RUNTIME
    busybox - io.containerd.runtime.v1.linux
    [root@containerd busybox]# ps -ef |grep container
    root 9539 1 0 21:22 ? 00:00:03 /usr/local/bin/containerd
    root 15285 9539 0 22:02 ? 00:00:00 containerd-shim -namespace default -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/default/busybox -address /run/containerd/containerd.sock -containerd-binary /usr/local/bin/containerd -debug
    3.登录容器验证
    [root@containerd busybox]# ctr tasks list
    TASK PID STATUS
    busybox 15301 RUNNING
    [root@containerd busybox]# ctr tasks exec -t --exec-id 15301 busybox /bin/sh
    / # hostname
    containerd
    / # ip a
    1: lo: mtu 65536 qdisc noqueue qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
    valid_lft forever preferred_lft forever
    4.stop容器
    [root@containerd busybox]# ctr tasks kill --signal 9 busybox
    [root@containerd busybox]# ctr tasks list
    TASK PID STATUS
    busybox 15301 STOPPED
    5.删除容器
    [root@containerd busybox]# ctr container delete busybox
    [root@containerd busybox]# ctr container list
    CONTAINER IMAGE RUNTIME

    推荐阅读