# ============================================================ # 学生管理系统 - 一键部署编排文件 # 服务组成: mysql(数据库) + backend(FastAPI:9090) + frontend(Nginx:80) # # 启动: docker compose up -d --build # 停止: docker compose down # 日志: docker compose logs -f backend # ============================================================ services: # ---------------- MySQL 8.0 数据库 ---------------- mysql: image: mysql:8.0 restart: unless-stopped command: - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci # 使用 mysql_native_password,兼容 aiomysql/PyMySQL 连接 - --default-authentication-plugin=mysql_native_password environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD:-123456} # 容器首次启动时自动创建该数据库(Tortoise 只建表,不会建库) MYSQL_DATABASE: ${DB_NAME:-student_system} TZ: Asia/Shanghai ports: # 若本机 3306 已被占用,把 .env 中 MYSQL_HOST_PORT 改为 13306 - "${MYSQL_HOST_PORT:-3306}:3306" volumes: - mysql_data:/var/lib/mysql healthcheck: test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -uroot -p$$MYSQL_ROOT_PASSWORD --silent"] interval: 10s timeout: 5s retries: 12 start_period: 40s networks: - student-net # ---------------- FastAPI 后端 ---------------- backend: build: context: ./fastapi-app dockerfile: Dockerfile image: student-system-backend:latest restart: unless-stopped environment: # 注意:host 用 compose 服务名 mysql,而不是 localhost DB_HOST: mysql DB_PORT: 3306 DB_NAME: ${DB_NAME:-student_system} DB_USER: ${DB_USER:-root} DB_PASSWORD: ${DB_PASSWORD:-123456} TZ: Asia/Shanghai volumes: # 上传文件持久化到宿主机 fastapi-app/files - ./fastapi-app/files:/app/files ports: - "${BACKEND_HOST_PORT:-9090}:9090" depends_on: mysql: condition: service_healthy networks: - student-net # ---------------- Vue 前端 + Nginx ---------------- frontend: build: context: ./vue dockerfile: Dockerfile image: student-system-frontend:latest restart: unless-stopped ports: - "${FRONTEND_HOST_PORT:-80}:80" depends_on: - backend networks: # nginx.conf 中反向代理目标为 http://backend:9090,二者必须在同一网络 - student-net volumes: mysql_data: name: student_mysql_data networks: student-net: name: student-net driver: bridge