Docker 镜像与容器关系解析

要理解 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 会:

  1. 加载镜像的所有只读层;

  2. 在最顶层创建一个可写层;

  3. 为容器分配独立的资源(进程空间、网络、内存、CPU等);

  4. 执行镜像中定义的启动命令。

  • 核心特点

    • 可写:容器的所有修改(如写入文件、修改配置)都只发生在顶层的可写层,不会影响底层镜像;

    • 独立隔离:每个容器都是相互隔离的(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+网络等
核心作用 存储和分发应用 运行应用
修改方式 重新构建 运行时修改(仅在可写层)

总结

  1. 核心关系:镜像是容器的只读模板,容器是镜像的可运行实例,一个镜像可创建多个独立的容器;

  2. 核心特性:镜像分层只读、容器在镜像之上加可写层运行,容器的修改不会影响原镜像;

  3. 核心价值:镜像解决了"应用环境一致性"问题(一次构建、到处运行),容器解决了"应用隔离运行"问题。

相关推荐
唐青枫33 分钟前
别再只会用 cron:Linux systemd Timer 定时任务实战详解
linux
AlfredZhao2 天前
生产环境里,为什么不建议把普通端口直接暴露到公网?
linux·https·443·80
戴为沐3 天前
Linux内存扩容指南
linux
zylyehuo3 天前
Linux 彻底且安全地删除文件
linux
用户805533698034 天前
主线 U-Boot 上 RK3506:和闭源 rkbin 拔河的三个隐性契约
linux·嵌入式
用户034095297914 天前
linux fcitx 5 雾凇拼音 设置在中文输入法下仍然输入英文标点
linux
Patrick_Wilson5 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
Suroy5 天前
DockerView-Go:用 Go 写一个终端 Docker 监控工具,顺便做了个 Web 仪表盘
docker
云恒要逆袭5 天前
运行你的第一个Docker容器
后端·docker·容器
Web3探索者6 天前
可视化服务器管理和传统命令行区别是什么?新手教程:Linux 运维到底该用图形界面还是 SSH 命令行?
linux·ssh