GVKun编程网logo

Docker 向全面集成 containerd 又迈进一步(docker集成部署)

20

如果您想了解Docker向全面集成containerd又迈进一步的相关知识,那么本文是一篇不可错过的文章,我们将对docker集成部署进行全面详尽的解释,并且为您提供关于AzureDockerCont

如果您想了解Docker 向全面集成 containerd 又迈进一步的相关知识,那么本文是一篇不可错过的文章,我们将对docker集成部署进行全面详尽的解释,并且为您提供关于Azure Docker Container – 如何将启动命令传递给docker run?、CentOS 8 安装 docker 报错 containerd.io >= 1.2.2-3、Containerd 1.0.0 发布,Docker Engine 的核心组件、Containerd 1.5 发布:重磅支持 docker-compose!的有价值的信息。

本文目录一览:

Docker 向全面集成 containerd 又迈进一步(docker集成部署)

Docker 向全面集成 containerd 又迈进一步(docker集成部署)

Docker 在刚刚发布的 Docker Desktop 4.12.0 中,加入了实验特性:进一步集成 containerd,使用 containerd 来管理和存储镜像。

Docker 4.12.0

为什么说是“进一步集成”?这就要翻翻 Docker 和 containerd 的历史了。

containerd 的诞生

containerd 最早出现在 Docker Engine 中,后来为了将 Docker Engine 做得更加轻量、快速和健壮,在 2016 年 Docker 将 containerd 从 daemon(dockerd) 中独立出来,并完成了与 daemon 的集成。独立出来的 containerd 全面支持 OCI(Open Container Initiative)资源的启动和生命周期的管理,也因此 containerd 可以支持 runc(前身是 Docker 中的 libcontainer,后来捐赠给 LF)以外的其他 OCI 实现。2017 年 Docker 将 containerd 捐献给 CNCF;2019 年 2 月,containerd 毕业。

docker with containerd

containerd 独立出来之后,发送到 Docker Engine 的请求:

  1. Docker daemon 完成镜像管理的操作(拉取、更新镜像)
  2. daemon 会为创建容器进行准备工作(创建 OCI bundles):镜像的信息和运行时的信息。
  3. daemon 调用 containerd 的 API。
  4. 收到请求的 containerd 不会直接去操作容器(不直接作为容器的父进程,防止 containerd 挂掉影响容器),而是先创建一个 container-shim 进程。
  5. container-shim 调用 runc cli 来运行容器,并启动 Unix domain socket 暴露 API 提供给 containerd进行容器的管理。

随着 containerd 的不断演进,除了容器创建和容器声明周期管理以外,从 1.1 开始 containerd 加入了 CRI(Container Runtime Interface)的支持。

CRI

在《源码解析 kubectl port-forward 工作原理》 中层提到 kubelet 会调用 rumtime service 的 gRPC 接口,除了用于 portforward 流的 stream server以外,其实还有实现 CRI 接口 RuntimeServiceImageService RuntimeServiceServerImageServiceServer

RuntimeServiceServer 用于接收并处理容器及其生命周期相关的操作,而 ImageServiceServer 则是用来处理镜像相关的操作。containerd 提供了镜像拉取、删除、检查、存储等功能。

既然 containerd 可以进行镜像的管理,而且 Docker 已经在使用,Docker 也没有必要自己继续维护一套相同的功能。

切换到 containerd 的镜像管理

在 Docker Desktop 的设置中启动 containerd 管理镜像后,运行 docker info 会发现存储的驱动从原来的 overlay2 变成了 containerd 的 stargz

切换前:

切换前

切换后:

切换后

既然使用了 containerd 的 snapshotters 来管理存储(挂在容器的根文件系统),就可以支持多种 snapshotters,比如 stargz 的延迟拉取。

此外,得益于 containerd 原生支持多平台镜像的存储,还是因为 snapshotters 的原因,可以使用 docker 来构建多平台的镜像了。

#切换前
docker buildx build -t demo --no-cache --platform linux/amd64,linux/arm64 .
[+] Building 0.0s (0/0)
error: multiple platforms feature is currently not supported for docker driver. Please switch to a different driver (eg. "docker buildx create --use")

总结

使用 containerd 作为 Docker 的镜像管理目前还处于实验性阶段,必可避免会存在问题,使用时请谨慎对待。

随着 Docker Swarm 在容器编排之战中的落败,Kubernetes 的话语权也越来越强。在 Kubernetes 1.24.0 中移除了 docker shim 代码,看起来更像是 containerd 取代了 Docker 曾经的地位,而 Docker 也越来越名声不显。从趋势来看,Docker 未来将会完全集成 containerd。

