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

相关推荐
升职佳兴2 小时前
Docker 安装、镜像管理与 Dockerfile 构建实战(openEuler 版)
运维·docker·容器
芥子沫2 小时前
提示词管理工具推荐prompt-manage,Docker一键部署和使用指南
docker·容器·prompt·提示词
2501_915921432 小时前
在 Linux 上通过命令行上架 iOS APP,Fastlane + AppUploader(开心上架)
android·linux·运维·ios·小程序·uni-app·iphone
TeamDev2 小时前
使用 Docker 部署 DotNetBrowser 应用程序
运维·ui·docker·容器·桌面应用·dotnet·dotnetbrowser
Qeesun2 小时前
UV 环境管理指南 / 如何将旧项目接入 UV
linux·python·uv
摇滚侠2 小时前
帮我找一个 Ubuntu 服务器下载地址,下载速度快的
linux·服务器·ubuntu
ErizJ2 小时前
面试 | Docker K8S
docker·面试·kubernetes
食指Shaye2 小时前
docker的学习日记
学习·docker·eureka
℘团子এ2 小时前
什么是Docker
前端·docker·容器