Docker 镜像(Image)和容器(Container)有什么区别?
镜像是只读的应用打包模板(代码+依赖+配置),容器是从镜像创建的实例,可运行也可停止(带可写层与生命周期状态)。一个镜像可启动多个容器,容器依赖镜像而存在。本文用类比讲清二者关系。
一句话区别:镜像是静态的、只读的打包模板**——包含运行应用所需的代码、库、依赖与配置的不可变快照;容器是从镜像创建的实例,可以运行也可以停止——在镜像之上加一层可写层,有进程、网络和状态。类比对:镜像像"类",容器像"对象";镜像像安装光盘,容器像装完正在运行的系统。**
镜像:不可变的模板
- 由 Dockerfile 构建,分层存储,每层只读
- 可以存在于仓库或本地,仍占存储空间,只是不因静态存在就运行应用进程
- 同一镜像可打多个标签(
myapp:1.0、myapp:latest可能指向同一镜像);标签可被重新指向其他镜像,不能把标签当不可变标识
docker images # 查看本地镜像
容器:从镜像创建的实例
docker run从镜像创建,带独立文件系统(可写层)、进程空间、网络- 有生命周期:创建、运行、停止、删除
- 运行期写入的数据在可写层,容器删除后默认丢失(除非用卷)
docker ps # 运行中的容器
docker ps -a # 全部容器(含已停止)
关系要点
- 镜像可以脱离容器存在(拉下来放着不跑);容器不能脱离镜像存在——必须由某个镜像创建
- 一对多:一个镜像可创建多个容器;隔离范围由命名空间、权限和挂载配置决定,并非绝对安全隔离
- 容器停止 ≠ 镜像变化:容器内写再多文件,原镜像一个字节都不变;想把容器改动固化成新镜像要用
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,仿真也有性能和兼容限制。