关于kubernetes:K8S-120-弃用-Docker-评估之-Docker-CLI-的替代产品

41次阅读

共计 6269 个字符,预计需要花费 16 分钟才能阅读完成。

背景

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: Docker 的公司奉献的
  • CRI-O: RedHat 主导

目前支流的抉择是:containerd,包含 K8S 社区和 Rancher 等。CRI-O 次要被 RedHat 的 OpenShift 4 采纳。

除此之前的还有其余非 runC 的运行时,如:Kata 和 gVisor 等,应用较少,但也在增长。

Docker CLI 代替

  • Podman
  • nerdctl

Docker 镜像构建替代品

Docker 镜像构建替代品可选项有:

  • Buildah:RedHat 主导
  • BuildKit:Moby 之下,由 Docker 奉献。
  • Kaniko:Google 主导。

替代品懒人计划 – 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 简介

配置

通过配置文件:/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 = []

镜像操作

配置好了之后能够

  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 操作

  1. 构建镜像:buildah bud -t caseycui/webserver .
  2. 多阶段构建: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 的替换得分状况:

  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 命令,为开发和用户提供统一的体验。

以上。

正文完
 0