Featured image of post containerd + nerdctl 初体验

containerd + nerdctl 初体验

背景介绍

最近因为docker不让商用,需付费的操作,导致项目上为了合规,急需替换docker。 普遍采用的是containerd + nerdctl的组合。

containerd: 是一个容器运行时,负责容器的创建、运行、暂停、恢复、删除等操作。 k8s的底层使用的就是containerd,所以稳定性是可以满足的,containerd代码地址

nerdctl: 是一个containerd的命令行工具,用于管理containerd中的容器,nerdctl代码地址

本次nerdctl的安装版本为:v2.1.4

安装部署

nerdctl依赖另外两个软件runccni。可以单独安装,这里不采用此种方式, 直接下载nerdctl完全包,里面会自带containerd,runc,cni等二进制程序,直接运行即可。

  1. 下载nerdctl完全包:

    wget https://github.com/containerd/nerdctl/releases/download/v2.1.4/nerdctl-full-2.1.4-linux-amd64.tar.gz

  2. 解压:

    tar Cxzvvf /usr/local nerdctl-full-2.1.4-linux-amd64.tar.gz

  3. 生成containerd的默认配置:

    containerd config default > /etc/containerd/config.toml

  4. 修改containerd的运行目录:

    vim /etc/containerd/config.toml

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    version = 3
    root = '/var/lib/containerd'
    state = '/run/containerd'
    temp = ''
    disabled_plugins = []
    required_plugins = []
    oom_score = 0
    imports = []
    
    [grpc]
      address = '/run/containerd/containerd.sock'
      tcp_address = ''
      tcp_tls_ca = ''
      tcp_tls_cert = ''
      tcp_tls_key = ''
      uid = 0
      gid = 0
      max_recv_message_size = 16777216
      max_send_message_size = 16777216
    

    修改rootstate的目录到磁盘空间大的目录,其他/run/containerd/相关的目录一起修改。

  5. 启动containerd服务:

    systemctl enable containerd && systemctl start containerd

  6. 创建nerdctl的配置文件:

    mkdir -p /etc/nerdctl && touch /etc/nerdctl/nerdctl.toml 新增配置data_root,更改containerd的日志产生的目录到磁盘较大的空间:

    1
    2
    
    data_root="/home/nerdctl"
    cni_path="/usr/local/libexec/cni"
    

    其他的参数可参考: nerdctl的配置说明

使用以上的步骤, containerd正常运行,nerdctl也可以使用了。

使用改造

说明:

  • containerd可以直接使用docker生成的image,为了尽可能少改动,所以就不使用nerdctl重新build镜像了。
  • 之前的容器使用docker-compose管理的, 现在也延用之前的docker-compose.yaml
  1. 创建命名空间

    nerdctl namespace create sbc

  2. 导入dockerimage

    nerdctl -n sbc load -i opensips.tar

  3. 运行容器

    nerdctl -n sbc compose -f docker-compose.yaml up -d

  4. 验证容器是否运行:

    nerdctl -n sbc ps

  5. 查看容器的日志:

    nerdctl -n sbc logs sbc

其他说明

因为nerdctl并不像docker那样可以通过配置/etc/docker/daemon.json来统一设置log的日志输出参数。 所以需要单个服务的docker-compose.yaml中, 配置logging参数。如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
services:
   opensips:
    image: opensips:3.4.5
    container_name: "ops"
    hostname: "ops"
    network_mode: "host"
    privileged: true 
    <<: *defaults
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "10"
本博客已稳定运行
发表了64篇文章 · 总计109.63k字
本站总访问量 次 · 您是本站第 位访问者
粤ICP备2025368587号-1| 使用 Hugo 构建
主题 StackJimmy 设计