K8S 1.20 弃用 Docker 评估之 Docker CLI 的替代产品

本文涉及的产品
云数据库 PolarDB MySQL 版,列存表分析加速 8核16GB
PolarSearch,搜索节点 4核8GB
PolarDB Agent Flow,2核4GB
简介: K8S 1.20 弃用 Docker 评估之 Docker CLI 的替代产品

背景

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 工具箱,具体包括了这么几大类:容器、镜像及镜像仓库、容器网络的能力。

容器类常用命令

  1. 重命名:docker rename [CONTAINER_NAME] [NEW_CONTAINER_NAME]
  2. 运行:docker run [IMAGE] [COMMAND]
  3. 删除:docker rm [CONTAINER]
  4. 启动:docker start [CONTAINER]
  5. 停止:docker stop [CONTAINER]
  6. 重启:docker restart [CONTAINER]
  7. Kill:docker kill [CONTAINER]
  8. Attach:docker attach [CONTAINER]
  9. 运行状态:docker ps
  10. 日志:docker logs [CONTAINER]
  11. Inspect:docker inspect [OBJECT_NAME/ID]
  12. Events:docker events [CONTAINER]
  13. Top:docker top [CONTAINER]
  14. Stats:docker stats [CONTAINER]

镜像类常用命令

  1. 构建:docker build [URL]
  2. 打 Tag:docker tag
  3. 登录 DockerHub:docker login
  4. Pull:docker pull [IMAGE]
  5. Push:docker push [IMAGE]
  6. 导入镜像:docker import [URL/FILE]
  7. 从容器创建镜像:docker commit [CONTAINER] [NEW_IMAGE_NAME]
  8. 删除镜像:docker rmi [IMAGE]
  9. 加载镜像:docker load [TAR_FILE/STDIN_FILE]
  10. 保存镜像到 tar 包:docker save [IMAGE] > [TAR_FILE]
  11. 列出镜像:docke image ls
  12. 镜像历史:docker history [IMAGE]

Docker 配置类命令

docker config

容器网络类常用命令

  1. 列出网络:docker network ls
  2. 连接:docker network connect [NETWORK] [CONTAINER]
  3. 断开连接:docker network disconnect [NETWORK] [CONTAINER]

容器卷类常用命令

  1. 列出卷:docker volume ls
  2. 创建卷:docker volume create
  3. 删除卷:docker volume rm

小结

在 K8S 场景下,容器网络类操作以及容器卷类的操作基本上都由 kubelet 来实现了,我们日常不需要太过关注。

容器类操作、容器工具的配置,在 K8S 里,也是由 kubelet 来实现了,但是如果我们需要在个人机器上测试及调试,且不用 Docker 的话,那么是需要找一个替代品。

至于镜像类常用命令,特别是构建过程,K8S 默认不会涉及这一块,那么不用 Docker 的话,容器构建工具也是需要找一个替代品的。

Docker 替代品

Docker 运行时替代品

runC 实现主要是 2 个:

目前主流的选择是:containerd,包括 K8S 社区和 Rancher 等。CRI-O 主要被 RedHat 的 OpenShift 4 采用。

除此之前的还有其他非 runC 的运行时,如:KatagVisor 等,使用较少,但也在增长。

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 和容器镜像(runstopstartpsattachexec 等)
  • Buildah - 用于构建、推送和签名容器镜像
  • Skopeo - 用于复制、检查、删除和签名镜像

由于这些工具与 Open Container Initiative(OCI) 兼容, 所以它们可以用来管理由 Docker 和其他与 OCI 兼容的容器 。另外,它们特别适用于直接在 Red Hat Enterprise Linux 或 CentOS 中运行在单节点用例。

Buildah 、Podman、Skopeo 工具都更加轻量级,并专注于一组特性。

Podman 简介

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 = []
PROPERTIES

镜像操作

