# docker完整封装项目 **Repository Path**: in_320253062/docker-finall ## Basic Information - **Project Name**: docker完整封装项目 - **Description**: docker+mysql+python web+nignx(+gitlabCI/CD) - **Primary Language**: Python - **License**: Unlicense - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-04 - **Last Updated**: 2025-11-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Hotel Management System 酒店管理系统基于Flask框架开发,使用Docker容器化部署,包含MySQL数据库、Flask应用和Nginx反向代理。 ## 目录 - [项目结构](#项目结构) - [技术栈](#技术栈) - [快速开始](#快速开始) - [服务说明](#服务说明) - [管理员账户](#管理员账户) - [数据持久化](#数据持久化) - [环境变量](#环境变量) - [GitLab CI/CD](#gitlab-cicd) - [部署说明](#部署说明) - [CentOS 7 部署指南](#centos-7-部署指南) - [功能特性](#功能特性) - [故障排除](#故障排除) ## 项目结构 ``` . ├── app.py # Flask主应用 ├── config.py # 配置文件 ├── Dockerfile # Flask应用Docker镜像构建文件 ├── docker-compose.yml # Docker编排文件 ├── nginx.conf # Nginx配置文件 ├── requirements.txt # Python依赖包 ├── docker-init-db.py # 数据库初始化脚本 ├── static/ # 静态资源文件 ├── templates/ # HTML模板文件 └── README.md # 说明文档 ``` ## 技术栈 - **后端**: Flask (Python 3.8) - **前端**: HTML5, CSS3, JavaScript, Tailwind CSS - **数据库**: MySQL 5.7 - **Web服务器**: Nginx 1.20-alpine - **WSGI服务器**: Gunicorn - **容器化**: Docker, Docker Compose - **CI/CD**: GitLab CI/CD ## 快速开始 ### 启动项目 ```bash # 在项目根目录下执行 docker-compose up -d ``` ### 访问应用 - 通过Nginx访问: http://localhost - 直接访问Flask应用: http://localhost:5000 - 访问MySQL数据库: localhost:3306 ### 管理员账户 - 用户名: hyadmin - 密码: admin123 ## 服务说明 ### MySQL数据库 - 镜像: mysql:5.7 -服务名称: mysql - 端口: 3306 - 数据库名: hotel_management - 用户名: hotel_user - 密码: hotel_password - root密码: MySQL@123 ### Flask应用 - 镜像: 基于Python 3.8-slim自定义镜像 - 端口: 5000 - 使用Gunicorn作为WSGI服务器 ### Nginx - 镜像: nginx:1.20-alpine - 端口: 80 - 提供静态文件服务和反向代理 ## 数据持久化 以下数据会持久化存储: - MySQL数据: mysql_data卷 - 应用备份数据: app_data卷 - 应用日志: app_logs卷 - 上传文件: app_uploads卷 ## 环境变量 可以在docker-compose.yml中修改以下环境变量: - SECRET_KEY: Flask密钥 - DEBUG: 调试模式开关 - DB_HOST: 数据库主机地址 - DB_USER: 数据库用户名 - DB_PASSWORD: 数据库密码 - DB_NAME: 数据库名称 ## GitLab CI/CD 本项目配置了完整的GitLab CI/CD流水线,包含以下阶段: ### 流水线阶段 1. **Build阶段**: 构建Docker镜像 2. **Test阶段**: 运行代码质量检查和单元测试 3. **Deploy阶段**: 部署到不同环境 4. **Cleanup阶段**: 清理资源 ### 环境分支策略 - `develop`分支: 自动部署到开发环境 - `main`分支: 手动部署到测试和生产环境 - 合并请求: 运行测试但不部署 ### 部署环境 1. **开发环境** (`development`) - 自动部署当推送到`develop`分支 - 用于日常开发和功能测试 2. **测试环境** (`testing`) - 手动触发部署 - 用于集成测试和用户验收测试 3. **生产环境** (`production`) - 手动触发部署 - 用于正式生产环境 ### 触发方式 - **自动触发**: 推送代码到`develop`或`main`分支 - **手动触发**: 通过GitLab界面手动运行部署任务 - **合并请求**: 创建或更新合并请求时自动运行测试 ## 部署说明 ### 本地部署(centos7)[先启动镜像构建-启动服务-停止服务(报错的话,要停止并删除] ```bash # docker-compose镜像构建 docker-compose up --build # 启动所有服务 docker-compose up -d # 查看服务状态 docker-compose ps # 查看服务日志 docker-compose logs ``` ### 停止服务 ```bash # 停止所有服务 docker-compose down # 停止并删除所有数据卷 docker-compose down -v ``` ## CentOS 7 部署指南 ### 系统要求 - CentOS 7.6 或更高版本 - 至少 2GB 内存 - 至少 10GB 可用磁盘空间 - 具有 sudo 权限的用户 ### 环境准备 #### 1. 安装Docker ```bash # 更新系统 sudo yum update -y # 安装必要的工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加Docker仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装Docker sudo yum install -y docker-ce docker-ce-cli containerd.io # 启动并设置开机自启 sudo systemctl start docker sudo systemctl enable docker # 验证安装 docker --version ``` #### 2. 安装Docker Compose ```bash # 下载Docker Compose sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # 添加执行权限 sudo chmod +x /usr/local/bin/docker-compose # 创建软链接 sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose # 验证安装 docker-compose --version ``` #### 3. 配置用户权限(可选) ```bash # 将当前用户添加到docker组 sudo usermod -aG docker $USER # 重新登录以使组权限生效 ``` ### 使用部署脚本 项目提供了专门针对CentOS 7的部署脚本: ```bash # 添加执行权限 chmod +x deploy_centos7.sh # 运行部署脚本 ./deploy_centos7.sh ``` ### 手动部署步骤 1. 克隆或下载项目代码到服务器 2. 进入项目目录 `ops/steam1.0` 3. 运行部署命令: ```bash docker-compose up -d ``` 4. 等待服务启动完成(约30-60秒) 5. 检查服务状态: ```bash docker-compose ps ``` ### 访问应用 部署完成后,可以通过以下地址访问应用: - 前台页面: http://your-server-ip - 管理后台: http://your-server-ip/admin - 数据库: your-server-ip:3306 ### 管理员账户 使用以下管理员账户登录: - **超级管理员**: - 用户名: hyadmin - 密码: admin123 - **普通管理员**: - 用户名: admin - 密码: admin123 ### 停止服务 ```bash # 停止所有服务但保留数据 docker-compose down # 停止服务并删除所有数据(谨慎使用) docker-compose down -v ``` ## 功能特性 ### 用户功能 1. **房间浏览与搜索** - 按价格、类型、容纳人数筛选房间 - 查看房间详细信息和设施 - 查看房间图片和相关推荐 2. **在线预订** - 选择房间和入住日期 - 实时检查房间可用性 - 计算预订总价 - 确认预订信息 3. **个人中心** - 查看我的预订记录 - 查看账单和支付状态 - 提交问题反馈 - 下载发票 4. **账户管理** - 用户注册和登录 - 个人信息管理 - 安全退出 ### 管理员功能 1. **房间管理** - 添加、编辑、删除房间 - 管理房间图片和设施 - 设置房间状态和价格 2. **预订管理** - 查看所有预订记录 - 更新预订状态(待确认、已确认、已入住、已退房、已取消) - 查看预订详情 - 批量操作预订 - 导出预订数据 3. **账单管理** - 查看所有账单 - 更新账单状态 - 删除已支付账单 4. **用户管理** - 查看用户列表 - 更新用户角色 - 删除用户(无关联预订的用户) 5. **反馈管理** - 查看用户反馈 - 更新反馈状态 - 处理用户问题 6. **内容管理** - 管理网站基本信息 - 管理轮播图 - 管理关于我们内容 7. **数据报表** - 查看运营报表 - 图表展示入住率、收入等数据 - 导出报表数据 8. **系统运维** - 系统健康状态监控 - 日志查看和清理 - 数据库备份和恢复 - 系统维护 ### 预订功能优化 1. **用户端优化** - 实时房间可用性检查 - 预订确认页面 - 预订详情查看 - AJAX异步检查房间状态 - 改进的用户界面和体验 2. **管理员端优化** - 预订详情页面 - 批量操作功能 - 数据导出功能 - 预订统计信息 - 更完善的预订状态管理 ## 故障排除 ### 常见问题 1. **服务启动失败** - 检查Docker服务是否正常运行 - 查看容器日志: `docker-compose logs` 2. **端口占用** - 修改docker-compose.yml中的端口映射 - 检查是否有其他服务占用了80或3306端口 3. **权限问题** - 确保运行用户有足够权限 - 可能需要将用户添加到docker组 4. **数据库连接失败** - 检查数据库服务是否正常启动 - 验证环境变量配置是否正确 - 在Docker环境中,确保使用正确的服务名称而非localhost - 检查MySQL容器是否健康运行 ### 数据库连接问题详解 如果遇到类似以下错误: ``` Can't connect to MySQL server on 'localhost:3306' (111) ``` 这是由于在Docker容器环境中,服务间的通信需要使用服务名称而不是localhost。 #### 解决方案: 1. **使用Docker Compose环境变量**(推荐) 在Docker环境中,应用程序会自动使用docker-compose.yml中定义的环境变量: ```yaml environment: - DB_HOST=mysql # 使用服务名称'mysql'而不是'localhost' ``` 2. **手动设置环境变量** 如果直接运行应用而不使用Docker Compose,需要设置正确的环境变量: ```bash export MYSQL_HOST=mysql # 或者实际的数据库服务器地址 export MYSQL_USER=hotel_user export MYSQL_PASSWORD=hotel_password export MYSQL_DB=hotel_management ``` 3. **检查数据库服务状态** 确保MySQL服务正在运行并且健康: ```bash docker-compose ps # 查看所有服务状态 docker-compose logs mysql # 查看MySQL服务日志 ``` 4. **网络连接测试** 可以进入web容器测试网络连接: ```bash docker-compose exec web bash ping mysql # 测试是否能解析服务名称 telnet mysql 3306 # 测试端口连通性 ``` 5. **数据库配置文件检查** 确保[config.py](file:///d:/daima/cmcms/docker-project/ops/steam1.0/config.py)中的配置正确: ```python class Config: MYSQL_HOST = os.environ.get('MYSQL_HOST') or 'mysql' # 应该是'mysql'而不是'localhost' MYSQL_USER = os.environ.get('MYSQL_USER') or 'hotel_user' MYSQL_PASSWORD = os.environ.get('MYSQL_PASSWORD') or 'hotel_password' MYSQL_DB = os.environ.get('MYSQL_DB') or 'hotel_management' ``` 注意:在当前配置中,默认值存在一个多余空格的问题,应该修正为: ```python MYSQL_HOST = os.environ.get('MYSQL_HOST') or 'mysql' # 修正默认值和服务名称一致 ``` 6. **重启服务** 在修改配置后,重启相关服务: ```bash docker-compose down docker-compose up -d ```