当前位置: 首页 > news >正文

html5 做手机网站什么是做学院网站

html5 做手机网站,什么是做学院网站,地方门户网站建设要求,定制衣柜多少钱一平方引言 在容器技术的世界里,我们频繁地使用 docker images 和 docker run 命令。然而,输出结果中的 SIZE 列和容器运行时占用的内存,其背后隐藏着截然不同的底层机制。许多开发者会对“容器镜像到底占了我多少磁盘?”和“容器运行起…

引言

在容器技术的世界里,我们频繁地使用 docker imagesdocker run 命令。然而,输出结果中的 SIZE 列和容器运行时占用的内存,其背后隐藏着截然不同的底层机制。许多开发者会对“容器镜像到底占了我多少磁盘?”和“容器运行起来占多少内存?”感到困惑。本文将从 Linux 内核的实现原理出发,层层剥茧,解析容器镜像与容器实例的文件系统实现,并提供清晰的思路来分析其磁盘与内存空间占用。

一、容器镜像:一个叠加的只读文件系统

容器镜像并非一个完整的、单体的大文件,而是一个由多层(Layers) 组成的、只读的依赖链。每一层都是一个文件系统目录,包含了相对于上一层的变化量(Diff)。这种设计是理解一切的关键。

1. 实现原理:联合文件系统(Union File System)

容器镜像的分层特性得益于联合文件系统(如 Overlay2, AUFS, DeviceMapper等)。目前 Docker 默认使用的是 Overlay2 驱动。

让我们以 Overlay2 为例,深入其工作原理。Overlay2 将多个目录(层)“联合”挂载到同一个挂载点,呈现给用户一个统一的视图。这些目录分为两类:

  • lowerdir(下层): 一个或多个只读层。这些层对应着镜像的只读层。多个 lowerdir 时,越左边的层越底层(基础层)。
  • upperdir(上层): 一个可写层。这对应着容器运行时产生的读写层。
  • merged(合并层): 最终的统一视图,也就是容器内进程看到的文件系统根目录。

一个读操作的发生过程:
当容器内的进程需要读取一个文件 /etc/hosts 时,Overlay2 驱动会按照以下顺序查找:

  1. 首先在 upperdir 中查找。
  2. 如果未找到,则在 lowerdir 中从最右侧的层(最顶层的只读层)向最左侧的层(最底层的基础层)依次查找。
  3. 一旦找到,则直接返回文件内容。

这个过程非常高效,类似于文件系统缓存查找。

一个写操作的发生过程(写时复制 - Copy-on-Write, CoW):

  1. 首次写入文件(存在于lowerdir): 例如,容器要修改 /etc/hosts(该文件原本存在于只读的镜像层中)。Overlay2 会先将这个文件完整地复制到 upperdir 中,然后进程再对 upperdir 中的副本进行修改。此后,所有对该文件的访问都将被重定向到 upperdir 中的副本。这就是“写时复制”(CoW),它保证了镜像层的只读性,并为每个容器实例提供了独立的可写层。
  2. 创建新文件: 直接在 upperdir 中创建。
  3. 删除文件: 在 upperdir 中创建一个特殊的白底文件(whiteout file) 来标记删除,隐藏 lowerdir 中的文件。
2. 磁盘空间占用分析
  • 镜像大小 (docker images 中的 SIZE)
    这个值是所有只读层的逻辑相加总和。它是一个静态的、逻辑上的值,用于表示下载和存储该镜像理论上需要占用的最大空间。由于多个镜像可以共享相同的底层(如相同的 alpine 基础层),因此所有镜像的 SIZE 之和会远大于实际磁盘占用。

  • 实际磁盘占用 (docker system df)
    这个命令显示的是 Docker 在磁盘上实际使用的物理空间。它考虑了层共享,因此更加准确。

    • Images: 所有镜像层实际占用的空间总和(共享层只计算一次)。
    • Containers: 所有容器的可写层(upperdir)占用的空间总和。这包括了容器内文件更改、日志、临时文件等。
    • Local Volumes: 由 Docker 管理的持久化数据卷所占用的空间。
    • Build Cache: 构建镜像时所产生的缓存占用。

分析思路:

  1. 当怀疑磁盘空间被容器占用时,首先使用 docker system df -v 来详细查看是哪些镜像、容器或卷占用了大量空间。
  2. 容器的可写层 (Containers) 是“罪魁祸首”之一。一个不断输出日志的应用程序可能会让容器的可写层变得非常大。
  3. 使用 docker ps -s 命令可以看到每个运行中容器的“大小”。这里有两个指标:
    • size: 每个容器的可写层(upperdir)的磁盘用量。
    • virtual size: 容器所依赖的只读镜像层的总大小(即 docker images 中的 SIZE)。

二、容器实例:一个动态的运行时环境

容器实例 = 只读的镜像层 + 一个可写的容器层 + 运行时元数据。

1. 实现原理:内核命名空间与控制组(cgroups)

文件系统通过 Union FS 实现,而容器的隔离性则主要由 Linux 内核的命名空间(Namespaces) 提供。其中,与文件系统相关的是 Mount Namespace,它让每个容器拥有自己独立的文件系统挂载点视图,看不到宿主机和其他容器的挂载点。

