Docker改变了应用的打包、分发和运行方式。从容器基础到生产环境部署,掌握Docker可以显著提升你的开发效率和部署能力。本指南将带你从Docker基础进阶到精通的容器化实战。
第一章:Docker基础
理解容器化的核心概念:
1. 什么是 Docker
- 容器:应用及其依赖的轻量级可执行包
- 镜像:只读模板,用于创建容器
- 容器运行时: Docker Engine
2. 基本概念
# 镜像 vs 容器
# 镜像:静态的, 如虚拟机的模板
# 容器:镜像的运行实例, 如虚拟机的实例
# 核心命令
docker images # 列出本地镜像
docker ps # 列出运行中的容器
docker ps -a # 列出所有容器
docker rmi <image> # 删除镜像
docker rm <container> # 删除容器
第二章:镜像构建
1. Dockerfile
# 基础 Node.js 应用 Dockerfile
FROM node:20-alpine
WORKDIR /app
# 利用缓存层
COPY package*.json ./
RUN npm install --production
# 复制源码
COPY . .
# 暴露端口
EXPOSE 3000
# 启动命令
CMD ["node", "index.js"]
# 构建命令
docker build -t my-app:latest .
# 常用构建参数
# --no-cache: 不使用缓存
# --pull: 始终尝试拉取最新基础镜像
# -t: 标签 (名称:tag)
2. 多阶段构建
# 多阶段构建 - 精简镜像
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
# 生产构建
RUN npm run build
# 第二阶段 - 运行时环境
FROM nginx:alpine
# 从构建阶段复制 artifacts
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
第三章:容器运行
1. 基本操作
# 运行容器
docker run -d -p 8080:80 --name my-container my-image
# 交互模式
docker run -it --name my-container my-image /bin/bash
# 容器内部操作
docker exec -it my-container bash # 进入容器
docker cp my-container:/path/file ./ # 复制文件出容器
docker logs my-container # 查看容器日志
# 容器状态管理
docker start my-container # 启动容器
docker stop my-container # 停止容器
docker restart my-container # 重启容器
docker rm my-container # 删除容器
2. 环境变量
# 通过 -e 传递
docker run -d -p 80:80 -e NODE_ENV=production my-image
# 通过文件传递
# .env 文件
NODE_ENV=production
PORT=80
# docker run 时使用
docker run -d --env-file .env -p 80:80 my-image
第四章:数据持久化
1. 卷
# 挂载主机目录
docker run -d -v /host/path:/container/path my-image
# 命名卷 (推荐)
docker volume create my-data
docker run -d -v my-data:/container/path my-image
# 查看和管理卷
docker volume ls # 列出卷
docker volume prune # 删除未使用的卷
2. 数据库容器化
# MySQL 容器示例
docker run -d \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=mydb \
-p 3306:3306 \
--name mysql-db \
mysql:8.0
# 数据持久化
docker run -d \
-e MYSQL_ROOT_PASSWORD=secret \
-v mysql-data:/var/lib/mysql \
-p 3306:3306 \
--name mysql-db \
mysql:8.0
第五章:Docker Compose
1. docker-compose.yml
# 简单服务编排
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
NODE_ENV: production
depends_on:
- db
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: app_db
volumes:
- db-data:/var/lib/mysql
volumes:
db-data:
2. 常用命令
# 启动所有服务
docker-compose up -d
# 停止所有服务
docker-compose down
# 查看服务日志
docker-compose logs -f
# 执行命令进入容器
docker-compose exec web bash
总结
从入门到精通 Docker 的路径包括:
- 掌握基本概念和基本命令
- 学习 Dockerfile 和镜像构建
- 理解容器运行和数据持久化
- 实践 Docker Compose 编排
- 探索生产环境最佳实践
记住,Docker 让 "it works on my machine" 成为过去式。从今天开始尝试容器化你的应用,你会发现开发和部署的效率有质的飞跃。
最重要的原则:显式配置,最小化镜像,数据持久化分离。