
— 特色专栏 —
MySQL / PostgreSQL / MongoDB
ElasticSearch / Hadoop / Redis
Kubernetes / Docker / DevOps
Nginx / Git / Tools / OpenStack
大家好,我是民工哥!
众所周知,万物皆可容器化!

我们常说的 Docker,其实就是容器化技术之一。
Docker 容器的运行不仅依赖 Docker Daemon,而且还需要由多个组件协同完成,从镜像管理到容器生命周期控制,每个组件都承担特定职责。
+-------------------+ +-------------------+ +-------------------+
| Docker Daemon | <----> | Containerd | <----> | Runc |
+-------------------+ +-------------------+ +-------------------+
^ ^ ^
| | |
| | |
+-------------------+ +-------------------+ +-------------------+
| CNI/Plugins | | CSI/Plugins | | Linux Kernel |
+-------------------+ +-------------------+ +-------------------+
从 Docker 1.11 版本开始,Docker 的容器运行除了依赖 Docker Daemon,还依赖于containerd、runc 等多个组件的协作。
为了应对Docker引擎的复杂性问题,Docker项目将引擎中的部分核心功能抽象出来并开源,这便是Containerd项目的诞生。Containerd专注于容器的基本操作,为容器管理工具提供了统一的接口。

而Dockerless是一种无需依赖 Docker 守护进程的容器管理方案,它直接利用Containerd及其周边工具(如nerdctl和buildkit)进行容器和镜像管理,旨在提供更轻量、更安全、更灵活的容器运行环境。
所以,今天,我们是时候踏上 Dockerless 之路了!
简化容器基础设施:Dockerless 方案通过直接利用Containerd等组件,减少了对Docker守护进程的依赖,从而简化了容器基础设施。
减少系统资源开销:由于Dockerless方案避免了Docker守护进程带来的额外开销,因此能够减少系统资源的使用。
提升性能和灵活性:通过优化容器管理流程,Dockerless方案能够提升容器的性能和灵活性,更好地满足现代应用的需求。
安全性提升
兼容性强
Containerd:CNCF 孵化器的开源项目,由Docker捐献。它负责容器的基本操作,如镜像管理、容器运行时和生命周期管理等。Containerd可以作为Linux和Windows的守护进程,管理完整容器生命周期,包括镜像传输和存储、容器管理、底层存储和网络管理等功能。
nerdctl:与Docker CLI兼容的命令行工具,用于管理容器和镜像。
buildkit:高效的镜像构建工具,支持并行构建和缓存等特性。
使用runc直接运行容器
runc是 OCI 标准参考实现,可直接基于配置文件创建和运行容器。示例:
runc spec # 生成默认配置文件
runc run mycontainer # 启动容器
基于containerd的容器管理
containerd是轻量级容器运行时,提供镜像管理、容器生命周期管理等功能。
通过ctr命令行工具或nerdctl(兼容 Docker CLI)管理容器:
nerdctl run -d --name mycontainer nginx:latest
使用 CRI-O 作为 Kubernetes 容器运行时
CRI-O是专为 Kubernetes 设计的轻量级运行时,完全兼容 CRI 接口。
配置 Kubernetes 使用CRI-O替代 Docker:
# /etc/crio/crio.conf[crio.runtime]conmon_cgroup = "systemd"
Podman 作为 Docker 替代品
Podman提供无守护进程的容器管理,兼容 Docker CLI 语法。示例:
podman run -d --name mycontainer nginx:latest
Dockerless方案适用于需要简化容器基础设施、减少系统资源开销和提升性能的场景。例如,在云原生应用、微服务架构和持续集成/持续部署(CI/CD)流程中,Dockerless方案可以发挥重要作用。
使用Podman或nerdctl替代 Docker,无需安装 Docker Daemon,减少资源占用。
示例:在本地开发中运行轻量级容器:
podman-compose up -d # 类似 Docker Compose
在 Kubernetes 集群中部署CRI-O或containerd,提升性能和安全性。
示例:通过kubeadm配置 Kubernetes 使用 CRI-O:
kubeadm init --cri-socket /run/crio/crio.sock
在 CI/CD 环境中使用runc或containerd构建和运行容器,避免 Docker Daemon 的依赖。
示例:在 GitLab CI 中使用nerdctl:
build: image: alpine:latest script: - nerdctl build -t myimage .
尽管Dockerless方案具有诸多优势,但在实际应用中仍面临一些挑战。例如,需要熟悉Containerd等组件的使用和管理;需要解决容器之间的网络通信和数据存储问题;以及需要关注容器的安全性问题等。
Dockerless 提供了一种更轻量、更安全的容器化解决方案,适用于开发、测试和生产环境。通过选择合适的运行时(如 runc、containerd、CRI-O 或 Podman),可以在不依赖 Docker Daemon 的情况下实现容器化管理。
Dockerless 作为一种新兴的容器管理方案,具有简化容器基础设施、减少系统资源开销和提升性能等优势。然而,在实际应用中仍需关注其挑战和限制,并根据具体需求进行选择和配置。
👍 如果你喜欢这篇文章,请点赞并分享给你的朋友!