Docker 是一种容器化(Containerization)技术:将应用与依赖打包为镜像(Image),在隔离的容器(Container)中运行,实现「一次构建,到处运行」。与虚拟机相比,容器共享宿主机内核、启动快、资源占用小。本文介绍 Docker 核心概念、常用命令、Dockerfile 编写与 Docker Compose 编排,帮助团队统一开发与生产环境。
一、Docker 为何重要:数据与优势
根据 Docker 官方与 CNCF 调研,容器化可显著提升部署效率与资源利用率。开发与生产环境一致,可减少「在我机器上能跑」类问题;镜像版本化便于回滚与审计。
| 维度 | 传统虚拟机 | Docker 容器 | 说明 |
|---|---|---|---|
| 启动时间 | 分钟级 | 秒级 | 容器共享内核,无需启动完整 OS |
| 资源占用 | 每 VM 独立 OS | 共享宿主机内核 | 同机可运行更多实例 |
| 镜像体积 | GB 级 | MB 级(Alpine 等) | 分层与精简基础镜像 |
| 可移植性 | 依赖虚拟化层 | 标准镜像格式 | 任意支持 Docker 的环境均可运行 |
数据来源:Docker 官方文档、CNCF 调查报告(综合整理)。
二、Docker 核心概念
Docker 包含三大核心:镜像(Image)、容器(Container)、仓库(Registry)。
2.1 镜像(Image)
镜像是只读模板,由多层(Layer)组成,每层对应 Dockerfile 中的一条指令。镜像可来自 Dockerfile 构建,或从仓库拉取。同一镜像可创建多个容器实例。
2.2 容器(Container)
容器是镜像的运行实例,具有可写层,可创建、启动、停止、删除。容器之间相互隔离,拥有独立的文件系统、网络与进程空间。
2.3 仓库(Registry)
仓库用于存储与分发镜像。Docker Hub 是公共仓库;企业可自建私有仓库(如 Harbor)。
| 概念 | 说明 | 常用命令 |
|---|---|---|
| 镜像 | 只读模板,含应用与依赖 | docker build, docker pull, docker images |
| 容器 | 镜像的运行实例,可读写 | docker run, docker start, docker ps |
| Volume | 持久化数据,挂载到容器 | docker volume create, -v 挂载 |
| Network | 容器间通信、端口映射 | docker network create, -p 端口 |
三、Docker 常用命令详解
日常使用中,镜像与容器的生命周期命令最为常用。
3.1 镜像相关
docker pull <image>:从仓库拉取镜像。docker build -t <name>:<tag> .:根据当前目录 Dockerfile 构建镜像,-t 指定名称与标签。docker images:列出本地镜像。
3.2 容器相关
docker run -d -p 8080:80 --name myapp <image>:-d 后台运行,-p 将容器 80 映射到宿主机 8080,--name 指定容器名。docker ps 查看运行中容器,docker ps -a 含已停止。docker stop/start/restart <container>:停止/启动/重启。docker rm <container>:删除容器(需先停止)。docker logs -f <container>:查看日志,-f 持续输出。
| 类型 | 命令 | 说明 |
|---|---|---|
| 镜像 | docker pull <image> | 拉取镜像 |
| 镜像 | docker build -t <name> . | 构建镜像 |
| 容器 | docker run -d -p 8080:80 <image> | 后台运行并映射端口 |
| 容器 | docker ps / docker ps -a | 查看运行/全部容器 |
| 容器 | docker stop/start/rm <container> | 停止/启动/删除 |
| 日志 | docker logs -f <container> | 查看日志 |
四、Dockerfile 与多阶段构建
Dockerfile 定义镜像构建步骤,每条指令生成一层。多阶段构建(Multi-stage build)可在前几阶段编译、打包,最终阶段只复制产物,显著减小镜像体积。
4.1 常用指令
FROM:基础镜像。RUN:执行命令。COPY/ADD:复制文件。WORKDIR:工作目录。ENV:环境变量。EXPOSE:声明端口。CMD/ENTRYPOINT:容器启动时执行的命令。
4.2 多阶段构建示例
# 阶段一:构建
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 阶段二:仅保留运行时所需
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY package*.json ./
EXPOSE 3000
CMD ["node", "dist/index.js"]
最终镜像不包含源码与 devDependencies,体积更小、更安全。
五、Docker Compose 编排
Docker Compose 通过 YAML 定义多容器应用,可一键启动、停止、扩缩。适用于本地开发与单机多服务部署。
| 指令 | 说明 | 示例 |
|---|---|---|
| version | Compose 文件版本 | "3.8" |
| services | 服务定义 | app, db, redis |
| build | 构建镜像 | build: . |
| ports | 端口映射 | "8080:80" |
| volumes | 卷挂载 | ./data:/var/lib/mysql |
| depends_on | 依赖关系 | app 依赖 db |
| environment | 环境变量 | KEY=value |
运行:docker-compose up -d 后台启动,docker-compose down 停止并删除容器。
六、选型与落地要素权重
基于实际项目经验,容器化落地时以下要素的影响程度(相对权重,满分 100):
说明:权重基于容器化项目实践归纳,仅供参考。
七、小结
Docker 通过镜像与容器实现可移植、可复现的部署。落地时从 Dockerfile、多阶段构建与 Compose 入手,结合 CI/CD 自动化构建与发布。若需 Kubernetes 等编排,可参考本站《云原生应用实践》;若需自动化流水线,可阅读《CI/CD 与持续交付实践》。