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

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

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

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

镜像:不可变的模板

  • 由 Dockerfile 构建,分层存储,每层只读
  • 可以存在于仓库或本地,不占运行时资源
  • 同一镜像可打多个标签(myapp:1.0myapp:latest 可能指向同一镜像)
docker images        # 查看本地镜像

容器:运行中的实例

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

关系要点

  1. 镜像可以脱离容器存在(拉下来放着不跑);容器不能脱离镜像存在——必须由某个镜像创建
  2. 一对多:一个镜像可同时启动 N 个互相隔离的容器
  3. 容器停止 ≠ 镜像变化:容器内写再多文件,原镜像一个字节都不变;想把容器改动固化成新镜像要用 docker commit(或更规范地改 Dockerfile 重建)

常见命令对应

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

观测云对照

镜像与容器都要看得见。 DataKit 可采集主机上的镜像清单与容器运行状态、资源占用;容器 stdout 日志与应用指标一并上报,镜像漏洞与版本漂移也有据可查。

常见问题(FAQ)

Q:容器删了数据就没了,怎么办?
A:用卷(volume)或绑定挂载把数据目录挂到容器外,容器删了数据还在。

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

Q:一个镜像能跑在不同架构的机器上吗?
A:镜像有架构属性(amd64/arm64),多架构镜像通过 manifest 自动匹配;不匹配会报 exec format error。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台