是的,你没看错...... Docker 是当下技术行业中是一个流行词。我们将看到使用它的好处以及如何使用 Podman 解决问题,用 Podman 替换 Docker – 强大如斯 Podman。
在进入本文之前,我们将了解它是什么Docker以及Docker是如何工作的。
什么是 Docker?
Docker 是一个容器化平台,我们可以在其中将应用程序及其库和依赖项打包到容器内。Docker Container 有点像虚拟机。
与虚拟机不同,Docker 容器与系统共享相同的Linux内核。
Docker 如何工作?
让我们首先了解 Docker 的工作原理,然后我们再看看如何使用 podman 克服它的一些问题。
Docker 的组成包含 Docker CLI 和 Docker Daemon。
Docker CLI 将命令发送到 Docker Daemon,其中 Docker Daemon 从仓库中推送/拉取镜像。
守护程序在本地容器中复制图像并进行维护。本质上,Docker 守护程序使用仓库,镜像,容器和内核来完成所有工作。Docker 命令行界面(CLI)要求服务端守护程序代表用户执行这些操作。
你可以问我,这有什么好吗?这样其实存在一些问题:
- 服务端守护程序单点故障。
- 该进程拥有所有子进程(正在运行的容器)。
- 如果 Docker 守护程序出现任何故障,则每个子进程都将失去其跟踪。
- 构建容器导致安全漏洞。
- 所有 Docker 操作都必须由具有完全根权限的一个或多个用户执行。
今天来了个新角色: podman。那么Podman是啥呢?
顺便说一句,什么是Podman?
最重要的是,在 podman 中没有称为守护程序的概念。podman 直接与镜像仓库,容器和镜像存储 API 进行交互。通过 runC 容器运行时进程(不是守护程序)使用Linux内核。
您可以问我,什么是 runC Container 运行时进程?。
那么我告诉你,runC 是轻量级的可移植容器运行时。Docker 构建在 runC 运行时容器之上。我们直接使用 runC 运行时容器,而不是在 podman 中使用守护程序。
下图说明了 Docker 如何在 runC 容器运行时之上工作。
从Docker迁移到Podman
首先,从 Docker 迁移到 Podman 非常容易。
- 您需要安装 Podman 而不是 Docker。您无需启动或管理Docker守护进程之类的守护进程。
- 用于 Docker 的命令与 Podman 相同。
- Docker 的镜像与 Podman 兼容。
- podman 将其容器和镜像存储在与 Docker 不同的位置。
让我们看看带有 node.js 应用程序的 Podman 容器化实现。您可以点击此处了解如何使用 Docker 容器化 node.js 应用程序
用 Podman 容器化一个 node.js 应用程序
在构建容器化应用之前,在你电脑上正确安装 podman。你可以通过运行以下命令来确保安装成功。
$ podman --version
可以在此仓库中找到应用程序的完整源代码,您将项目克隆到本地计算机中。运行以下命令:
$ podman build -t podmandemo .
注意:如果遇到任何错误,例如 No Registries。请执行以下步骤。(仅当您遇到此错误时)
$ cd /etc/containers/
$ sudo nano registries.conf
在[registries.search]中添加docker.io并保存文件
现在,再次运行build命令
一旦成功构建镜像,请使用以下命令运行该镜像。
之后,访问URL http://localhost:3333。你会看到类似这样的的东西:
以上就是所有。Podman 跑镜像是不需要任何守护进程的。
编者注: 诚然,Docker是个好东西。但其本身由一家旧金山公司开源并维护,在商业利益和资源投入上相对较差。而且该公司在谷歌 Kubernetes 示好的情况下依然坚持推自家的 Docker Swarm,期望 做到容器编排领域强者,而后在2017年的 DockerCon 17大会上态度有所转变。但也正是这次大会,Docker 公司突然宣布了 Moby 项目,这件突如其来的事情让很多开发者在社区骂起来,随后Githuub 相关工作人员出面调解,但结果是 moby 已经让人混淆了 Docker Container,Docker 和 Moby 项目的关系。
就 Docker 本身而言,它是一个时代的开创者,但不会是优秀的维护者。经过几次的问题暴露,coreos,rancher,huawei 和 redhat 都已经基于后面容器标准化平台 runC 研发自家的容器引擎,用于备选。相信落地容器化、服务化和云化过程的各位,也肯定也踩过 Docekr 的坑了。
如今,在 RHEL8 诞生之际,有幸听到 podman 内核支持的消息,Google 距离 K8OS 又近了一步。