Docker 镜像(Image)和容器(Container)有什么区别?

镜像是只读的应用打包模板(代码+依赖+配置),容器是从镜像创建的实例,可运行也可停止(带可写层与生命周期状态)。一个镜像可启动多个容器,容器依赖镜像而存在。本文用类比讲清二者关系。

最佳实践
Docker 镜像(Image)和容器(Container)有什么区别?封面

一句话区别:镜像是静态的、只读的打包模板**——包含运行应用所需的代码、库、依赖与配置的不可变快照;容器是从镜像创建的实例,可以运行也可以停止——在镜像之上加一层可写层,有进程、网络和状态。类比对:镜像像"类",容器像"对象";镜像像安装光盘,容器像装完正在运行的系统。**

镜像:不可变的模板

  • 由 Dockerfile 构建,分层存储,每层只读
  • 可以存在于仓库或本地,仍占存储空间,只是不因静态存在就运行应用进程
  • 同一镜像可打多个标签(myapp:1.0、myapp:latest 可能指向同一镜像);标签可被重新指向其他镜像,不能把标签当不可变标识
docker images        # 查看本地镜像

容器:从镜像创建的实例

  • docker run 从镜像创建,带独立文件系统(可写层)、进程空间、网络
  • 有生命周期:创建、运行、停止、删除
  • 运行期写入的数据在可写层,容器删除后默认丢失(除非用卷)
docker ps            # 运行中的容器
docker ps -a         # 全部容器(含已停止)

关系要点

  1. 镜像可以脱离容器存在(拉下来放着不跑);容器不能脱离镜像存在——必须由某个镜像创建
  2. 一对多:一个镜像可创建多个容器;隔离范围由命名空间、权限和挂载配置决定,并非绝对安全隔离
  3. 容器停止 ≠ 镜像变化:容器内写再多文件,原镜像一个字节都不变;想把容器改动固化成新镜像要用 docker commit(或更规范地改 Dockerfile 重建)

常见命令对应

操作对象 命令
列出镜像 / 容器 docker images / docker ps -a
删除镜像 / 容器 docker rmi / docker rm
从镜像造容器 docker run / docker create
从容器造镜像 docker commit

常见问题(FAQ)

Q:容器删了数据就没了,怎么办?
A:用卷(volume)或绑定挂载把数据目录挂到容器外,数据是否保留取决于卷/挂载及删除选项,仍需备份和生命周期管理。

Q:停止的容器还占磁盘吗?
A:占。停止容器的可写层保留在磁盘上,定期 docker container prune 清理。

Q:一个镜像能跑在不同架构的机器上吗?
A:镜像有架构属性(amd64/arm64),多架构镜像通过 manifest 自动匹配;不匹配且没有受支持的仿真时可能报 exec format error,仿真也有性能和兼容限制。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台