CentOS 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 <容器ID>
这真的看起来和感觉像是一个虚拟机。
如果我运行cat /etc/os-release
,它甚至会显示我正在运行的是CentOS。
这到底是什么?我能够像使用虚拟机一样使用CentOS Docker镜像吗?有什么限制吗?
(令我困惑的是docker containers != VMs
,然而,通过我的探索,我创建了一个看起来和感觉像虚拟机的Docker镜像。如果我可以运行一个行为完全像虚拟机的轻量级Docker镜像,为什么我还需要运行虚拟机?)
这个CentOS Docker镜像只是一个起始位置,我应该在其基础上构建(即将我的应用程序放入其中),以便它只作为我的应用程序的主机。我阅读和研究Dockerfile示例的越多,我越相信这个假设是正确的。
我真正想要做的是:
我有一堆作为一个系统一起运行的小应用程序/服务,它们组成了一个大型应用程序。我目前将这个系统运行在一个CentOS机器上。我希望能够轻松地运行多个实例的这个大型应用程序,每个实例都在自己的环境中运行/互不干扰。通过使用CentOS Docker镜像+所有所需的小应用程序/服务
,可以实现这个目标,从而得到一个大型应用程序镜像
?使用这个镜像,我可以启动多个容器,每个容器运行一个独立的大型应用程序实例?这样做是否合理/可行?
我的某些理解可能是错误的,或者我可能在建议以一种Docker不打算使用的方式使用Docker。如果是这样,请随时指出。谢谢!
如何使用CentOS Docker镜像的目的是什么?
这个问题的出现是因为有人想了解为什么要使用CentOS Docker镜像以及它的作用。解决方法是通过阐述容器的基本概念和最佳实践来回答这个问题。
容器基本上共享一个内核(通常是Linux),而不是操作系统(如CentOS、Debian、Ubuntu等)。最简单的Linux容器镜像被称为"scratch",它是空的,只提供了Linux内核。而完整的Linux操作系统镜像包括CentOS等,提供了用户和应用程序与在"裸机"或虚拟机上运行此操作系统时大致相同的体验。
在容器的最佳实践中,尽量接近"scratch"比接近"centos"更好。因为操作系统是一个庞大的代码集合,你的应用程序可能并不需要其中的大部分功能。虽然拥有所有这些额外的功能可能很好,但这意味着你必须维护(和保护)多余的代码,并且你的镜像也必须携带所有这些内容。
然而,你的应用程序可能无法在"scratch"上运行,因为它们可能依赖于其他应用程序和共享库。如果你已经对这些依赖有很好的了解,你可以从"scratch"这样的镜像开始,并添加你的应用程序所需的内容。
在网络上查看Dockerfile的示例,你会发现许多最佳实践示例都是从较小的基础镜像开始,添加必要的软件包,最后添加相关的二进制文件。
总之,使用CentOS Docker镜像的目的是为了在容器中提供一个类似于运行在"裸机"或虚拟机上的完整Linux操作系统的体验。但在实践中,最好使用更小的基础镜像,并根据应用程序的需求添加必要的组件。
参考链接:
- [Microcontainers -- Tiny, Portable Docker Containers](https://blog.iron.io/microcontainers-tiny-portable-containers/)
- ["Distroless" Docker Images](https://github.com/GoogleContainerTools/distroless)