1. 学习目标
这份指南面向零基础,目标是让你做到:
- 理解 Docker 是什么,解决什么问题。
- 会安装 Docker 并运行第一个容器。
- 会编写
Dockerfile构建自己的镜像。 - 会用
docker compose启动多服务项目。 - 会在 VS Code 里配合 Docker 开发和调试。
- 会在团队中用 Docker 保持开发、测试、部署环境一致。
2. Docker 是什么
- Docker 是一种"容器化"技术。
- 你可以把应用和运行环境一起打包成镜像(image)。
- 任何机器只要有 Docker,就能用相同方式运行这个应用。
一句话:
镜像是模板,容器是运行中的实例。
3. Docker 可以用在什么地方
- 本地开发环境统一:避免"我这能跑你那不能跑"。
- 测试环境隔离:每次测试都在干净环境执行。
- 微服务部署:每个服务一个容器,独立升级。
- CI/CD:自动构建镜像并发布。
- 临时工具运行:数据库、Redis、Nginx 等开箱即用。
- 教学与演示:同一套镜像跨机器复现。
不建议直接用 Docker 的场景:
- 强依赖图形桌面的软件。
- 对极致硬实时性能要求非常高的场景。
4. 基础概念(先看懂再操作)
Image(镜像):只读模板,包含应用和依赖。Container(容器):镜像启动后的运行实例。Registry(仓库):存放镜像的平台,如 Docker Hub。Volume(数据卷):容器外持久化数据。Network(网络):容器间通信。Dockerfile:构建镜像的脚本文件。Compose:定义并运行多容器应用。
5. 安装 Docker(Windows 为主)
5.1 安装步骤
- 安装 Docker Desktop。
- 按向导启用 WSL2(Windows 常见)。
- 重启电脑后打开 Docker Desktop。
- 终端验证:
bash
docker --version
docker compose version
5.2 验证安装成功
bash
docker run hello-world
看到 Hello from Docker! 说明运行成功。
6. 第一个容器(一步步)
以 Nginx 为例:
- 拉取镜像:
bash
docker pull nginx:latest
- 启动容器:
bash
docker run -d --name my-nginx -p 8080:80 nginx:latest
- 查看运行状态:
bash
docker ps
- 浏览器访问
http://localhost:8080。 - 停止和删除容器:
bash
docker stop my-nginx
docker rm my-nginx
7. 常用命令速学(新手高频)
bash
# 镜像
docker images
docker pull <image>:<tag>
docker rmi <image>
# 容器
docker ps
docker ps -a
docker run -d --name <name> -p 8080:80 <image>
docker stop <name>
docker start <name>
docker restart <name>
docker rm <name>
docker logs -f <name>
docker exec -it <name> sh
# 清理
docker system df
docker system prune -f
8. 编写 Dockerfile(从 0 到 1)
示例:Node.js 项目 Dockerfile
dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
EXPOSE 3000
CMD ["npm", "run", "start"]
构建与运行:
bash
docker build -t my-node-app:1.0.0 .
docker run -d --name my-node-app -p 3000:3000 my-node-app:1.0.0
9. Docker Compose(多服务项目)
9.1 为什么要用 Compose
当项目有多个服务(如 Web + MySQL + Redis)时,Compose 可以一条命令整体启动。
9.2 示例 compose.yaml
yaml
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- redis
redis:
image: redis:7-alpine
ports:
- "6379:6379"
9.3 启动与停止
bash
docker compose up -d
docker compose ps
docker compose logs -f
docker compose down
10. VS Code 集成 Docker(一步步)
10.1 安装插件
- 安装
Docker扩展(Microsoft)。 - 可选安装
Dev Containers扩展。
10.2 在 VS Code 中管理容器
- 左侧打开 Docker 面板。
- 查看
Containers、Images、Volumes。 - 右键容器可执行 Start/Stop/Logs/Exec。
10.3 使用 Dev Container 开发
- 命令面板执行
Dev Containers: Add Dev Container Configuration Files...。 - 选择开发环境模板(如 Node/Python)。
- 执行
Dev Containers: Reopen in Container。 - 在容器内开发,确保团队环境一致。
11. 团队协作怎么用 Docker
11.1 标准协作流程
- 项目仓库包含
Dockerfile和compose.yaml。 - 新成员拉代码后执行:
bash
docker compose up -d
- 所有人用同一命令启动环境,减少环境差异问题。
- 合并前在容器内跑测试。
11.2 镜像版本管理建议
- Tag 使用语义化版本,如
v1.2.0。 - 同时保留
latest和版本 Tag。 - 禁止只用
latest不打版本。
11.3 配置与密钥管理
- 使用
.env管理环境变量。 .env不提交真实密钥(加到.gitignore)。- 提供
.env.example给团队参考。
12. 其他场景:一步步操作
场景 A:本地快速起数据库(MySQL)
bash
docker run -d \
--name local-mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=demo \
-p 3306:3306 \
mysql:8
操作步骤:
- 启动容器。
- 用数据库工具连接
localhost:3306。 - 停止时执行
docker stop local-mysql。
场景 B:前后端分离项目联调
- 前端和后端各写 Dockerfile。
- 用 compose 统一编排。
- 前端通过服务名访问后端(如
http://api:8080)。 - 一条命令启动联调环境:
docker compose up -d。
场景 C:CI 中自动构建并推镜像
- 代码 push 到主分支。
- CI 执行
docker build。 - 登录镜像仓库并
docker push。 - 部署系统拉取新镜像滚动更新。
场景 D:临时运行命令行工具
例如临时跑 Python:
bash
docker run --rm -it python:3.12-alpine python -V
场景 E:线上故障排查
- 查容器状态:
docker ps -a。 - 看日志:
docker logs -f <容器名>。 - 进容器排查:
docker exec -it <容器名> sh。 - 修复后重启:
docker restart <容器名>。
13. 常见问题与排查
Q1:端口被占用怎么办?
- 更换映射端口(如
-p 8081:80)。 - 或结束占用端口的进程。
Q2:容器一启动就退出?
- 看日志:
docker logs <容器名>。 - 检查启动命令和环境变量。
- 检查镜像入口命令是否正确。
Q3:磁盘越来越满?
bash
docker system df
docker system prune -f
Q4:容器里的数据重启后没了?
原因:没挂载 volume。
解决:使用 -v 或 compose 的 volumes。
14. 安全与规范建议
- 镜像尽量使用精简基础镜像(如 alpine)。
- 不要在镜像里写死密码和密钥。
- 容器尽量使用非 root 用户运行。
- 定期升级基础镜像,修复漏洞。
- 生产环境固定镜像版本,不直接用
latest。
15. 一页速查命令
bash
# 拉镜像
docker pull nginx:latest
# 启容器
docker run -d --name web -p 8080:80 nginx:latest
# 看状态/日志
docker ps
docker logs -f web
# 进容器
docker exec -it web sh
# 停止/删除
docker stop web
docker rm web
# Compose
docker compose up -d
docker compose ps
docker compose down