配置好了之后可以

  1. 登录镜像仓库:podman login docker.io
  2. 搜索镜像:podman search quay.io/postgresql-10
  3. Pull 镜像:podman pull <registry>[:<port>]/[<namespace>/]<name>:<tag>
  4. Push 镜像:podman push registry.example.com:5000/postgresql/postgresql
  5. 列出镜像:podman images
  6. 查看镜像:podman inspect docker.io/postgresql
  7. 打 Tag:podman tag docker.io/postgresql:10 mypg:10
  8. Save 镜像: podman save -o myrsyslog.tar registry.redhat.io/rhel8/rsyslog:latest
  9. Load 镜像:podman load -i myrsyslog.tar
  10. 删除镜像:podman rmi registry.example.com:5000/postgresql/postgresql

容器操作

  1. 列出容器:podman ps -a
  2. 停止容器:podman stop mypg
  3. 运行容器:podman run [options] image [command [arg ...]]
  4. 启动容器:podman start mypg
  5. Inspect 容器:podman inspect 64ad94586c74
  6. 容器中执行命令:podman exec -it mypg /bin/bash
  7. Attach:podman attach mypg
  8. 导出容器:podman export -o mypg.tar 64ad94586c74
  9. 导入容器:podman import mypg.tar mypg-imported
  10. Kill:podman kill --signal="SIGHUP" 64ad94586c74
  11. 删除:podman rm peaceful_hopper
  12. Top:podman pod top mypod
  13. Stats:podman pod stats -a --no-stream
  14. Inspect:podman pod inspect mypod

卷操作

  1. 创建:podman volume create hostvolume
  2. Inspect:podman volume inspect hostvolume
  3. 挂载:podman run -it --name myubi1 -v hostvolume:/containervolume1 registry.access.redhat.com/ubi8/ubi /bin/bash

Buildah 操作

Buildah

  1. 构建镜像:buildah bud -t caseycui/webserver .
  2. 多阶段构建:buildah bud -t multi -f ~/Containerfile.multifrom .

Skopeo 简介

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
        ...
BASH

镜像复制,除了本地和镜像仓库之间的复制外,还支持复制到更多场景(如: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
BASH

使用认证文件进行操作: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  
BASH

❗️ 实用功能: 打成 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
BASH

小结

通过上面也能看到,podman 基本上能替换 docker 的所有命令,而且命令的参数、格式等基本上和 docker cli 是一致的,替换和学习成本都不高。

总结

其实说实话,Docker CLI 的替换得分情况:

  1. K8S Node 上,CRI 已经从 Docker 替换为 containerd 或 CRI-O,那么这时候 K8S Node 上已经没有 docker cli 了,那么我推荐你使用:nerdctl + buildkit (Node 上一般也不会进行镜像构建操作吧?镜像构建操作一般在 CICD 机器上或容器中)或 Buildah + Podman + Skopeo 三件套。其中 Skopeo 在 Docker 替换为其他的过程中用途还是挺大的;
  2. 个人电脑、开发测试机、CICD 节点等非 K8S Node 上:建议还是使用 Docker。省心省力和熟悉。打出来的镜像 K8S 也能用。

👍️ 小提示

另外无论是选择 nerdctl 还是 podman,最好通过 alias 伪装成 docker 命令,为开发和用户提供一致的体验。

以上。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
763 78
|
Kubernetes Docker 容器
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
574 25
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
Ubuntu Linux 开发工具
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包成标准化单元(容器),确保在任何支持 Docker 的操作系统上一致运行。容器共享主机内核,提供轻量级、高效的执行环境。本文介绍如何在 Ubuntu 上安装 Docker,并通过简单步骤验证安装成功。后续文章将探讨使用 Docker 部署开源项目。优雅草央千澈 源、安装 Docker 包、验证安装 - 适用场景:开发、测试、生产环境 通过以上步骤,您可以在 Ubuntu 系统上成功安装并运行 Docker,为后续的应用部署打下基础。
489 8
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
838 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
存储 Kubernetes Docker
Kubernetes(k8s)和Docker Compose本质区别
理解它们的区别和各自的优势,有助于选择合适的工具来满足特定的项目需求。
1863 19
|
Kubernetes Linux 虚拟化
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
4228 11
|
Shell Docker 容器
10 条让你离不开的 Docker 常用 CLI 命令
Docker 是构建微服务的绝佳工具,它可以让您创建基于云端的应用程序和系统。为了最大限度地利用您的终端,这里为您列出了使用率排名前 10 的 Docker 命令。
2675 0