Docker核心概念:镜像、容器、仓库的本质与关联

上一章我们搞定了Docker环境搭建,现在终于可以正式“把玩”Docker了!但在动手操作前,必须先吃透三个核心概念——镜像(Image)、容器(Container)、仓库(Repository)。这三个词是Docker的“地基”,搞懂它们的本质和关联,后续所有命令和操作都会变得清晰易懂。

本章会用“生活化类比+实操演示”的方式,让你彻底明白:这三者到底是什么?它们之间是如何配合工作的?读完后,你会对Docker的工作流程有一个完整的认知。

一、镜像(Image):容器的“源代码”,应用的“安装包” 📦

什么是镜像?

官方定义:Docker镜像是一个只读的模板,包含运行应用所需的代码、运行时、库、环境变量和配置文件。

听着抽象?我们用两个类比理解:

  • 类比1:操作系统安装光盘
    镜像就像一张Windows安装光盘——里面包含了系统运行所需的所有文件和配置,但它本身是“只读”的(你不能直接在光盘上修改文件)。要使用它,必须通过它“安装”出一个可操作的系统(对应容器)。

  • 类比2:代码中的类(Class)
    镜像类似于面向对象中的“类”(定义了属性和方法),而容器则是“类的实例”(基于类创建的具体对象)。一个类可以创建多个实例,一个镜像也可以启动多个容器。

镜像的核心特点:

  1. 只读性:镜像一旦构建完成,就不能被修改(若要修改,需基于原镜像创建新镜像)。
  2. 分层存储:镜像由多层文件系统叠加而成(比如基础层是操作系统,上层是应用代码),这种设计让镜像可以被高效复用(比如多个镜像共享同一个基础层,节省存储空间)。
  3. 可移植:镜像可以被打包、传输,在任何支持Docker的环境中运行,确保“一次构建,到处可用”。

如何获取镜像?

  • 仓库拉取(最常用,比如docker pull nginx拉取Nginx镜像);
  • 自己编写Dockerfile构建(后续章节详解);
  • 从他人分享的镜像文件导入(docker load命令)。

二、容器(Container):镜像的“运行实例”,应用的“活载体” 🚀

什么是容器?

官方定义:容器是镜像的可运行实例,是独立运行的一个或一组应用,以及它们的运行环境。

继续用类比理解:

  • 类比1:操作系统的运行状态
    如果镜像像“Windows安装光盘”,那么容器就是“用光盘安装好并正在运行的Windows系统”——你可以在里面操作文件、运行程序,所有修改都只存在于当前运行的系统中(重启后可能消失,除非做了持久化)。

  • 类比2:类的实例(Object)
    基于“镜像类”创建的“容器实例”,拥有独立的内存、进程空间,可以被启动、停止、删除。多个容器可以同时基于一个镜像运行,互不干扰。

容器与镜像的本质区别:

镜像=只读模板(静态),容器=镜像+可读写层(动态)。

当你启动一个容器时,Docker会在镜像的只读层之上加一层可读写层

  • 容器内的所有操作(比如修改文件、安装软件)都会保存在这层;
  • 镜像本身不会被改变(保证了镜像的可复用性);
  • 若删除容器,这层可读写数据会被清空(除非通过“数据持久化”保存,后续章节详解)。

容器的核心操作:

  • 启动(docker start)、停止(docker stop)、重启(docker restart);
  • 查看运行状态(docker ps);
  • 进入容器内部操作(docker exec);
  • 删除容器(docker rm)。

三、仓库(Repository):镜像的“托管中心”,应用的“应用商店” 🗄️

什么是仓库?

官方定义:仓库是集中存放镜像的地方,类似于代码仓库(如GitHub),用于管理和分发镜像。

类比理解:

  • 就像手机的“应用商店”(如苹果App Store),里面存放了各种“应用安装包”(镜像),你可以搜索、下载(拉取)、上传(推送)自己的镜像。

仓库的分类:

  1. 公有仓库:所有人都可以访问,最常用的是Docker Hub(Docker官方仓库,包含数百万个镜像),国内有阿里云、网易云等镜像仓库(速度更快)。
  2. 私有仓库:仅自己或团队内部可访问,适合存放公司内部项目镜像(避免公开泄露)。

仓库的核心操作:

  • 从仓库拉取镜像(docker pull 仓库地址/镜像名:版本);
  • 向仓库推送镜像(docker push 仓库地址/镜像名:版本);
  • 搜索仓库中的镜像(docker search 镜像名)。

