【问题标题】:How does docker Images and Layers work?docker 图像和图层如何工作?
【发布时间】:2017-01-11 13:19:08
【问题描述】:

实际上,我是 Docker 生态系统的新手,我想了解容器究竟是如何在基础映像上工作的?基础镜像是否被加载到容器中?

我浏览过 Docker 文档,其中说读写容器层是在作为容器层的镜像层之上形成的,但我感到困惑的是镜像是不可变的,对吗?那么镜像在哪里运行,是否在虚拟机的 Docker 引擎内部,以及容器实际上是如何发挥作用的?

【问题讨论】:

  • 为什么它被标记为“Azure”?
  • 因为我试图将它部署在 Azure 容器服务中,所以想也许它会成为讨论中的一个参考点。

标签: azure docker docker-container docker-image


【解决方案1】:

容器究竟是如何在基础镜像上工作的? 基础镜像是否被加载到容器中?

Docker 容器将一个软件封装在一个完整的 filesystem 中,其中包含运行所需的一切:代码、运行时、系统工具、系统库——任何可以安装在服务器上的东西。

FreeBSD JailsSolaris Zones 一样,Linux 容器是自包含的执行环境——具有自己的、隔离的 CPU、内存、块 I/O 和网络资源(使用 CGROUPS 内核功能)——共享主机操作系统的内核。结果是感觉像是虚拟机,但减轻了客户操作系统的所有重量和启动开销。

这就是说每个发行版都有自己的官方docker 映像 (library),它附带最少的二进制文件,考虑到 docker 的最佳实践,并且可以在此基础上进行构建。

我很困惑图像是不可变的,对吗?映像在哪里运行,是否在 VM 的 Docker 引擎中,以及容器实际上是如何发挥作用的?

Docker 曾经使用AUFS,仍然在debian 上使用它,并在其他发行版上使用AUFSoverlay 等文件系统。 AUFS 提供分层。每个图像由图层组成,这些图层是只读的。每个容器在其镜像层之上都有一个读/写层。只读层在容器之间共享,因此您将节省存储空间。容器会看到所有镜像层+读/写层的union mount

【讨论】:

  • 感谢您的帮助,但仍然困扰我的是假设我需要一个 apache 服务器,所以我为此拉取图像,然后 apache 图像将拉取 debian 图像,因为这是它的 docker 文件所建议的,那么当我们想要启动 apache 容器时,我们是否在 linux 内核上运行了这个镜像的运行实例?
  • Linux 内核在docker host 上运行,并在容器之间共享。因此,当您拉取apache image 时,层由debian 基础(仅二进制文件)+apache 包的额外二进制文件组成,位于debian 之上的一层。当您从该图像创建容器时,将根据entrypoint 命令运行一个进程,在您的情况下为apache2。为了运行这个过程,你需要一些base binaries,比如debian镜像中的systemd和...,当然还有apache2层上的apache2 binaries。
  • 好的,所以镜像在VM OS内核的docker引擎中运行,因此容器根据资源分配和需要共享镜像。现在,如果多个容器共享同一个镜像,这是否意味着这些容器是相互叠加的,或者容器是并行运行的?
  • 不,它们不会相互叠加。将只读图像层视为可以以只读格式共享的文件或二进制文件。示例:Linux 二进制文件,许多软件共享相同的二进制文件作为依赖项。
猜你喜欢
  • 2017-03-27
  • 1970-01-01
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
相关资源
最近更新 更多