从我所阅读和听到的有关Docker的所有内容来看,它的全部目的是封装一个应用程序,以便它可以在任何机器上运行。它通过将所需的环境(工具/依赖项)包装到docker映像中来实现此目的。容器是图像的实例。 Docker容器中没有运行操作系统。
现在,如果这都是真的,那么为什么会存在:CentOS official docker image?我认为docker镜像仅用于应用程序,而不是整个操作系统。
每当实例化该映像时,我都会得到一个容器,该容器连接到它时,似乎是一个正常运行的CentOS shell。
您可以自己做,以了解我的意思:
FROM centos:centos7
docker build centos-img .
docker run -ti centos-img
ctrl+p, ctrl+q
docker attach <container id>
这真的看起来像是VM。
如果我运行cat /etc/os-release
,甚至会说我正在运行CentOS。
这到底是什么?我可以像使用虚拟机一样使用CentOS docker映像吗?有什么限制?
(让我感到困惑的是docker containers != VMs
,但是,通过探索,我创建了一个看起来和感觉像VM的docker映像。如果我可以运行轻量级版本,为什么还要再次运行VM?完全类似于VM的docker镜像?)
该centOS docker映像是否只是我应该构建的起点(即,将我的应用程序放进去),以便它仅充当我的应用程序的宿主?我越是阅读并深入研究Dockerfile示例,我就越相信这一假设是正确的。
我真正想做的事情:
我有一堆小的应用程序/服务,它们一起构成一个组成大型应用程序的系统。我目前在centOS机器上运行此系统。我希望能够轻松运行此大型应用程序的多个实例,每个实例都在各自的环境中/而不用踩到对方的脚。是否可以通过使用centOS docker image + all of the small applications/services needed
来产生large application image
来做到这一点?有了这个映像,我可以启动多个容器,每个容器运行一个大型应用程序的单独实例?这与Docker相关吗?
我的某些理解可能是错误的,或者我可能建议以不被使用的方式使用Docker。如果是这样,请随时指出。谢谢!
答案 0 :(得分:0)
这是一个多方面的问题,我不太可能用此答复来做到这一点,但我会尽力回答您的核心问题。我建议您阅读许多有关容器基础知识的文章。
从根本上讲,容器共享一个内核(通常为Linux),而不是一个操作系统(CentOS,Debian,Ubuntu等)。
最简单的Linux容器映像称为scratch
,它是空的,因此仅为您提供Linux内核。
反之,则完整的Linux操作系统映像包括CentOS
。这些是成熟的OS映像,可为用户和应用程序提供与在“裸机”或VM上运行这样的操作系统大致相当的体验。
与接近目标(例如抓地力)相比,尝试更接近“划痕”是一种良好的容器惯例。 centos
。从根本上讲,操作系统是大量的代码,您的应用程序可能不需要其中的大部分代码。拥有所有这些额外功能可能会很好,但这意味着您必须维护(并保护)多余的(!)代码,这意味着您的图像也必须同时拖动所有这些内容。
您的应用程序不太可能在scratch
上运行,因为它们可能依赖于其他应用程序和共享库。如果您已经很好地了解了这些依赖关系,则应从“抓取”之类的图像开始,并添加应用程序所需的内容。
如果您在网络上查看Dockerfile,您会发现许多最佳示例都从一个较小的基本映像开始,添加了必要的软件包,最后添加了相关的二进制文件。
请参阅:
HTH!
答案 1 :(得分:0)
CentOS(和其他完整的OS发行版)在Docker中的一种常见用法是,开发人员需要出于开发/测试/调试目的而在本地运行的完整系统,但不在生产环境中的Docker中运行。在VM甚至裸机上运行不适合docker的单片应用程序并不少见。
一个示例可能是作为AMI部署到AWS的应用程序;在Mac或Windows机器上进行复制并非易事,并且直接安装到Linux主机上不干净(轻描淡写),这可能会导致成本高昂,并且不适合脱机使用来启动更多云托管实例
这是Docker的一大优势,它能够运行最少的系统(如果这是必需的)或成熟的OS安装,即使这不是最佳选择。它肯定有这种用途。