然而,更重要的是控制组(cgroups),它负责资源限制,也是分析内存占用的核心。

2. 内存空间占用分析

容器的内存占用与镜像大小几乎没有直接关系

  • 镜像大小: 是静态的二进制文件、库和代码在磁盘上的体积。
  • 内存占用: 是容器内运行的进程为了执行其任务而动态申请和使用的内存

一个 1.5GB 的 Java 镜像,在运行时可能因为 JVM 堆内存设置为 4GB 而占用 4GB 的 RAM。反之,一个 10MB 的 Go 静态编译镜像,运行后可能只占用 5MB 的内存。

分析思路:

  1. 使用 docker stats: 这是最直接的工具,可以实时查看每个容器的 CPU、内存、网络 I/O 和块 I/O 使用情况。重点关注 MEM USAGE / LIMITMEM % 列。
  2. 深入容器内部: 使用 docker exec -it <container_id> topdocker exec -it <container_id> free -m 来像在 Linux 服务器上一样查看进程和内存信息。这对于诊断容器内哪个进程占用内存多非常有用。
  3. 理解 cgroups 机制: Docker 通过 cgroups 来限制和记录容器的资源使用。容器的内存使用情况可以在宿主机上的 cgroups 文件中找到:
    # 找到容器的完整ID
    docker inspect -f '{{.Id}}' <container_name>
    # 查看该容器的内存使用情况(单位:字节)
    cat /sys/fs/cgroup/memory/docker/<full_container_id>/memory.usage_in_bytes
    # 查看内存限制
    cat /sys/fs/cgroup/memory/docker/<full_container_id>/memory.limit_in_bytes
    # 查看详细的内存统计信息(包含缓存、交换分区使用等)
    cat /sys/fs/cgroup/memory/docker/<full_container_id>/memory.stat
    
    这些文件提供了比 docker stats 更底层、更详细的信息。

三、总结与对比

特性容器镜像 (Images)容器实例 (Containers)
本质静态的、分层的、只读的文件包动态的、具有隔离环境的进程
文件系统多层联合,只读只读层 + 可写层 (Copy-on-Write)
磁盘占用逻辑大小 (SIZE) vs 物理大小 (system df),共享层可写层的大小 (size) + 日志 + 卷
内存占用无直接关系取决于进程运行态,由 cgroups 控制
关键技术Union File System (Overlay2)Namespaces (隔离) + cgroups (资源限制)

给开发者的建议:

  1. 优化镜像:使用多阶段构建、选择小型基础镜像(如 Alpine)、减少层数,可以有效减少镜像的逻辑大小物理磁盘占用
  2. 管理数据:对于频繁写入的数据(如日志、数据库文件),务必使用Volume(数据卷)绑定挂载,而不是写入容器的可写层,以避免 upperdir 膨胀并提高性能。
  3. 监控资源:始终使用 docker stats 和系统监控工具来观察容器的运行时内存和 CPU 占用,而不是根据镜像大小来猜测。
  4. 定期清理:使用 docker system prune 定期清理不再使用的镜像、容器和构建缓存,以回收磁盘空间。

通过理解联合文件系统、命名空间和 cgroups 这些底层原理,我们才能拨开迷雾,精准地分析和优化容器的资源使用,从而构建更高效、更稳定的云原生应用。

http://www.dtcms.com/a/590322.html

相关文章:

  • ipad 建网站电商入门教学
  • e2ee网站开发框架2.23先行版wordpress小论坛小程序
  • 携程网建设网站的理由济南智能网站建设报价
  • flash网站在线diy源码如何做网站首页关键词
  • B树与B+树核心差异深度解析
  • 11.9 脚本调试 手机网页调试参考
  • 制作网站公司网址开发公司公司简介
  • 满洲里做网站郑州企业网站价格
  • FoundationPose:统一的新物体6D姿态估计与跟踪
  • 地方志网站建设方案南京平台网站建设
  • 杭州建站模板黄岛网站建设公司
  • C语言容易被忽略的易错点(2)
  • 十堰网站建设u2028深圳住房与建设网站
  • 栖霞建设招标网站包装设计网课答案
  • 网站建设引入谷歌地图淘宝客网站虚拟主机
  • [题解]龟兔赛跑 | PTA
  • 禁闭求生2/Grounded 2|网络联机|30GB|简体中文|支持多种操作设备
  • 网站开发流行语言php网站开发实训指导书
  • 百科类网站建设静态网站开发课程相关新闻
  • 我与C++的故事
  • HTML 段落
  • 国外网站无法访问企业网站备案名称
  • 建设网上银行官方网站起飞页自助建站平台
  • Bluepine Tech Foundation 启动全球AI农业数据服务平台
  • 品牌网站建设哪里有三星网上商城app
  • 网站制作的公香河住房与建设局网站
  • 免费自助网站建设wordpress电影下载站
  • 徐州商城建站系统wordpress divi 2.5
  • 电影网站做seo公司建网站 内部邮箱
  • 什么语言网站比较安全三亚推广公司