Files
djangoadmin-wiki/DjangoAdmin_FastAPI_NaiveVue/zh/volume6/docker.md
T
2026-09-14 10:33:29 +08:00

207 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Docker容器化
## 概述
提供完整的 Docker 容器化方案,包括 Dockerfile 镜像构建和 docker-compose.yml 编排配置,支持一键部署后端服务。
:::tip 容器化优势
- 环境一致性:消除"在我机器上能跑"的问题
- 快速部署:一条命令启动完整服务
- 资源隔离:应用与宿主机环境解耦
:::
## Dockerfile 详解
项目根目录 `Dockerfile` 完整内容:
```dockerfile
# 基础镜像:Python 3.11-slim(python:3.9 已于 2025-10 停止安全更新)
FROM python:3.11-slim
LABEL maintainer="管理员"
# 环境变量:禁用 Python 缓存和字节码写入
ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1
ENV TZ Asia/Shanghai
# 国内镜像源加速(使用 https,避免 http 明文传输被篡改)
RUN pip config set global.index-url https://mirrors.aliyun.com/pypi/simple
RUN pip config set install.trusted-host mirrors.aliyun.com
# 工作目录
WORKDIR /data/apps
# 先拷贝依赖清单并安装,利用 Docker 层缓存(源码变更不会触发重复安装依赖)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 拷贝全部源码(.dockerignore 已排除上传目录/缓存/测试等,避免镜像膨胀)
COPY . /data/apps
# 暴露应用端口
EXPOSE 8031
# 启动命令:FastAPI 为 ASGI 应用,使用 uvicorn
# 绑定 0.0.0.0 使 docker run -p 8031:8031 可直接访问;
# compose 场景下由 docker-compose.yml 的 command 覆盖
CMD ["uvicorn", "main:app", "--app-dir", "src", "--host", "0.0.0.0", "--port", "8031"]
```
:::tip 构建优化
Dockerfile 将 `requirements.txt` 和源码分两步 COPY,利用 Docker 层缓存机制——源码变更不会触发依赖重新安装,显著加快构建速度。镜像源使用 HTTPS 协议,防止明文传输被篡改。
:::
## docker-compose.yml 结构
```yaml
version: '3.7'
services:
fastapi_naivevue: # 服务名称
image: fastapi_naivevue # 镜像名称
container_name: fastapi_naivevue # 容器名称
build: # 构建配置
context: ./ # 构建上下文路径
dockerfile: Dockerfile # Dockerfile 文件名
restart: always # 重启策略:总是重启
network_mode: host # 网络模式:使用宿主机网络
ports: # 端口映射
- 8031:8031 # 宿主机端口:容器端口
volumes: # 数据卷挂载
- $PWD/uploads:/data/apps/uploads # 上传文件持久化存储
env_file: # 环境变量文件
- .env # 加载 .env 文件中的环境变量
command: python src/main.py # 容器启动命令
logging: # 日志配置
driver: "json-file" # 日志驱动:json-file
options:
max-size: "500m" # 单个日志文件最大大小
max-file: "10" # 保留日志文件数量
```
### 配置说明
| 配置项 | 说明 |
|--------|------|
| `restart: always` | 容器异常退出后自动重启 |
| `network_mode: host` | 使用宿主机网络,可直接访问 localhost 的 MySQL/Redis |
| `volumes` | 挂载上传目录,确保文件持久化 |
| `env_file` | 从 `.env` 注入环境变量 |
| `logging` | 日志轮转:单文件最大 500MB,保留 10 个文件 |
:::warning 网络模式说明
`host` 模式下 `ports` 映射被忽略(容器直接使用宿主机端口)。若改为 `bridge` 网络,需将 `DB_HOST`/`REDIS_HOST` 指向 `host.docker.internal` 并启用端口映射。
:::
## 常用操作命令
### 构建与启动
```bash
# 构建镜像并启动
docker-compose up --build
# 后台启动
docker-compose up --build -d
# 仅构建镜像
docker-compose build
```
### 日常管理
```bash
# 查看运行状态
docker-compose ps
# 查看日志
docker-compose logs -f fastapi_naivevue
# 停止服务
docker-compose down
# 重启服务
docker-compose restart fastapi_naivevue
# 进入容器
docker exec -it fastapi_naivevue bash
```
### 查看容器资源
```bash
# 查看容器资源占用
docker stats fastapi_naivevue
# 查看容器日志大小
docker inspect --format='{{.LogPath}}' fastapi_naivevue
```
## 环境变量注入
Docker 通过 `env_file: .env` 将宿主机的 `.env` 文件注入容器。容器内的应用通过 `os.getenv()` 读取,与非 Docker 部署完全一致。
:::tip .env 文件位置
`.env` 文件应放在 `docker-compose.yml` 同级目录下。部署时目录结构:
```
/data/apps/djangoadmin
├── .env # 环境变量
├── Dockerfile
├── docker-compose.yml
├── requirements.txt
├── src/
└── uploads/ # 上传文件目录(挂载卷)
```
:::
## 上传文件持久化
通过 `volumes` 将容器内的上传目录挂载到宿主机,确保容器重建后文件不丢失:
```yaml
volumes:
- $PWD/uploads:/data/apps/uploads
```
## 日志管理
容器日志使用 `json-file` 驱动,配置轮转防止磁盘占满:
```yaml
logging:
driver: "json-file"
options:
max-size: "500m" # 单文件最大 500MB
max-file: "10" # 保留 10 个文件
```
:::tip 生产环境日志
生产环境建议将日志输出到 stdout/stderr,由 Docker 日志驱动统一收集。如需集中式日志,可配置 `fluentd` 或 `syslog` 驱动对接 ELK/Loki。
:::
## 多容器编排(扩展)
如需同时部署前端和 Nginx,可扩展 `docker-compose.yml`:
```yaml
services:
fastapi_naivevue:
# ... 后端配置 ...
nginx:
image: nginx:alpine # Nginx 镜像(轻量版)
ports: # 端口映射
- 80:80 # HTTP
- 443:443 # HTTPS
volumes: # 挂载配置
- ./nginx.conf:/etc/nginx/conf.d/default.conf # Nginx 配置文件
- ./dist:/usr/share/nginx/html # 前端构建产物
depends_on: # 依赖服务
- fastapi_naivevue # 等待后端服务启动
```
## 总结
Docker 容器化通过 Dockerfile 构建镜像、docker-compose.yml 编排服务,实现一键部署。关键点:利用层缓存优化构建速度、host 网络模式简化数据库连接、volumes 持久化上传文件、日志轮转防磁盘占满。生产环境建议配合 Nginx 反向代理使用。