Docker 镜像与容器的核心概念及操作对比
使用 Docker 时,可通过以下命令基于镜像启动并进入交互式容器:
docker run -it --privileged --entrypoint bash <image_name>
若已有镜像,可直接以后台模式运行容器:
docker run -d --name my_flask_app -p 5000:5000 flask_app:v1
其中 my_flask_app 是容器名称,flask_app:v1 是指定的镜像名称。
镜像命名规则
- 主体名称:用于标识镜像本身。
- 仓库地址(可选):通常为 Docker Hub 或私有仓库地址。
- 格式:
[registry/]<repository>[:<tag>]
标签(Tag)说明
- 用于区分镜像的不同版本或变体。
- 若未显式指定,默认使用
latest标签。
镜像与容器的本质区别
| 特性 | Docker 镜像 | Docker 容器 |
|---|---|---|
| 本质 | 只读模板,包含运行所需文件和元数据 | 镜像的运行实例,具有可写层和隔离环境 |
| 状态 | 静态、不可变 | 动态、可启停、内部状态可变 |
| 存储结构 | 由多个只读层通过联合文件系统叠加而成 | 在镜像只读层之上增加一个可写容器层 |
| 创建方式 | docker build 基于 Dockerfile |
docker run 从镜像启动,支持多实例 |
| 持久性 | 独立存在,删除容器不影响镜像 | 停止后默认丢失可写层数据(需挂载卷持久化) |
| 类比 | 面向对象中的"类"或 ISO 安装镜像 | "对象"实例或已安装并运行的操作系统 |
常用操作命令对照
| 命令 | 作用对象 | 说明 |
|---|---|---|
docker build -t app-image . |
镜像 | 基于当前目录的 Dockerfile 构建名为 app-image 的镜像 |
docker run -d --name app-instance app-image |
容器 | 从 app-image 启动名为 app-instance 的后台容器 |
docker rmi app-image |
镜像 | 删除镜像(需确保无关联容器存在) |
docker rm app-instance |
容器 | 删除容器及其可写层数据 |
镜像与容器的关系类比
镜像如同虚拟机模板(如 .vmx 文件),是只读、分层且静态的;容器则是该模板启动后的运行实例,具备可写状态和生命周期。
导出容器 vs 导出镜像
| 特性 | docker export(导出容器) |
docker save(导出镜像) |
|---|---|---|
| 命令示例 | docker export my_container > app_snapshot.tar |
docker save -o app_image.tar app-image:v1 |
| 导出内容 | 容器当前文件系统的扁平快照,不含历史层或元数据 | 完整的镜像分层结构及所有元数据(如 ENTRYPOINT、ENV、标签等) |
| 主要用途 | 快速迁移或备份运行时状态(如开发调试环境) | 离线分发或备份完整镜像(适用于部署到无网络环境) |
| 重新导入 | docker import app_snapshot.tar new-image:dev(生成新扁平镜像) |
docker load -i app_image.tar(还原原始镜像及标签) |
| 类比 | 整机硬盘克隆 | 未拆封的乐高套装(含说明书和所有零件) |