K8S 1.20 弃用 Docker 评估之 Docker CLI 的替代产品
title: K8S 1.20 弃用 Docker 评估之 Docker CLI 的替代产品
tags:
- Docker
- K8S
- OCI
- 容器
- 最佳实践
- RedHat
- Skopeo
- Buildah
- Podman
- DevOps
- containerd
- nerdctl
- CLI
excerpt: K8S 弃用 Docker 评估之:Docker CLI 替代品。
banner_img: >-
https://img2023.cnblogs.com/other/3034537/202302/3034537-20230228101018587-2116914018.svg
index_img: >-
https://img2023.cnblogs.com/other/3034537/202302/3034537-20230228101018383-1064981280.png
categories:
- 云原生
abbrlink: 36509
date: 2021-11-07 18:16:13
背景
2020 年 12 月初,Kubernetes 在其最新的 Changelog 中宣布,自 Kubernetes 1.20 之后将弃用 Docker 作为容器运行时。
弃用 Docker 带来的,可能是一系列的改变,包括不限于:
- 容器镜像构建工具
- 容器 CLI
- 容器镜像仓库
- 容器运行时
专题文章《K8S 1.20 弃用 Docker 评估》会从多方面分析由此带来的变动和影响,上一篇:《K8S 1.20 弃用 Docker 评估之 Docker 和 OCI 镜像格式的差别》 主要介绍 镜像格式的变化,今天来介绍 Docker CLI 的替代产品及个人推荐。
Docker 命令简介
这里通过简单介绍 Docker CLI 的命令,来引出 Docker 作为一个容器的完整 all-in-one 工具箱,具体包括了这么几大类:容器、镜像及镜像仓库、容器网络的能力。
容器类常用命令
- 重命名:
docker rename [CONTAINER_NAME] [NEW_CONTAINER_NAME]
- 运行:
docker run [IMAGE] [COMMAND]
- 删除:
docker rm [CONTAINER]
- 启动:
docker start [CONTAINER]
- 停止:
docker stop [CONTAINER]
- 重启:
docker restart [CONTAINER]
- Kill:
docker kill [CONTAINER]
- Attach:
docker attach [CONTAINER]
- 运行状态:
docker ps
- 日志:
docker logs [CONTAINER]
- Inspect:
docker inspect [OBJECT_NAME/ID]
- Events:
docker events [CONTAINER]
- Top:
docker top [CONTAINER]
- Stats:
docker stats [CONTAINER]
镜像类常用命令
- 构建:
docker build [URL]
- 打 Tag:
docker tag
- 登录 DockerHub:
docker login
- Pull:
docker pull [IMAGE]
- Push:
docker push [IMAGE]
- 导入镜像:
docker import [URL/FILE]
- 从容器创建镜像:
docker commit [CONTAINER] [NEW_IMAGE_NAME]
- 删除镜像:
docker rmi [IMAGE]
- 加载镜像:
docker load [TAR_FILE/STDIN_FILE]
- 保存镜像到 tar 包:
docker save [IMAGE] > [TAR_FILE]
- 列出镜像:
docke image ls
- 镜像历史:
docker history [IMAGE]
Docker 配置类命令
docker config
容器网络类常用命令
- 列出网络:
docker network ls
- 连接:
docker network connect [NETWORK] [CONTAINER]
- 断开连接:
docker network disconnect [NETWORK] [CONTAINER]
容器卷类常用命令
- 列出卷:
docker volume ls
- 创建卷:
docker volume create
- 删除卷:
docker volume rm
小结
在 K8S 场景下,容器网络类操作以及容器卷类的操作基本上都由 kubelet 来实现了,我们日常不需要太过关注。
容器类操作、容器工具的配置,在 K8S 里,也是由 kubelet 来实现了,但是如果我们需要在个人机器上测试及调试,且不用 Docker 的话,那么是需要找一个替代品。
至于镜像类常用命令,特别是构建过程,K8S 默认不会涉及这一块,那么不用 Docker 的话,容器构建工具也是需要找一个替代品的。
Docker 替代品
Docker 运行时替代品
runC 实现主要是2个:
- containerd: Docker 的公司贡献的
- CRI-O: RedHat 主导
目前主流的选择是:containerd,包括 K8S 社区和 Rancher 等。CRI-O 主要被 RedHat 的 OpenShift 4 采用。
除此之前的还有其他非 runC 的运行时,如:Kata 和 gVisor 等,使用较少,但也在增长。
Docker CLI 替代
Docker 镜像构建替代品
Docker 镜像构建替代品可选项有:
替代品懒人方案 - RedHat 开源的 3 件套:Buildah、Podman 和 Skopeo
先不提 K8S CRI 的替代。要替换掉 Docker,典型有以下方案:
- Docker 贡献的:nerdctl + buildkit
- RedHat 开源的:Buildah、Podman 和 Skopeo
我推荐的是:RedHat 开源的 3 件套:Buildah、Podman 和 Skopeo,理由如下:
- 功能齐全、强大:Buildah、Podman 和 Skopeo 可以完全覆盖 Docker 的功能,并且还额外提供一些 Docker 没有但是非常实用的功能,比如 docker 格式镜像转换为 oci 格式等。
- 稳定、安全:这 3 套工具,早在 2019 年就开始大规模的应用在 RedHat 的 OpenShift 4 上面了,历经多个版本迭代,安全 bug 修复较快,稳定性和安全有保障。
- 平滑继承:目前主流的企业 Linux 就是 RHEL 和 CentOS,它们的高版本自带这 3 个工具,甚至默认通过 alias 将 docker 命令映射为这些工具,可以平滑继承。
- 可以集成到现有的 K8S 或 CICD 系统中
- 在无根(rootless)模式下运行 - 无根容器更安全,因为它们运行时无需添加权限
- 不需要守护进程 - 这些工具在闲置时资源要求要小得多,因为当您没有运行容器时,Podman 没有运行,而 Docker 的守护进程总是运行。
- 原生 systemd 集成 - Podman 允许您创建 systemd unit 文件,并运行容器作为系统服务
下面做一些简单的介绍。
Buildah Podman Skopeo 3 件套介绍
RedHat 提供了一组在没有容器引擎的情况下可以运行的命令行工具。它们是:
- podman - 用于直接管理 pod 和容器镜像(
run
、stop
、start
、ps
、attach
、exec
等) - Buildah - 用于构建、推送和签名容器镜像
- Skopeo - 用于复制、检查、删除和签名镜像
由于这些工具与 Open Container Initiative(OCI) 兼容,所以它们可以用来管理由 Docker 和其他与 OCI 兼容的容器 。另外,它们特别适用于直接在 Red Hat Enterprise Linux 或 CentOS 中运行在单节点用例。
Buildah 、Podman、Skopeo 工具都更加轻量级,并专注于一组特性。
Podman 简介
配置
通过配置文件:/etc/containers/registries.conf
或 $HOME/.config/containers/registries.conf
配置。示例:
[registries.search]
registries = ['quay.io', 'docker.io']
[registries.insecure]
registries = ['insecure-registry.example.com']
[registries.block]
registries = []
镜像操作
配置好了之后可以
- 登录镜像仓库:
podman login docker.io
- 搜索镜像:
podman search quay.io/postgresql-10
- Pull 镜像:
podman pull <registry>[:<port>]/[<namespace>/]<name>:<tag>
- Push 镜像:
podman push registry.example.com:5000/postgresql/postgresql
- 列出镜像:
podman images
- 查看镜像:
podman inspect docker.io/postgresql
- 打 Tag:
podman tag docker.io/postgresql:10 mypg:10
- Save 镜像:
podman save -o myrsyslog.tar registry.redhat.io/rhel8/rsyslog:latest
- Load 镜像:
podman load -i myrsyslog.tar
- 删除镜像:
podman rmi registry.example.com:5000/postgresql/postgresql
容器操作
- 列出容器:
podman ps -a
- 停止容器:
podman stop mypg
- 运行容器:
podman run [options] image [command [arg ...]]
- 启动容器:
podman start mypg
- Inspect 容器:
podman inspect 64ad94586c74
- 容器中执行命令:
podman exec -it mypg /bin/bash
- Attach:
podman attach mypg
- 导出容器:
podman export -o mypg.tar 64ad94586c74
- 导入容器:
podman import mypg.tar mypg-imported
- Kill:
podman kill --signal="SIGHUP" 64ad94586c74
- 删除:
podman rm peaceful_hopper
- Top:
podman pod top mypod
- Stats:
podman pod stats -a --no-stream
- Inspect:
podman pod inspect mypod
卷操作
- 创建:
podman volume create hostvolume
- Inspect:
podman volume inspect hostvolume
- 挂载:
podman run -it --name myubi1 -v hostvolume:/containervolume1 registry.access.redhat.com/ubi8/ubi /bin/bash
Buildah 操作
- 构建镜像:
buildah bud -t caseycui/webserver .
- 多阶段构建:
buildah bud -t multi -f ~/Containerfile.multifrom .
Skopeo 简介
Skepeo 非常强大,其中的一些功能非常使用,特别是在 Docker 向 OCI 转变的阶段。举例说明:
在镜像拉取到本地前,Inspect 远程镜像的信息:
# skopeo inspect docker://registry.redhat.io/ubi8/ubi-init
{
"Name": "registry.redhat.io/ubi8/ubi8-init",
"Digest": "sha256:c6d1e50ab...",
"RepoTags": [
"8.2-13-source",
"8.0-15",
"8.1-28",
...
"latest"
],
"Created": "2020-12-10T07:16:37.250312Z",
"DockerVersion": "1.13.1",
"Labels": {
"architecture": "x86_64",
"build-date": "2020-12-10T07:16:11.378348",
"com.redhat.build-host": "cpt-1007.osbs.prod.upshift.rdu2.redhat.com",
"com.redhat.component": "ubi8-init-container",
"com.redhat.license_terms": "https://www.redhat.com/en/about/red-hat-end-user-license-agreements#UBI",
"description": "The Universal Base Image Init is designed to run an init system as PID 1 for running multi-services inside a container
...
镜像复制,除了本地和镜像仓库之间的复制外,还支持复制到更多场景(如:S3 等):
$ skopeo copy \
docker://registry.access.redhat.com/ubi8:8.1-397-source \
dir:$HOME/TEST
...
Copying blob 477bc8106765 done
Copying blob c438818481d3 done
Copying blob 26fe858c966c done
Copying blob ba4b5f020b99 done
Copying blob f7d970ccd456 done
Copying blob ade06f94b556 done
Copying blob cc56c782b513 done
Copying blob dcf9396fdada done
Copying blob feb6d2ae2524 done
Copying config dd4cd669a4 done
Writing manifest to image destination
Storing signatures
使用认证文件进行操作:skopeo inspect --creds=./auth.json docker://$IMAGE
️ 实用功能: docker 格式镜像和 oci 格式镜像相互转换:
skopeo copy oci:/tmp/myimage docker://registry.example.com/myimage
podman run docker://registry.example.com/myimage
skopeo copy docker://registry.example.com/myimage oci:/tmp/myimage
podman run oci:/tmp/myimage
️ 实用功能: 打成 docker 格式的 tar 包或 oci 格式的 tar 包:
skopeo copy docker://registry.fedoraproject.org/fedora:latest docker-archive:/tmp/fedora.img
podman run docker-archive:/tmp/fedora.img echo hello
skopeo copy docker-archive:/tmp/fedora.img oci-archive:/tmp/fedora-oci.img
podman run oci-archive:/tmp/fedora-oci.img echo hello
小结
通过上面也能看到,podman 基本上能替换 docker 的所有命令,而且命令的参数、格式等基本上和 docker cli 是一致的,替换和学习成本都不高。
总结
其实说实话,Docker CLI 的替换得分情况:
- K8S Node 上,CRI 已经从 Docker 替换为 containerd 或 CRI-O,那么这时候 K8S Node 上已经没有 docker cli 了,那么我推荐你使用:
nerdctl
+buildkit
(Node 上一般也不会进行镜像构建操作吧?镜像构建操作一般在 CICD 机器上或容器中)或 Buildah + Podman + Skopeo 三件套。其中 Skopeo 在 Docker 替换为其他的过程中用途还是挺大的; - 个人电脑、开发测试机、CICD 节点等非 K8S Node 上:建议还是使用 Docker。省心省力和熟悉。打出来的镜像 K8S 也能用。
️ 小提示:
另外无论是选择 nerdctl 还是 podman,最好通过 alias 伪装成 docker命令,为开发和用户提供一致的体验。
以上。
三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.
K8S 1.20 弃用 Docker 评估之 Docker CLI 的替代产品的更多相关文章
- 关于Kubernetes(简称K8S)的开启及基本使用,基于Docker Desktop & WSL2
背景介绍 Kubernetes(简称k8s)已成为目前业界容器编排的事实标准,其搭配Docker可建立非常高效便捷的高可扩展.高可用应用服务架构. Kubernetes的名字来自希腊语,意思是&quo ...
- [k8s]docker calico网络&docker cluster-store
docker cluster-store选项 etcd-calico(bgp)实现docker夸主机通信 配置calico网络 - 启动etcd etcd --listen-client-urls h ...
- 如何在K8S中优雅的使用私有镜像库 (Docker版)
前言 在企业落地 K8S 的过程中,私有镜像库 (专用镜像库) 必不可少,特别是在 Docker Hub 开始对免费用户限流之后, 越发的体现了搭建私有镜像库的重要性. 私有镜像库不但可以加速镜像的拉 ...
- jenkins流水线部署springboot应用到k8s集群(k3s+jenkins+gitee+maven+docker)(2)
前言:上篇已介绍了jenkins在k3s环境部署,本篇继续上篇讲述流水线构建部署流程 1.从gitlab上拉取代码步骤 在jenkins中,新建一个凭证:Manage Jenkins -> Ma ...
- 温故知新Docker概念及Docker Desktop For Windows v3.1.0安装
Docker 简介 什么是Docker? Docker是一个开放源代码软件项目,项目主要代码在2013年开源于GitHub.它是云服务技术上的一次创新,让应用程序布署在软件容器下的工作可以自动化进行, ...
- 建立docker私有库(docker registry)(转)
建立docker私有库(docker registry) 博客分类: docker 我的目标还是无互联网安装,部署内部的docker私有库,目前docker镜像的获得还是需要互联网,将下载好的do ...
- Windows 下安装使用docker swarm machine docker toolbox
下载docker 集成安装环境 http://get.daocloud.io/#install-toolbox 这个网站很不错,下载 这个集成了 docker docker-machine ,还有gi ...
- Docker Architecture、Docker Usage
目录 . 引言 - 为什么要有Docker技术 . Docker简介 . Docker安装.部署.使用 . Docker安全 . Docker底层实现 . Docker网络配置 . Dockerfil ...
- 【云计算】Docker云平台—Docker进阶
Docker云平台系列共三讲,此为第二讲:Docker进阶 参考资料: 五个Docker监控工具的对比:http://www.open-open.com/lib/view/open1433897177 ...
- Docker学习笔记 — Docker私有仓库搭建【转载】
标签: Docker 2015-03-10 21:08 24190人阅读 评论(0) 收藏 举报 分类: Docker(26) 目录(?)[+] 和Mavan的管理一样,Dockers不仅 ...
随机推荐
- 解读JVM级别本地缓存Caffeine青出于蓝的要诀 —— 缘何会更强、如何去上手
大家好,又见面了. 本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面.如果感兴趣,欢迎关注以获取后续更新. 在前面的几篇文章中,我们一起聊了下本地 ...
- Selenium4+Python3系列(十二) - 测试框架的设计与开发
前言 自己从未没想过能使用python来做自动化测试框架的设计.开发. 可能有人会好奇说,六哥,你怎么也用python写测试框架了? 领导说: python你也没有实际工作经验,可能就是自己自学的. ...
- uniapp开发微信小程序
uni-app介绍(官网) uni-app是一个使用Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS.Android.H5.以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉 ...
- 一阶段目标检测网络-RetinaNet 详解
摘要 1,引言 2,相关工作 3,网络架构 3.1,Backbone 3.2,Neck 3.3,Head 4,Focal Loss 4.1,Cross Entropy 4.2,Balanced Cro ...
- 关于Git在Visual studio及Git Bush中的日常操作教程,有图有说明,会一直更新本页内容... (Git相对SVN具有更加安全的分布式存储, 分支版本之间切换秒级速度, 分支版本强大灵活等特点)
>安装命令行和TortoiseGit UI程序. <git bash的安装> https://git-scm.com/downloads <windows可视化工具 Torto ...
- 论文解读(CAN)《Contrastive Adaptation Network for Unsupervised Domain Adaptation》
论文信息 论文标题:Contrastive Adaptation Network for Unsupervised Domain Adaptation论文作者:Guoliang Kang, Lu Ji ...
- Windows下Mariadb中文乱码问题
win10 在命令行使用Mariadb出现无法插入中文 并且之前正确插入的中文也无法正常显示了 ERROR 1366 (22007): Incorrect string value: '\xB1\xB ...
- Java基础篇——垃圾收集详解
JAVA垃圾收集 1.如何判断对象死亡 说道垃圾回收,那么首要问题就是jvm如何判断一个对象已经死亡呢 1.1 引用计数法 说白了,就是为每个对象设立一个引用计数器,每当有一个引用指向它,计数器加一, ...
- [cocos2d-x]TextureCache和spriteFramecache
SpriteFrameCache 主要服务于多张碎图合并出来的纹理图片.这种纹理在一张大图中包含了多张小图,直接通过TextureCache引用会有诸多不便,因而衍生出来精灵框帧的处理方式,即把截取好 ...
- Luogu P6394 樱花,还有你题解
原题链接:樱花,还有你 $\scr{\color{DarkOrchid}{Solution}}$ Subtask1 这是一个送分的:总和都不到$n$,无论怎么收集,花瓣数肯定不到$n$,输出impos ...