Files
djangoadmin-wiki/DjangoAdmin_Django_EleVue/zh/volume6/docker.md
T
2026-09-12 23:12:15 +08:00

187 lines
5.3 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
# 基础镜像:Python 3.12-slim
FROM python:3.12-slim
LABEL maintainer="管理员"
# 环境变量:禁用 Python 缓存和字节码写入
ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1
ENV TZ Asia/Shanghai
# 国内镜像源加速
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
# 拷贝全部源码
COPY . /data/apps
# 暴露应用端口
EXPOSE 8000
# 启动命令:Django 使用 gunicorn + wsgi
CMD ["gunicorn", "application.wsgi:application", "--bind", "0.0.0.0:8000", "--workers", "4"]
```
:::tip 构建优化
Dockerfile 将 `requirements.txt` 和源码分两步 COPY,利用 Docker 层缓存机制——源码变更不会触发依赖重新安装,显著加快构建速度。
:::
## docker-compose.yml 结构
```yaml
version: '3.7'
services:
djangoadmin: # 服务名称
image: djangoadmin # 镜像名称
container_name: djangoadmin # 容器名称
build: # 构建配置
context: ./ # 构建上下文路径
dockerfile: Dockerfile # Dockerfile 文件名
restart: always # 重启策略:总是重启
network_mode: host # 网络模式:使用宿主机网络
ports: # 端口映射
- 8000:8000 # 宿主机端口:容器端口
volumes: # 数据卷挂载
- $PWD/public/uploads:/data/apps/public/uploads # 上传文件持久化存储
- $PWD/public/static:/data/apps/public/static # 静态文件持久化存储
env_file: # 环境变量文件
- .env # 加载 .env 文件中的环境变量
command: python manage.py runserver 0.0.0.0:8000 # 容器启动命令(开发模式)
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` 网络,需将 `DATABASE_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 djangoadmin
# 停止服务
docker-compose down
# 重启服务
docker-compose restart djangoadmin
# 进入容器
docker exec -it djangoadmin bash
```
### 数据库迁移(容器内)
```bash
# 执行数据库迁移
docker-compose exec djangoadmin python manage.py migrate
# 生成迁移文件
docker-compose exec djangoadmin python manage.py makemigrations
```
## 多容器编排(扩展)
如需同时部署 MySQL、Redis 和 Nginx,可扩展 `docker-compose.yml`:
```yaml
services:
djangoadmin:
# ... 后端配置 ...
depends_on:
- mysql
- redis
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: djangoadmin.django.elevue
volumes:
- mysql_data:/var/lib/mysql
ports:
- 3306:3306
redis:
image: redis:7-alpine
command: redis-server --requirepass 123456
volumes:
- redis_data:/data
ports:
- 6379:6379
nginx:
image: nginx:alpine
ports:
- 80:80
- 443:443
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
- ./ui/dist:/usr/share/nginx/html
depends_on:
- djangoadmin
volumes:
mysql_data:
redis_data:
```
## 总结
Docker 容器化通过 Dockerfile 构建镜像、docker-compose.yml 编排服务,实现一键部署。关键点:利用层缓存优化构建速度、host 网络模式简化数据库连接、volumes 持久化上传文件、日志轮转防磁盘占满。生产环境建议配合 Nginx 反向代理使用。