Appearance
核心概念
学习 Docker,首先需要理解几个核心概念:镜像、容器、仓库。这三者的关系就好比类、实例和代码仓库的关系。
镜像(Image)
什么是镜像
Docker 镜像是一个只读的模板,包含了运行应用程序所需的代码、运行时环境、库、环境变量和配置文件。镜像是创建容器的基础。
可以把镜像理解为:
- 编程中的类(Class)
- 面向对象中的蓝图
- 操作系统中的 ISO 安装文件
镜像的分层结构
Docker 镜像采用分层(Layer)结构,每一层都是只读的。多个镜像可以共享相同的底层,大大节省存储空间。
┌─────────────────────────┐
│ 应用层(APP Layer) │ ← 你的应用代码
├─────────────────────────┤
│ 依赖层(Deps Layer) │ ← Node.js / Python 等依赖
├─────────────────────────┤
│ 运行时层(Runtime) │ ← 语言运行时
├─────────────────────────┤
│ 系统层(OS Layer) │ ← Ubuntu / Alpine 等基础系统
└─────────────────────────┘各层之间通过联合文件系统(UnionFS) 叠加,对上层透明。
镜像的命名规则
[仓库地址/]用户名/镜像名[:标签]示例:
nginx # 官方镜像,默认 latest 标签
nginx:1.25 # 官方镜像,指定版本
ubuntu:22.04 # Ubuntu 22.04
node:20-alpine # Node.js 20 Alpine 版本
myuser/myapp:v1.0 # 用户自定义镜像
registry.example.com/myapp # 私有仓库镜像常用镜像命令
bash
docker images # 列出本地镜像
docker pull nginx # 拉取镜像
docker rmi nginx # 删除镜像
docker image prune # 清理未使用的镜像容器(Container)
什么是容器
容器是镜像的运行实例。可以把容器理解为:
- 编程中由类创建的对象(实例)
- 从镜像模板启动的运行中的进程
容器在镜像的只读层之上,添加了一个可写层(Writable Layer),所有对文件系统的写操作都发生在这一层。
┌─────────────────────────┐
│ 可写层(Container) │ ← 容器运行时的写操作在此层
├─────────────────────────┤
│ │
│ 只读层(Image) │ ← 底层镜像层(只读)
│ │
└─────────────────────────┘容器的生命周期
创建(created) → 运行(running) → 暂停(paused) → 停止(stopped) → 删除(removed)容器的特点
- 隔离性:每个容器拥有独立的文件系统、进程空间、网络栈
- 轻量级:共享宿主机内核,不需要完整的操作系统
- 可移植:在任何支持 Docker 的平台上运行表现一致
- 短暂性:容器是临时的,停止并删除后容器层的数据消失
常用容器命令
bash
docker run nginx # 创建并启动容器
docker ps # 列出运行中的容器
docker ps -a # 列出所有容器(含停止的)
docker stop <容器ID> # 停止容器
docker rm <容器ID> # 删除容器
docker exec -it <容器ID> bash # 进入容器仓库(Repository)
什么是仓库
Docker 仓库是存储和分发镜像的地方,类似于 Git 的代码仓库,但存储的是 Docker 镜像。
Docker Hub
Docker Hub 是 Docker 官方的公共镜像仓库,包含了大量官方镜像和社区镜像。
- 官方镜像:由 Docker 官方维护,如
nginx、mysql、node - 认证镜像:由可信发布者(ISV)提供并维护
- 社区镜像:由普通用户上传,格式为
用户名/镜像名
私有仓库
企业通常搭建私有镜像仓库,常用方案:
- Docker Registry:Docker 官方提供的开源方案
- Harbor:VMware 开源的企业级镜像仓库
- Nexus:支持多种制品类型的仓库管理器
- 各云厂商:阿里云 ACR、腾讯云 TCR、AWS ECR 等
常用仓库命令
bash
docker login # 登录 Docker Hub
docker push myimage:1.0 # 推送镜像到仓库
docker pull myimage:1.0 # 从仓库拉取镜像
docker search nginx # 搜索镜像Dockerfile
Dockerfile 是一个文本文件,包含了一系列指令,Docker 根据这些指令自动构建镜像。
dockerfile
# 基础镜像
FROM node:20-alpine
# 设置工作目录
WORKDIR /app
# 复制文件
COPY package*.json ./
# 安装依赖
RUN npm install
# 复制源码
COPY . .
# 暴露端口
EXPOSE 3000
# 启动命令
CMD ["node", "app.js"]Docker Compose
Docker Compose 是用于定义和运行多容器应用的工具,通过 YAML 文件配置服务,一条命令启动所有服务。
yaml
services:
web:
image: nginx:alpine
ports:
- "80:80"
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: secret核心概念关系图
Dockerfile ──build──→ Image ──run──→ Container
↑ ↓
pull commit
↑ ↓
Registry ←──push── Image| 概念 | 类比 | 作用 |
|---|---|---|
| Dockerfile | 菜谱 | 定义如何构建镜像 |
| Image(镜像) | 菜谱做好的半成品 | 容器的只读模板 |
| Container(容器) | 上桌的菜 | 镜像的运行实例 |
| Registry(仓库) | 菜谱书店 | 存储和分发镜像 |
总结
理解这几个核心概念是学习 Docker 的基础:
- 镜像是只读模板,通过 Dockerfile 构建
- 容器是镜像的运行实例,拥有独立的运行环境
- 仓库是镜像的存储和分发中心
- Dockerfile 定义了镜像的构建过程
- Docker Compose 用于管理多容器应用
下一节将介绍 Docker 的整体架构,帮助你理解 Docker 各组件的工作原理。