0. 前置知识
先确认这些基础:
| 知识 | 要掌握到什么程度 |
|---|---|
| Linux 命令 | cd、ls、cat、vim、chmod、systemctl、journalctl |
| 网络基础 | 端口、IP、域名、HTTP/HTTPS、反向代理 |
| Git | 拉代码、切分支、打 tag |
| 项目启动方式 | 知道你的项目如何本地启动,比如 npm run start、java -jar、python app.py |
1. Docker 基础阶段
目标:知道容器、镜像、仓库、数据卷、网络分别是什么。
重点学这些命令:
bash
docker version
docker info
docker pull nginx
docker images
docker ps
docker ps -a
docker run
docker stop
docker restart
docker rm
docker rmi
docker logs
docker exec -it 容器名 bash
必须理解:
bash
docker run -d \
--name my-nginx \
-p 8080:80 \
nginx
这行命令的含义:
| 参数 | 作用 |
|---|---|
-d |
后台运行 |
--name |
指定容器名 |
-p 8080:80 |
服务器 8080 端口映射到容器 80 端口 |
nginx |
使用的镜像 |
练习任务:
bash
docker run -d --name nginx-demo -p 8080:80 nginx
docker logs nginx-demo
docker exec -it nginx-demo bash
docker stop nginx-demo
docker rm nginx-demo
2. Dockerfile 阶段
目标:把你的项目打包成镜像。
Dockerfile 是用来构建容器镜像的文本文件,里面定义基础镜像、工作目录、依赖安装、文件复制和启动命令等。Docker 官方文档也把 Dockerfile 作为构建镜像的核心入口。(Docker Documentation)
以 Node.js 项目为例:
docker
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "run", "start"]
常用指令:
| 指令 | 作用 |
|---|---|
FROM |
指定基础镜像 |
WORKDIR |
设置工作目录 |
COPY |
复制文件 |
RUN |
构建镜像时执行命令 |
EXPOSE |
声明容器端口 |
CMD |
容器启动命令 |
ENV |
设置环境变量 |
构建和运行:
bash
docker build -t my-app:1.0 .
docker run -d --name my-app -p 3000:3000 my-app:1.0
重点优化:
docker
COPY package*.json ./
RUN npm install
COPY . .
不要一开始就 COPY . .,否则每次改代码都会导致依赖层缓存失效。Docker 官方镜像构建最佳实践也强调要合理利用缓存、选择更小的基础镜像,并减少镜像引入的漏洞面。(Docker Documentation)
3. .dockerignore 阶段
目标:避免把无用文件打进镜像。
创建 .dockerignore:
node_modules
.git
.env
dist
logs
*.log
.DS_Store
作用:
| 忽略内容 | 原因 |
|---|---|
.git |
不需要进镜像 |
node_modules |
应在镜像内安装依赖 |
.env |
避免泄露密钥 |
logs |
日志不应打包进镜像 |
dist |
看项目类型决定是否忽略 |
4. Docker Volume 数据持久化
目标:容器删了,数据不能丢。
错误示例:
bash
docker run -d --name mysql mysql:8
容器删掉后,数据库数据容易一起丢。
正确示例:
bash
docker volume create mysql-data
docker run -d \
--name mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-v mysql-data:/var/lib/mysql \
mysql:8
常用命令:
bash
docker volume ls
docker volume inspect mysql-data
docker volume rm mysql-data
你需要重点理解:
| 类型 | 示例 | 适合场景 |
|---|---|---|
| volume | mysql-data:/var/lib/mysql |
数据库、Redis、持久化数据 |
| bind mount | /host/path:/container/path |
配置文件、日志目录、开发调试 |
5. Docker Network 网络阶段
目标:多个容器之间可以互相访问。
创建网络:
bash
docker network create app-network
启动 MySQL:
bash
docker run -d \
--name mysql \
--network app-network \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8
启动后端:
bash
docker run -d \
--name backend \
--network app-network \
-p 3000:3000 \
my-backend:1.0
后端连接数据库时,不要写:
DB_HOST=127.0.0.1
应该写:
DB_HOST=mysql
因为在 Docker 网络中,容器名可以当作域名使用。
6. Docker Compose 阶段
目标:用一个文件管理多个服务。
Docker Compose 用于定义和运行多容器应用,可以统一管理服务启动、停止、重建、状态查看和日志输出。(Docker Documentation)
典型项目结构:
project/
├── backend/
│ └── Dockerfile
├── frontend/
│ └── Dockerfile
├── nginx/
│ └── nginx.conf
├── compose.yaml
└── .env
示例 compose.yaml:
yaml
services:
backend:
build: ./backend
container_name: my-backend
ports:
- "3000:3000"
environment:
- DB_HOST=mysql
- DB_PORT=3306
- DB_USER=root
- DB_PASSWORD=123456
depends_on:
- mysql
networks:
- app-network
mysql:
image: mysql:8
container_name: my-mysql
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=mydb
volumes:
- mysql-data:/var/lib/mysql
networks:
- app-network
redis:
image: redis:7-alpine
container_name: my-redis
networks:
- app-network
volumes:
mysql-data:
networks:
app-network:
启动:
bash
docker compose up -d
查看:
bash
docker compose ps
docker compose logs -f
docker compose logs -f backend
停止:
bash
docker compose down
重新构建并启动:
bash
docker compose up -d --build
7. 生产环境部署阶段
目标:在服务器上稳定运行。
生产环境建议使用独立的 Compose 文件,例如:
compose.yaml
compose.production.yaml
Docker 官方也建议生产环境可以使用额外的 Compose 文件覆盖开发配置,例如 compose.production.yaml,再通过 docker compose -f compose.yaml -f compose.production.yaml up -d 启动。(Docker Documentation)
示例:
bash
docker compose -f compose.yaml -f compose.production.yaml up -d
生产环境重点:
| 项目 | 建议 |
|---|---|
| 镜像版本 | 不要长期使用 latest |
| 数据库 | 必须挂载 volume |
| 密码 | 不要硬编码在 compose 文件里 |
| 日志 | 配置日志轮转 |
| 端口 | 只暴露必要端口 |
| HTTPS | 用 Nginx / Caddy / Traefik |
| 备份 | 数据库定时备份 |
| 更新 | 先构建新镜像,再重启服务 |
8. Nginx 反向代理阶段
目标:通过域名访问项目。
例如:
https://api.example.com -> backend:3000
https://example.com -> frontend
Nginx 配置示例:
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://backend:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
在 Compose 里增加 Nginx:
yaml
services:
nginx:
image: nginx:alpine
container_name: my-nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
- backend
networks:
- app-network
9. 多阶段构建阶段
目标:减小镜像体积,提高安全性。
Docker 官方推荐使用 multi-stage builds,多阶段构建可以把构建环境和运行环境分离,从而显著减少镜像体积和攻击面。(Docker Documentation)
例如前端项目:
docker
FROM node:20-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
好处:
| 好处 | 说明 |
|---|---|
| 镜像更小 | 最终镜像不包含 Node.js 构建环境 |
| 更安全 | 减少运行时依赖 |
| 部署更快 | 镜像传输更小 |
| 结构更清晰 | 构建阶段和运行阶段分离 |
10. CI/CD 阶段
目标:代码提交后自动构建和部署。
推荐流程:
GitHub Push
↓
GitHub Actions
↓
docker build
↓
push 到镜像仓库
↓
服务器 docker pull
↓
docker compose up -d
你需要掌握:
| 内容 | 作用 |
|---|---|
| GitHub Actions | 自动化流程 |
| Docker Hub / GHCR | 存放镜像 |
| SSH 部署 | 远程登录服务器执行命令 |
| 镜像 tag | 区分版本 |
| 回滚 | 使用旧 tag 重启 |
示例镜像 tag:
bash
my-app:2026-04-28
my-app:v1.2.0
my-app:commit-abc123
不要只用:
bash
my-app:latest
11. 监控、日志、排错阶段
目标:项目出问题时能定位。
常用命令:
bash
docker ps
docker logs -f container_name
docker inspect container_name
docker exec -it container_name sh
docker stats
docker compose ps
docker compose logs -f
排查方向:
| 问题 | 排查命令 |
|---|---|
| 容器启动失败 | docker logs 容器名 |
| 端口访问不了 | docker ps、安全组、防火墙 |
| 数据库连不上 | 检查网络、容器名、环境变量 |
| 镜像太大 | 检查 Dockerfile、多阶段构建 |
| 磁盘爆了 | docker system df |
| 容器频繁重启 | docker logs、restart 策略 |
清理命令:
bash
docker system df
docker image prune
docker container prune
docker volume prune
注意:docker volume prune 可能删除未使用的数据卷,生产环境慎用。
12. 安全阶段
目标:避免低级安全问题。
重点规则:
| 规则 | 说明 |
|---|---|
不要把 .env 打进镜像 |
密钥泄露风险 |
| 不要在容器内跑 root | 尽量使用非 root 用户 |
| 不要暴露数据库端口到公网 | MySQL、Redis 只走内部网络 |
| 使用可信基础镜像 | 优先官方镜像 |
| 定期更新镜像 | 修复漏洞 |
| 限制容器权限 | 不滥用 --privileged |
| 使用固定版本 tag | 避免不可控变更 |
Docker 安全建议中也强调应使用可信镜像,例如 Docker Official Images,并避免从不可信来源构建镜像或使用不可信 Dockerfile。(Docker Documentation)
你最终要达到的能力
学完后你应该能做到:
1. 写 Dockerfile
2. 构建自己的项目镜像
3. 用 Compose 管理多个服务
4. 在服务器上部署后端、前端、数据库、Redis、Nginx
5. 配置数据持久化
6. 配置域名和 HTTPS
7. 查看日志和排查问题
8. 安全更新和回滚版本
9. 接入 GitHub Actions 自动部署
对独立开发者来说,优先级最高的是:
Dockerfile > Docker Compose > Volume > Network > Nginx > CI/CD