2026-10-22 07:46:20
Docker 镜像和容器的主要区别在于:镜像是由多个只读层组成的静态文件系统,而容器是镜像的可读写实例,运行态容器还包含隔离的进程空间和运行中的进程。
镜像(Image)
结构:镜像由多个只读层(Image Layer)叠加组成,通过联合文件系统(UnionFS/AUFS)技术整合为一个统一视角的文件系统。除最底层外,每一层都包含指向父层的指针和元数据(如构建信息、父层信息等)。
特性:镜像本身是静态的、不可修改的。所有层均为只读,用户无法直接修改镜像内容,但可通过创建新层(如使用docker commit)生成新镜像。
存储位置:镜像层的元数据保存在Docker主机文件系统的/var/lib/docker/graph/[层ID]/json中,实际层数据存储在/var/lib/docker/aufs/diff/目录下。

容器(Container)
结构:容器是镜像的实例化,在镜像的只读层之上添加了一个可读写的顶层(Read-Write Layer)。容器定义公式为:容器 = 镜像 + 读写层。
运行态容器:当容器启动后,会进一步包含隔离的进程空间和运行中的进程。此时容器由三部分组成:可读写文件系统(静态容器) + 隔离的进程空间 + 进程。用户对文件的修改(如创建、删除、修改)均作用于读写层,不影响底层镜像。
验证示例:通过命令docker run ubuntu touch happiness.txt创建文件后,即使容器停止,文件仍存在于主机的/var/lib/docker/aufs/diff/[容器ID]/目录下,证明读写层的独立性。
关键区别总结
可写性:镜像所有层均为只读,容器顶层可读写。
动态性:镜像是静态模板,容器是动态实例,可运行进程并修改数据。
隔离性:运行态容器通过命名空间(Namespace)和控制组(Cgroup)实现进程和资源隔离,而镜像无此特性。
关联性
容器基于镜像创建,镜像为容器提供基础文件系统。
多个容器可共享同一镜像,减少存储开销。
容器修改可通过docker commit固化为新镜像,实现镜像的迭代更新。
总结:镜像和容器是Docker的核心概念,镜像作为静态模板通过分层存储实现高效复用,容器作为动态实例通过添加读写层和进程隔离实现灵活运行。两者共同构成Docker“一次构建,到处运行”的基石。