参考

  • Extending Docker’s Integration with containerd
  • Docker containerd integration
  • Learning Containers From The Bottom Up

文章统一发布在公众号云原生指北

Azure Docker Container – 如何将启动命令传递给docker run?

Azure Docker Container – 如何将启动命令传递给docker run?

面对这个屏幕,我已经设法在docker容器应用程序服务上轻松地将rails应用程序部署到azure,但是记录它是一个痛苦,因为他们访问日志的唯一方法是通过FTP.

enter image description here

有没有人想出一个在azure中运行docker run命令的好方法,所以它基本上接受任何参数.

在这种情况下,它试图简单地登录到远程服务,如果任何人还有其他建议检索除FTP之外的日志,将大量欣赏.

最佳答案
不,在撰写本文时,这是不可能的,您只能传递您通常会传递给docker run container的任何内容:tag%YOUR_STARTUP_COMMAND_WILL_GO_HERE_AS_IS%,因此在您的容器名称之后.

TLDR除了需要在容器中运行的命令外,您无法将任何启动参数传递给Linux WebApp.让我们说你想使用PROD标签运行名为MYPYTHON的容器并运行一些python代码,你会做这样的事情

Startup Command = /usr/bin/python3 /home/code/my_python_entry_point.py

这将被附加(仅在非常结束)到实际的docker命令:

docker run -t username/MYPYTHON:PROD /usr/bin/python3 /home/code/my_python_entry_point.py

CentOS 8 安装 docker 报错 containerd.io >= 1.2.2-3

CentOS 8 安装 docker 报错 containerd.io >= 1.2.2-3

在更新或者安装 docker 容器的时候,提示下面的错误:

Problem: package docker-ce-3:19.03.13-3.el7.x86_64 requires containerd.io >= 1.2.2-3 

上面的问题如何解决。

1_jWDWUztfqh_j0jLgAaWuhw

解决

根据提示的内容,上面已经说得比较明确了。

就是需要使用 containerd.io 的版本要升级下。

你可以访问 docker 官方的链接有关 CentOS 的安装部分:

Install Docker Engine on CentOS

首先你需要设置仓库:

sudo yum install -y yum-utils

 sudo yum-config-manager 
    --add-repo 
    https://download.docker.com/linux/centos/docker-ce.repo 

然后执行命令

sudo yum install docker-ce docker-ce-cli containerd.io 

就可以解决上面的问题了。

https://www.ossez.com/t/centos-8-docker-containerd-io-1-2-2-3/548

Containerd 1.0.0 发布,Docker Engine 的核心组件

Containerd 1.0.0 发布,Docker Engine 的核心组件

在经历 7 个 alpha 版、4 个 beta 版以及 1 个 RC 版后,containerd 1.0.0 正式发布了。1.0.0 改进了稳定性和 API,以及一些增强。containerd 为管理正在运行的容器提供守护进程,是一个工业标准的容器运行时。

新的 containerd 专为基于容器的系统而设计,如 Docker 和 Kubernetes。它提供了对操作系统的最小抽象。

与 0.2 版本相比,有以下更新:

  • 基于任务和容器的新运行时模型

  • 端到端的事件系统

  • 基于快照的容器存储系统

  • 内容寻址的映像存储系统

  • 与容器对象关联的任意元数据存储

  • 可扩展的命名空间 GRPC API

  • 丰富的 API 客户端(入门和 godoc)

此外,0.2 版本已被标记为"End of Life"状态,这说明它的生命周期已结束。

详细更细内容和下载地址请点此查看。

Containerd 1.5 发布:重磅支持 docker-compose!

Containerd 1.5 发布:重磅支持 docker-compose!


2021 年 5 月 4 日,Containerd 1.5 正式发布[1],该版本默认启用了 OCIcrypt 解密功能,并引入了对 NRIzstdFreeBSD jails 的支持,同时还简化了对 Containerd 的贡献流程。下面就来看看具体更新了哪些功能吧。

默认 OCIcrypt 解密

Containerd 从 1.3 开始就支持从加密的镜像中运行容器,但没有作为默认启用的选项,直到 1.5 版本才默认启用,具体用法请参考文档[2]

需要注意的是,必须安装二进制文件 ctd-decoder 才能解密 OCIcrypt 镜像,该二进制文件包含在 cri-containerd-cni-1.5.0-linux-amd64.tar.gz[3] 中,但不包含在 containerd-1.5.0-linux-amd64.tar.gz 中。另外,OCIcrypt 并不适用于 Docker,因为 Docker 目前并没有使用 Containerd 来管理镜像。

NRI: Node Resource Interface

NRI(Node Resource Interface)[4]节点资源接口,类似于 CRI,但 NRI 可用于非网络资源,例如 GPU 调度限制和内存配额。具体用法可参考 NRI 示例代码[5]

