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