📌 本文概述:本教程从零开始介绍 Docker 核心概念,涵盖安装配置、镜像管理、容器操作、Compose 编排及生产实践,适合有一定 Linux 基础的开发者阅读。
1. Docker 是什么
Docker 是一个开源的容器化平台,它允许开发者将应用程序及其所有依赖打包到一个轻量、可移植的容器中,确保应用在任何环境下都能一致地运行。
你可以把 Docker 容器想象成一个轻量级的"集装箱"——就像真实的集装箱可以在轮船、卡车、火车上通用,Docker 容器也可以在开发机、测试环境、生产服务器上无缝运行。
1.1 容器与虚拟机的区别
容器和虚拟机都实现了隔离,但原理和资源消耗差异很大:
| 对比维度 | 虚拟机 (VM) | Docker 容器 |
|---|---|---|
| 隔离级别 | 硬件级别(含完整 OS) | 操作系统级别(共享内核) |
| 启动时间 | 分钟级 | 秒级甚至毫秒级 |
| 镜像大小 | GB 级 | MB 级 |
| 性能损耗 | 较高(~5%~15%) | 极低(接近原生) |
| 资源利用 | 低(固定分配) | 高(动态分配) |
| 适用场景 | 强隔离、不同 OS | 微服务、CI/CD、云原生 |
1.2 核心架构
Docker 采用 C/S 架构,主要由三部分组成:
- Docker Daemon(dockerd):后台守护进程,负责管理镜像、容器、网络、数据卷
- Docker Client(docker CLI):用户交互的命令行工具,通过 REST API 与 Daemon 通信
- Docker Registry:镜像仓库,官方提供 Docker Hub,也可自建私有仓库
✅ 核心概念三要素:镜像(Image)是只读模板;容器(Container)是镜像的运行实例;仓库(Registry)是存储镜像的地方。
2. 安装与配置
2.1 Linux 安装
推荐使用官方安装脚本,适用于 Ubuntu / Debian / CentOS:
# 官方一键安装脚本(推荐)
curl -fsSL https://get.docker.com | sh
# 将当前用户加入 docker 组(避免每次 sudo)
sudo usermod -aG docker $USER
# 重新登录后验证安装
docker version
docker run hello-world
安装完成后,启动并设置开机自启:
sudo systemctl start docker
sudo systemctl enable docker
sudo systemctl status docker
2.2 镜像加速配置
国内访问 Docker Hub 较慢,建议配置国内镜像加速器:
# 编辑 Docker 配置文件
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com",
"https://registry.docker-cn.com"
],
"log-driver": "json-file",
"log-opts": { "max-size": "100m", "max-file": "3" }
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
3. 镜像管理
3.1 常用镜像命令
# 搜索镜像
docker search nginx
# 拉取镜像(不指定 tag 则默认 latest)
docker pull nginx:1.25-alpine
# 查看本地镜像列表
docker images
# 查看镜像详细信息
docker inspect nginx:1.25-alpine
# 删除镜像
docker rmi nginx:1.25-alpine
# 清理无用镜像(悬空镜像)
docker image prune -f
3.2 编写 Dockerfile
Dockerfile 是构建自定义镜像的核心,下面是一个 Node.js 应用的最佳实践示例:
# ── 构建阶段(多阶段构建减小镜像体积)──
FROM node:20-alpine AS builder
WORKDIR /app
# 先复制依赖清单,利用层缓存
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
# ── 运行阶段 ──
FROM node:20-alpine
WORKDIR /app
# 创建非 root 用户(安全最佳实践)
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
USER appuser
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=5s \
CMD wget -qO- http://localhost:3000/health || exit 1
CMD ["node", "dist/server.js"]
⚠️ 注意:每条
RUN、COPY、ADD 指令都会创建一个新的镜像层。合理使用多阶段构建和 && 合并命令,可以显著减小最终镜像体积。
构建并推送镜像:
# 构建镜像(. 表示当前目录为构建上下文)
docker build -t myapp:1.0.0 .
# 为镜像打标签
docker tag myapp:1.0.0 registry.example.com/myapp:1.0.0
# 推送到私有仓库
docker push registry.example.com/myapp:1.0.0
4. 容器操作
掌握容器的完整生命周期管理是日常使用 Docker 的基础:
# 运行容器(-d 后台,-p 端口映射,--name 命名,--restart 重启策略)
docker run -d \
--name my-nginx \
-p 8080:80 \
-v /data/html:/usr/share/nginx/html:ro \
--restart unless-stopped \
nginx:1.25-alpine
# 查看运行中的容器
docker ps
# 查看所有容器(含已停止)
docker ps -a
# 进入容器交互终端
docker exec -it my-nginx /bin/sh
# 查看容器日志(-f 实时跟踪,--tail 最后N行)
docker logs -f --tail 100 my-nginx
# 查看容器资源使用
docker stats my-nginx
# 停止 / 启动 / 重启
docker stop my-nginx
docker start my-nginx
docker restart my-nginx
# 强制删除容器
docker rm -f my-nginx
# 清理所有停止的容器
docker container prune -f
5. Docker Compose
Docker Compose 用于定义和运行多容器应用。下面是一个 Web 应用 + Redis + MySQL 的典型配置:
# compose.yml
services:
web:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=mysql://root:secret@db:3306/myapp
- REDIS_URL=redis://cache:6379
depends_on:
db:
condition: service_healthy
cache:
condition: service_started
restart: unless-stopped
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: myapp
volumes:
- db_data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
cache:
image: redis:7-alpine
command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru
volumes:
- redis_data:/data
volumes:
db_data:
redis_data:
常用 Compose 命令:
# 启动所有服务(-d 后台运行)
docker compose up -d
# 查看服务状态
docker compose ps
# 查看所有服务日志
docker compose logs -f
# 重新构建并启动(代码更新后)
docker compose up -d --build
# 停止并删除容器(保留数据卷)
docker compose down
# 停止并删除容器+数据卷(慎用!)
docker compose down -v
6. 生产实践
在生产环境使用 Docker 时,请遵循以下最佳实践:
- ✅ 使用 多阶段构建减小镜像体积,只保留运行时必要文件
- ✅ 始终指定具体的镜像 版本 tag,避免使用
latest - ✅ 容器以非 root 用户运行(安全)
- ✅ 为容器配置资源限制(
--memory、--cpus)防止资源耗尽 - ✅ 设置合理的健康检查(
HEALTHCHECK),让编排系统感知服务状态 - ✅ 敏感信息使用 Docker Secrets 或环境变量注入,不写入镜像
- ✅ 日志统一输出到 stdout/stderr,由宿主机的日志驱动收集
🚨 安全警告:不要在 Dockerfile 中硬编码密码、API 密钥等敏感信息,也不要将
.env 文件打包进镜像。使用 .dockerignore 排除敏感文件。
至此,你已掌握 Docker 的核心知识。接下来推荐继续学习 Kubernetes 入门指南,将容器化应用扩展到集群编排层面。
depends_on加condition: service_healthy这个写法我之前一直不知道,解决了我数据库还没启动应用就挂的问题。