docker - Container OS下可写无状态分区的用途

标签 docker google-cloud-platform google-compute-engine partition

最近我在 Compute Engine 的容器操作系统下运行一个容器,我的数据(特别是我的 TLS 证书)在重启后没有在容器外持久化,因为我写信给 /etc .过了一会儿,我偶然发现了Disks and file system overview - File system ,这解释了它们如何成为两种类型的可写分区:有状态和无状态。 /etc是无状态的,我需要将我的持久文件移动到 /var用于有状态存储。
但是我想知道可写的无状态分区的目的。 Deploying Containers - Limitations解释了容器操作系统(在 VM 实例上)如何只能运行一个容器。与仅在 docker 容器内写入数据相比,可写但无状态的分区有什么作用,因为这两个可写位置无论如何都会在主机操作系统重启时丢失?我能看到的唯一好处是在同一主机操作系统上跨容器共享数据,但上述限制使这一点无效。

最佳答案

COS 镜像的主要目的是安全性:一个最小的操作系统,没有无用的系统库和二进制文件,并且能够运行容器。
因此,/etc 是无状态的,不会在 COS 最重要的可执行库中保留更改和更新(后门)。
在容器方面,它存在于内存中。你可以在上面写你想要的东西,它写在内存中(除非你的容器中有安装卷,但这不是这里的目的)。而且您受到容器中可用内存量的限制。最后,当您停止容器时,它会从内存中卸载,当然,您丢失了容器中写入的所有数据。

所以现在,您需要记住容器的/etc 与 VM 的/etc 不同。/var 也一样。容器的/var 始终是无状态的(如果不是从 VM 卷挂载),VM 的/var 是有状态的。
此外,生命周期也不相同:您可以在 COS VM 上启动和停止多个容器,而无需停止和重新启动它。因此,VM/etc 将拥有整个 VM 生命周期,并且可能“查看”多个容器的生命周期。
最终,COS 镜像在 Compute Engine 上用于运行容器,并且一次只能运行一个。但是,此 COS 镜像也用于 Kubernetes 节点池(GCP 上的 GKE),并且通常使用 Kubernetes,您可以在同一个节点(Compute Engine 实例)上运行多个 Pod(1+ 个容器)。
所有这些用例都可以向您展示这些限制和功能的含义和有用性(或没有用处)(我希望我的解释很清楚!)

关于docker - Container OS下可写无状态分区的用途,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66270370/

相关文章:

docker - 使用 letencrypt 生成 SSL 证书失败并显示 "300 - Multiple Choices"

docker - pip/pipenv在Docker容器中找不到包?

python - 从Docker容器创建文件

python-3.x - 从在 Google Cloud Shell 中运行的 Python 打开浏览器

google-cloud-platform - 为什么 Google Cloud Compute API 将停止的实例视为 "TERMINATED"状态?

ubuntu - SFTP 到谷歌计算引擎

在 Container-VM 镜像上使用 root 用户登录

mapreduce - 您可以获得一个“物理上”本地的 Google Compute Engine 实例集群吗?

docker - 错误包docker-ce需要container-selinux = 2.9 centos 7

sql - Google数据存储区Nosql和Google bigquery sql之间的实际区别是什么?