zstd 压缩算法

除了 gzip 之外,Containerd 现在还支持 zstd[6] 镜像压缩算法,压缩速度比 gzip 快好几倍,具体通过 github.com/klauspost/compress/zstd[7] 来实现。关于 zstd 的性能测试结果请参考zstd 官方文档[8]

支持 FreeBSD

Containerd 从 1.5 版本开始实验性地支持 FreeBSD 操作系统,可以使用 FreeBSD jails[9] 运行一个兼容的 OCI 运行时,例如 runj[10]。同时还支持 ZFS 的快照管理,未来版本可能也会支持 unionfs[11]

简化贡献流程

CRI 插件仓库[12] 现已合并到 Containerd 主仓库[13]中,对用户来说没有明显变化,只是简化了开发者对 Containerd 的贡献流程。

nerdctl

nerdctl[14] 是一个与 Docker 兼容的 CLI,例如:

$ nerdctl run -d --name nginx -p 8080:80 --restart=always nginx

nerdctl 的目标并不是单纯地复制 docker 的功能,它还实现了很多 docker 不具备的功能,例如延迟拉取镜像(lazy-pulling[15])、镜像加密(imgcrypt[16])等。

nerdctl 在上个月作为非核心子项目加入了 Containerd 组织,详情请参考终于可以像使用 Docker 一样丝滑地使用 Containerd 了!

现在 nerdctl 还推出了一个爆炸性功能:直接兼容 docker-compose 的语法!也就是说,可以直接通过 docker-compose.yaml 启动容器:

$ nerdctl compose -f docker-compose.yaml up

求 Docker 此时内心的阴影面积。。

本来 Docker 在 Kubernetes 社区的地位就在急剧下滑,现在 Containerd 易用性的空缺也被 nerdctl 填补上了,连 docker-compose 也能兼容了,如今 Docker 就更不受待见了。虽说廋死的骆驼比马大,但 Docker 的辉煌时代终究一去不复返了。

脚注

[1]

Containerd 1.5 正式发布: https://github.com/containerd/containerd/releases/tag/v1.5.0

[2]

参考文档: https://github.com/containerd/containerd/blob/v1.5.0-rc.2/docs/cri/decryption.md

[3]

cri-containerd-cni-1.5.0-linux-amd64.tar.gz: https://github.com/containerd/containerd/releases

[4]

NRI(Node Resource Interface): https://github.com/containerd/nri

[5]

NRI 示例代码: https://github.com/containerd/nri#sample-plugin

[6]

zstd: https://github.com/containerd/containerd/pull/4809

[7]

github.com/klauspost/compress/zstd: https://github.com/klauspost/compress/tree/master/zstd

[8]

zstd 官方文档: https://github.com/klauspost/compress/blob/master/zstd/README.md

[9]

FreeBSD jails: https://en.wikipedia.org/wiki/FreeBSD_jail

[10]

runj: https://github.com/samuelkarp/runj

[11]

unionfs: https://www.freebsd.org/cgi/man.cgi?query=unionfs&sektion=8&manpath=freebsd-release-ports

[12]

CRI 插件仓库: https://github.com/containerd/cri

[13]

Containerd 主仓库: https://github.com/containerd/cri

[14]

nerdctl: https://github.com/containerd/nerdctl

[15]

lazy-pulling: https://github.com/containerd/nerdctl/blob/master/docs/stargz.md

[16]

imgcrypt: https://github.com/containerd/nerdctl/blob/master/docs/ocicrypt.md


你可能还喜欢

点击下方图片即可阅读

KubeSphere 3.1.0 GA:混合多云走向边缘,让应用无处不在

云原生是一种信仰 

关注公众号

后台回复◉k8s◉获取史上最方便快捷的 Kubernetes 高可用部署工具,只需一条命令,连 ssh 都不需要!



点击 "阅读原文" 获取更好的阅读体验!


发现朋友圈变“安静”了吗?

本文分享自微信公众号 - 云原生实验室(cloud_native_yang)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

今天关于Docker 向全面集成 containerd 又迈进一步docker集成部署的分享就到这里,希望大家有所收获,若想了解更多关于Azure Docker Container – 如何将启动命令传递给docker run?、CentOS 8 安装 docker 报错 containerd.io >= 1.2.2-3、Containerd 1.0.0 发布,Docker Engine 的核心组件、Containerd 1.5 发布:重磅支持 docker-compose!等相关知识,可以在本站进行查询。

本文标签:

上一篇Docker 向全面集成 containerd 又迈进一步(docker集成部署)

下一篇Centos7 离线安装 Docker(centos7离线安装docker)