docker - CentOS Docker 映像的目的是什么?
问题描述
从我读过和听说过的关于 Docker 的所有内容来看,它的全部意义在于封装一个应用程序,以便它可以在任何机器上运行。它通过将所需的环境(工具/依赖项)包装到 docker 映像中来实现这一点。容器是图像的一个实例。docker 容器中没有运行操作系统。
现在,如果这一切都是真的,那么为什么会存在:CentOS 官方 docker 镜像?我认为 docker 镜像只适用于应用程序,而不是整个操作系统。
每当我实例化该映像时,我都会得到一个容器,当附加到它时,它似乎是一个正常运行的 CentOS shell。
你可以自己做,看看我的意思:
- Dockerfile 内容:
FROM centos:centos7
- 构建镜像:
docker build centos-img .
- 运行容器:
docker run -ti centos-img
- 分离:
ctrl+p, ctrl+q
- 重新连接:
docker attach <container id>
这真的看起来和感觉就像一个虚拟机。
如果我运行cat /etc/os-release
它,甚至说我正在运行 CentOS。
这究竟是什么?我可以像使用虚拟机一样使用 CentOS docker 映像吗?有什么限制?
(然而,令我困惑的是docker containers != VMs
,通过探索,我创建了一个看起来和感觉都像 VM 的 docker 映像。如果我可以运行一个与 VM 完全一样的轻量级 docker 映像,我为什么还要再次运行 VM ?)
这个 centOS docker 映像是否只是一个起点,我应该构建(即,放入我的应用程序),以便它只是用作我的应用程序的主机?我阅读和深入研究 Dockerfile 示例的次数越多,我就越相信这个假设是正确的。
我真正想做的是:
我有一堆小的应用程序/服务,它们作为一个系统一起运行,构成一个大型应用程序。我目前在 centOS 机器上运行这个系统。我希望能够轻松地运行这个大型应用程序的多个实例,每个实例都在自己的环境中/而不会互相干扰。是否可以通过使用 a 来做到这一点centOS docker image + all of the small applications/services needed
,从而导致 a large application image
?有了这个图像,我可以启动多个容器,每个容器都运行一个单独的大型应用程序实例?这对 Docker 来说是合理/可实现的吗?
我的某些理解可能不正确,或者我可能建议以不适合使用的方式使用 Docker。如果是这样,请随时指出。谢谢!
解决方案
这是一个多方面的问题,我不太可能用这个答复来公正,但我会尽力回答你的核心问题。我建议您阅读现有的许多涵盖容器基础知识的文章。
从根本上说,容器共享一个内核(通常是 Linux)而不是一个操作系统(CentOS、Debian、Ubuntu 等)。
调用了最简单的 Linux 容器映像scratch
,它是空的,因此有效地为您提供了 Linux 内核。
在另一个极端,完整的 Linux 操作系统映像包括CentOS
. 这些是成熟的操作系统映像,为用户和应用程序提供了与在“裸机”或虚拟机上运行此类操作系统几乎相当的体验。
尝试着眼于更接近'scratch'而不是着眼于更接近于例如是一种良好的容器实践centos
。从根本上说,操作系统是大量代码,您的应用程序可能不需要其中的大部分代码。虽然拥有所有这些额外功能可能很好,但这意味着您必须维护(并保护)多余的(!)代码,这意味着您的图像也必须拖动所有这些内容。
您的应用程序不太可能在其上运行,scratch
因为它们可能依赖于其他应用程序和共享库。如果您已经对这些依赖关系有了很好的了解,您应该从“scratch”之类的图像开始,然后添加您的应用程序需要的内容。
如果您查看网络上的 Dockerfiles,您会看到许多最佳示例从较小的基础映像开始,添加必要的包,最后添加相关的二进制文件。
看:
- 微容器——微型、便携的 Docker 容器
- “Distroless” Docker 镜像(完全披露:我是 Google 员工)
!
推荐阅读
- windows - 从 Windows 命令提示符的输出中捕获第二个单词
- apache-spark - 如何阻止 Spark Structured Streaming 填充 HDFS
- python - 如何为我的 Python 脚本保留 RAM?
- azure-active-directory - 带有 Acitve Directory Express 和 Graph API 的 Azure Web App 以获取用户照片
- php - 如何计算mysql中两个字母数字字符串之间的差异
- excel - Vba Excel Sum Countifs - 无效字符{}
- php - 停止会话注销用户
- javascript - 将 Typescript 泛型约束为对象
- amazon-web-services - Terraform 查找函数 - 错误:应为数字,实际类型为字符串
- actions-on-google - 智能家居和触控:成功执行命令后,视觉卡永远不会更新