Skip to content

核心概念

学习 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 官方维护,如 nginxmysqlnode
  • 认证镜像:由可信发布者(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 的基础:

  1. 镜像是只读模板,通过 Dockerfile 构建
  2. 容器是镜像的运行实例,拥有独立的运行环境
  3. 仓库是镜像的存储和分发中心
  4. Dockerfile 定义了镜像的构建过程
  5. Docker Compose 用于管理多容器应用

下一节将介绍 Docker 的整体架构,帮助你理解 Docker 各组件的工作原理。