要理解 Docker 镜像(Image)和容器(Container)的关系,通过本文的讲解会让你既能理解核心逻辑,也能落地实操。
一、核心比喻(快速理解)
| 概念 | 类比 | 核心特征 |
|---|---|---|
| Docker 镜像 | 软件安装包(如 .exe)/ 蛋糕模具 |
只读、静态、可复用、不可修改 |
| Docker 容器 | 安装好的软件 / 用模具做的蛋糕 | 可写、动态、运行态、独立隔离 |
一句话总结:
镜像是容器的"模板",容器是镜像的"运行实例" ------ 一个镜像可以创建无数个容器,就像一个模具可以做出无数个蛋糕。
二、技术本质(深入理解)
1. Docker 镜像(Image)
-
本质 :是一个分层的、只读的文件系统集合,包含运行某个应用所需的所有依赖(代码、运行时、库、环境变量、配置文件等)。
-
分层特性 :镜像由多个只读层(Layer)叠加而成,分层设计的好处是复用和节省空间(比如多个镜像共享基础层,无需重复存储)。
例:一个 nginx 镜像的分层可能是:基础Linux层 → nginx依赖层 → nginx程序层 → 配置层。
-
核心特点:
-
只读:镜像一旦构建完成,就无法修改(要改只能重新构建新镜像);
-
可共享:可以推送到 Docker Hub/私有仓库,供其他人拉取使用;
-
跨平台:只要底层系统支持 Docker,镜像可以在任意机器上运行(如本地Windows、云服务器Linux)。
-
2. Docker 容器(Container)
-
本质 :是镜像的运行时实例 ,在镜像的只读层之上,多了一层可写层(Writable Layer)。
-
运行逻辑:
当你用 docker run 启动容器时,Docker 会:
-
加载镜像的所有只读层;
-
在最顶层创建一个可写层;
-
为容器分配独立的资源(进程空间、网络、内存、CPU等);
-
执行镜像中定义的启动命令。
-
核心特点:
-
可写:容器的所有修改(如写入文件、修改配置)都只发生在顶层的可写层,不会影响底层镜像;
-
独立隔离:每个容器都是相互隔离的(Namespace 隔离),拥有自己的网络、进程、文件系统;
-
生命周期:容器可以启动、停止、重启、删除,删除后可写层的数据也会被清除(除非挂载了数据卷 Volume);
-
可转化:如果想把容器的修改保存下来,可以通过
docker commit将容器转为新镜像。
-
三、实操示例(落地验证)
通过简单的命令,直观感受镜像和容器的关系:
1. 拉取镜像(获取"模板")
bash
# 拉取官方的 nginx 镜像(相当于下载"nginx安装包")
docker pull nginx:latest
2. 查看镜像(确认"模板"存在)
bash
# 列出本地所有镜像
docker images
# 输出示例:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 2 months ago 142MB
3. 基于镜像创建并启动容器(用"模板"生成"运行实例")
bash
# 基于 nginx 镜像启动一个容器,命名为 my-nginx,映射80端口
docker run -d --name my-nginx -p 8080:80 nginx:latest
4. 查看容器(确认"实例"运行)
bash
# 列出运行中的容器
docker ps
# 输出示例:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1b2c3d4e5f6 nginx:latest "/docker-entrypoint...." 10 seconds ago Up 9 seconds 0.0.0.0:8080->80/tcp my-nginx
5. 修改容器并保存为新镜像(可选)
bash
# 进入容器,修改配置(比如修改 nginx 首页)
docker exec -it my-nginx /bin/bash
echo "Hello Docker" > /usr/share/nginx/html/index.html
exit
# 将修改后的容器提交为新镜像(命名为 my-nginx:v1)
docker commit my-nginx my-nginx:v1
# 查看新镜像
docker images
# 输出会多一行:
REPOSITORY TAG IMAGE ID CREATED SIZE
my-nginx v1 987654321abc 1 minute ago 142MB
6. 删除容器(不影响镜像)
bash
# 停止并删除容器
docker stop my-nginx
docker rm my-nginx
# 再次查看容器:已无运行实例
docker ps -a
# 查看镜像:nginx:latest 和 my-nginx:v1 仍存在
docker images
四、关键区别对比表
| 维度 | Docker 镜像 | Docker 容器 |
|---|---|---|
| 状态 | 静态、只读 | 动态、可写 |
| 生命周期 | 持久化(除非手动删除) | 临时(停止/删除后数据丢失) |
| 资源占用 | 仅占用磁盘空间 | 占用磁盘+内存+CPU+网络等 |
| 核心作用 | 存储和分发应用 | 运行应用 |
| 修改方式 | 重新构建 | 运行时修改(仅在可写层) |
总结
-
核心关系:镜像是容器的只读模板,容器是镜像的可运行实例,一个镜像可创建多个独立的容器;
-
核心特性:镜像分层只读、容器在镜像之上加可写层运行,容器的修改不会影响原镜像;
-
核心价值:镜像解决了"应用环境一致性"问题(一次构建、到处运行),容器解决了"应用隔离运行"问题。