Docker 三大核心概念关系图 +-----------------------------------+ | Docker Registry (仓库) | | +-----------------------------+ | | | Image (镜像) | | | | +---------------------+ | | | | | Container (容器) | | | | | | +-------------+ | | | | | | | App | | | | | | | | + Deps | | | | | | | | + Config | | | | | | | +-------------+ | | | | | +---------------------+ | | | +-----------------------------+ | +-----------------------------------+
Docker核心概念关系图
层级关系:Docker Registry → Image → Container
(从存储到运行:镜像仓库 → 镜像 → 容器实例)
三者关系详解
1. 镜像(Image) - 静态模板
- 定义:只读的模板,包含应用程序及其运行环境的所有内容
- 特点:
- 类似软件安装包(如
.exe文件) - 由多层(Layer)组成,每层都是一个文件系统更改
- 存储在本地或远程仓库中
- 类似软件安装包(如
- 示例:
nginx:latest、ubuntu:20.04
2. 容器(Container) - 运行实例
- 定义:镜像的运行时实例
- 特点:
- 类似正在运行的进程
- 在镜像基础上增加一个可写层
- 每个容器相互隔离
- 启动快、资源占用少
- 示例:运行中的Nginx服务器实例
3. 仓库(Registry) - 镜像存储库
- 定义:集中存储和分发镜像的地方
- 类型:
- 公共仓库:Docker Hub(默认)
- 私有仓库:企业自建(如 Harbor)
- 示例:从
docker.io/library/nginx拉取镜像
层级关系与工作流程
层次结构
Docker Registry (远程/本地仓库)
↓
镜像(Image) ← 通过 Dockerfile 构建
↓
容器(Container) ← 运行中的实例
↓
容器数据(Volume) ← 持久化存储
创建与运行流程
# 1. 从仓库拉取镜像(或本地构建)
docker pull ubuntu:20.04
# 2. 查看本地镜像
docker images
# REPOSITORY TAG IMAGE ID CREATED SIZE
# ubuntu 20.04 xxx... ... 72.8MB
# 3. 从镜像创建并运行容器
docker run -it ubuntu:20.04 /bin/bash
# 4. 查看运行中的容器
docker ps
# CONTAINER ID IMAGE COMMAND STATUS NAMES
# abc123def ubuntu:20.04 "/bin/bash" Up 2 minutes vibrant_euler
类比解释
| 概念 | 面向对象编程 | 操作系统 | 软件安装 |
|---|---|---|---|
| 镜像 | 类定义(Class) | 系统镜像(ISO文件) | 安装程序(.exe/.dmg) |
| 容器 | 对象实例(Object) | 运行的虚拟机 | 已安装并运行的程序 |
| 仓库 | 代码仓库(GitHub) | 软件源 | 应用商店 |
实际操作中的关系
从镜像到容器
# 一个镜像可以创建多个容器
docker run -d --name web1 nginx:alpine
docker run -d --name web2 nginx:alpine
docker run -d --name web3 nginx:alpine
# 现在有3个容器,都基于同一个nginx镜像
容器修改可保存为新镜像
# 1. 运行容器并做修改
docker run -it ubuntu:20.04 /bin/bash
# 在容器内:apt-get update && apt-get install -y curl
# 2. 退出容器,将其保存为新镜像
docker commit <容器ID> my-ubuntu-with-curl:v1
Dockerfile构建镜像
# Dockerfile - 定义镜像的构建步骤
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y nginx
COPY index.html /var/www/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
# 构建镜像
docker build -t my-nginx:v1 .
# 运行容器
docker run -d -p 8080:80 my-nginx:v1
数据流动关系
开发者机器:
Dockerfile → (docker build) → 本地镜像 → (docker run) → 容器
团队协作:
本地镜像 → (docker push) → Docker Hub → (docker pull) → 同事机器 → 容器
生产环境:
CI/CD管道 → 构建镜像 → 推送到私有仓库 → 生产服务器拉取并运行容器
重要特性总结
-
镜像层缓存机制
# 每一条指令都创建一个新的镜像层 FROM ubuntu:20.04 # 层1:基础镜像 RUN apt-get update # 层2:更新包列表 RUN apt-get install nginx # 层3:安装nginx COPY app /var/www/html # 层4:复制应用文件 -
容器与镜像的关系
- 容器 = 镜像 + 可写层
- 可写层在容器删除时丢失(除非使用卷Volume)
-
生命周期
镜像存在周期:构建 → 存储 → 分发 → 删除 容器存在周期:创建 → 启动 → 停止 → 删除
简单记忆法则
- 镜像是食谱(Recipe)
- 容器是做好的菜(Dish)
- 仓库是食谱书(Cookbook)
- Docker是厨房(Kitchen)
关键点:一个镜像可以创建多个容器,但容器不能直接变成镜像(需要通过commit或重新构建)。容器运行时的所有修改都在可写层,不影响原始镜像。