四、三者的关联逻辑:从“仓库”到“容器”的完整流程 🔄

理解了三个概念后,我们用一个“获取并运行Nginx”的例子,看它们如何配合:

  1. 从仓库拉取镜像:你想运行Nginx服务器,先从Docker Hub拉取Nginx镜像(docker pull nginx)。
    → 此时镜像被下载到本地,存放在你的电脑中。

  2. 基于镜像创建容器:用拉取的Nginx镜像启动一个容器(docker run --name mynginx -d nginx)。
    → Docker在镜像的只读层上添加可读写层,容器开始运行,Nginx服务启动。

  3. 操作容器:你可以进入容器修改配置(docker exec -it mynginx /bin/bash),或通过浏览器访问Nginx(localhost:80)。
    → 所有修改都保存在容器的可读写层,镜像本身不变。

  4. 分享镜像(可选):若你修改了Nginx镜像(比如添加了自定义页面),可以将新镜像推送到仓库(docker push 你的仓库名/mynginx:v1),供他人使用。

简单说,三者的关系是:仓库存储镜像 → 镜像生成容器 → 容器运行应用

五、实操演示:用3条命令直观感受三者关系 ✨

光说不练假把式,打开你的终端,跟着执行以下命令,感受镜像→容器→仓库的互动:

步骤1:拉取一个镜像(从仓库到本地)

执行命令拉取官方的Nginx镜像:

docker pull nginx  # 不指定版本默认拉取latest(最新版)

拉取成功后,查看本地镜像列表:

docker images  # 会看到nginx镜像的名称、标签、大小等信息

步骤2:基于镜像创建并运行容器

用拉取的Nginx镜像启动一个容器:

docker run -d -p 8080:80 --name my-first-nginx nginx
  • -d:后台运行容器;
  • -p 8080:80:将容器的80端口映射到主机的8080端口(方便外部访问);
  • --name:给容器起个名字(my-first-nginx)。

查看正在运行的容器:

docker ps  # 会看到my-first-nginx的状态为“Up”(运行中)

此时打开浏览器访问localhost:8080,会看到Nginx的默认欢迎页——这就是容器在运行应用!

步骤3:停止并删除容器(不影响镜像)

停止容器:

docker stop my-first-nginx

删除容器(删除后数据会消失,镜像仍在):

docker rm my-first-nginx

再次查看容器列表(已空):

docker ps -a  # -a显示所有容器(包括已停止的),此时my-first-nginx已被删除

查看镜像列表(nginx镜像仍在,可再次创建容器):

docker images  # nginx镜像依然存在

六、关键补充:镜像分层存储原理(为什么Docker这么高效?) 🧠

前面提到镜像采用“分层存储”,这是Docker轻量高效的核心原因之一。我们用一个例子理解:

假设你构建了两个镜像:

  • 镜像A:基于Ubuntu系统,安装了Python 3.9;
  • 镜像B:基于Ubuntu系统,安装了Python 3.9和Django框架。

此时,镜像A和镜像B会共享“Ubuntu层”和“Python 3.9层”,镜像B只需要新增“Django层”即可。这种“共享底层”的设计:

  • 减少了存储空间(不用重复存储相同内容);
  • 加快了镜像传输速度(只需传输新增的层);
  • 方便了镜像更新(修改某一层后,只需重新构建该层及上层)。

而容器的“可读写层”也是分层的一部分——基于镜像的所有层,再叠加一层可写层,实现“修改不影响原镜像”。

七、总结:搞懂这三个概念,Docker就入门了一半 🎯

本章核心:

  • 镜像是只读模板(安装包),容器是镜像的运行实例(活的应用),仓库是镜像的托管中心(应用商店);
  • 流程:从仓库拉取镜像 → 用镜像创建容器 → 操作容器运行应用 → (可选)将自定义镜像推回仓库;
  • 关键优势:分层存储让镜像高效复用,容器的隔离性保证应用互不干扰。

下一章,我们会详细讲解容器的所有操作命令(创建、启动、进入、删除等),让你真正“掌控”容器。

小思考:如果删除了本地的Nginx镜像,之前基于它创建的容器还能运行吗?为什么?(答案在下一章揭晓~)

posted @ 2025-11-11 10:02  杨凯凡  阅读(20)  评论(0)    收藏  举报