背景

2020 年 12 月初,Kubernetes 在其最新的 Changelog 中宣布,自 Kubernetes 1.20 之后将弃用 Docker 作为容器运行时。

弃用 Docker 带来的,可能是一系列的改变,包括不限于:

  • 容器镜像构建工具
  • 容器 CLI
  • 容器镜像仓库
  • 容器运行时

专题文章《K8S 1.20 弃用 Docker 评估》会从多方面分析由此带来的变动和影响。

  1. 《K8S 1.20 弃用 Docker 评估之 Docker 和 OCI 镜像格式的差别》 主要介绍 镜像格式的变化
  2. 《K8S 1.20 弃用 Docker 评估之 Docker CLI 的替代产品》 主要介绍 Docker CLI 的替代产品及个人推荐 - RedHat 3件套 - Buildah、Podman 和 Skopeo

书接上文,今天来介绍 Docker CLI 替代产品的另一种选择:nerdctl。

nerdctl 简介

nerdctl:是由 containerd 开源的、contaiNERD CTL,这是一个用于 containerd 的,且和 Docker 兼容的 CLI,另外还支持 Compose。

典型应用场景

K8S 1.20+ Node 上做容器 Debug

如果你最近刚刚开始使用 K8S 1.20 及以上版本,并且 CRI 选择了 containerd ,那么你会注意到 containerd 默认带的 CLI - ctr 相比 Docker CLI 发生了较大变化,且存在以下问题:

与 Docker CLI 不兼容,对用户不友好。另外,ctr 缺少以下类似 Docker CLI 的命令:

  • docker run -p <PORT>
  • docker run --restart=always --net=bridge
  • 使用 ~/.docker/config.json 配置 docker pull 以及认证助手工具如 docker-credential-ecr-login
  • docker logs

nerdctl 最主要的优点就是几乎完全兼容 Docker CLI,那么 nerdctl 在 K8S 集群中 debug 就很方便。

仅有的一些差别在于 nerdctl 有 namespace 的概念(✍️备注:其实是 containerd 有 namespace 的概念),如下:

  • default(默认)
  • moby:Docker
  • k8s.io:Kubernetes 集群

举例来说要列出 k8s 中的容器,需要:

nerdctl --namespace k8s.io ps -a

综上,在新版本 K8S 中,为了用户体验的一致性,建议:

  1. 在 K8S Node 上都安装 nerdctl,安装步骤:
  2. 通过 alias 命令,实现和之前版本体验一致,操作如下:

vi ~/.bashrc

因为主要是用于 K8S Node 上 debug,所以直接这么写:

alias docker='nerdctl -n k8s.io'

安装和使用

curl -fsSLO https://github.com/containerd/nerdctl/releases/download/v0.13.0/nerdctl-0.13.0-linux-amd64.tar.gz
tar xvzf nerdctl-0.13.0-linux-amd64.tar.gz -C /usr/local/bin/ nerdctl

完整的使用手册见:nerdctl README,可以看到是基本上和 Docker 命令一样。

总结

在 K8S 1.20+ Node 上做容器 Debug,需要用到 CLI,建议使用 nerdctl,并且 alias 成 Docker 提供一致的体验。

至于个人电脑或是操作机,建议不要替换,直接用 Docker 全套它不香吗?

三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.

最新文章

  1. Effective Python2 读书笔记2
  2. ssh(sturts2_spring_hibernate) 框架搭建之struts2
  3. 给VIM安装插件。让ubuntu的vim强大起来
  4. javascript测试
  5. sublime text 3 安装
  6. (Your)((Term)((Project)))
  7. Android中的pix,sp,dp相关概念
  8. Spring 创建bean的模式
  9. Gridview导出到Excel
  10. CentOS7安全设置 yum-cron系统自动更新,firewalld防火墙简单使用
  11. linux下挂载第二块硬盘
  12. druid查询
  13. linux(debian) arm-linux-g++ v4.5.1交叉编译 embedded arm 版本的QtWebkit (browser) 使用qt 4.8.6 版本 以及x64上编译qt
  14. 温习排序算法(基于C指针)
  15. jmeter连接oracle数据库配置
  16. 为什么用bower 安装bootstrap而不用npm来安装?
  17. python知识点及面试面试大集合
  18. linux每日命令(17):which命令
  19. 解决oninput在输入中文时,会获取拼音的问题
  20. Codeforces 901C. Bipartite Segments(思维题)

热门文章

  1. MySQL数据库和Python的交互
  2. Django静态文件配置(from表单-request对象方法-get请求与post请求-视图函数书写)
  3. (admin.E108) The value of &#39;list_display[0]&#39; refers to &#39;productname&#39;, which is not a callable, an attribute of &#39;ProductAdmin&#39;, or an attribute or method on &#39;product.Product&#39;.
  4. 第七节 VOR/DME进近程序保护区的绘制
  5. [python] 个人日常python工具代码
  6. npm ERR! An unknown git error occurred
  7. cookie设置失败
  8. angular---angular路由守卫,有的可以访问有的不可以访问,有的路由地址只有在满足条件时候访问,其它禁止访问,
  9. NuxtJS踩坑日记,一步一步爬出我自己挖的坑。
  10. 【单片机】nRF52832 实现停止蓝牙广播接口