Docker 入门时最容易混淆的是镜像和容器。简单说,镜像是静态模板,容器是镜像运行后的实例。

镜像是分层文件系统

镜像由多层只读层组成。Dockerfile 中的每一步通常都会形成一层。分层的好处是可以复用,也方便构建缓存。

例如多个镜像都基于同一个基础镜像时,底层内容不需要重复下载。

容器是运行实例

容器基于镜像启动,并在只读镜像层之上增加一个可写层。程序运行时产生的临时文件、修改内容通常会落在这个可写层里。

如果删除容器,这个可写层也会消失。因此需要持久化的数据应放到 volume 或绑定挂载中。

镜像不应该保存运行状态

镜像适合保存程序、依赖、默认配置,不适合保存运行过程中变化的数据。这样才能保证同一个镜像在不同环境中行为一致。

构建与运行分离

构建镜像时关注“如何得到可运行环境”,运行容器时关注“如何提供配置和数据”。这两个阶段分开后,升级、回滚和迁移都会更清晰。

小结

镜像像模板,容器像进程实例。镜像负责可重复分发,容器负责实际运行,数据持久化则应交给挂载或外部存储。