使用containerd单独创建容器

现在越来越多的k8s使用者放弃了docker, 转而直接使用containerd, 这里不讨论优劣, 只简单的介绍下如何用containerd创建一个容器

通过ctr创建容器

安装containerd

包括containerd, containerd-shim, runc

yum install containerd.io

如果找不到安装包, 请参照我之前的文章配置最新的yum源: docker快速安装

这条命令会将三者全部安装, 当然也可以下载二进制文件, 这里不做介绍

启动服务

systemctl start containerd

拉取镜像

ctr images pull docker.io/library/nginx:alpine

这里必须指定全路径

启动容器

ctr run -d docker.io/library/nginx:alpine test-nginx

通过ctr创建的容器和镜像与docker创建的不在同一目录存储, 所以相互之间看不到, 一般我们也不太会单独使用containerd, 配合k8s比较多, 如果一定要单独使用替代docker, 推荐官方工具nerdctl

通过crictl创建容器

编辑containerd的配置文件

# 新增下面配置
vi /etc/containerd/config.toml
####################################
[plugins]
  [plugins.cri]
    sandbox_image = "rancher/pause:3.1"
    [plugins.cri.cni]
      bin_dir = "/opt/cni/bin"
      conf_dir = "/etc/cni/net.d"
    [plugins.cri.registry]
      [plugins.cri.registry.mirrors]
        [plugins.cri.registry.mirrors."docker.io"]
          endpoint = ["https://docker.mirrors.ustc.edu.cn"]
  [plugins.linux]
    shim = "containerd-shim"
    runtime = "runc"
    runtime_root = ""
    no_shim = false
    shim_debug = false

一定要注释配置文件中的disabled_plugins = ["cri"]或删掉

  • sandbox_image: 沙箱镜像
  • bin_dir: 网络插件可执行程序
  • conf_dir: 网络插件配置文件
  • endpoint: 指定拉取镜像地址, 这里使用中科大的镜像站

重启程序

systemctl restart containerd

安装cni网络插件

下载地址: https://github.com/containernetworking/plugins

# 创建网络插件二进制目录
mkdir -p /opt/cni/bin

# 解压
tar -zxvf cni-plugins-linux-amd64-v0.8.7.tgz -C /opt/cni/bin

# 创建网络插件配置文件目录
mkdir -p /etc/cni/net.d

# 写入网桥配置文件
vi /etc/cni/net.d/10-mynet.conf
####################################
{
    "cniVersion": "0.2.0",
    "name": "mynet",
    "type": "bridge",
    "bridge": "cni0",
    "isGateway": true,
    "ipMasq": true,
    "ipam": {
        "type": "host-local",
        "subnet": "10.22.0.0/16",
        "routes": [
            { "dst": "0.0.0.0/0" }
        ]
    }
}
####################################

# 写入loop网卡配置文件
vi /etc/cni/net.d/99-loopback.conf
####################################
{
    "cniVersion": "0.2.0",
    "name": "lo",
    "type": "loopback"
}
####################################

配置文件, 由相关github提供: https://github.com/containernetworking/cni

安装crictl管理工具

下载地址: https://github.com/kubernetes-sigs/cri-tools

# 这里以v1.19.0版本为例, 压缩包中只有一个`crictl`可执行文件
tar -zxvf crictl-v1.19.0-linux-amd64.tar.gz -C /usr/bin

# 编辑配置文件
vi /etc/crictl.yaml
####################################
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: false

相关地址根据实际情况来定, 这里按默认配置就好

# 检测containerd环境
cricrtl info

内容较多, 如果没有输出报错信息, 基本成功过了

拉取镜像

# 提前拉取沙盒
crictl pull rancher/pause:3.1
# 用busybox镜像作为测试服务(体积小)
crictl pull busybox

可以看到, 用法类似docker pull, 但没有下载进度显示

创建pod配置文件

vi pod-config.json
####################################
{
    "metadata": {
        "name": "nginx-sandbox",
        "namespace": "default",
        "attempt": 1,
        "uid": "hdishd83djaidwnduwk28bcsb"
    },
    "log_directory": "/tmp",
    "linux": {}
}
  • name: pod名称, 可自定义
  • uid: id标识, 可自定义

创建container配置文件

vi container-config.json
####################################
{
    "metadata": {
        "name": "busybox"
    },
    "image":{
        "image": "busybox"
    },
    "command": [
        "top"
    ],
    "log_path":"busybox.0.log",
    "linux": {}
}
  • name: container名称, 可自定义
  • image: 镜像
  • command: 容器启动后, 执行的命令, 这里使用top, 避免容器退出

启动服务

crictl run container-config.json pod-config.json

查看服务

# 查看容器
crictl ps
# 查看pod
crictl pods

展示评论