# PACSONLINE Docker 容器化部署方案 基于 Docker Compose 的 MySQL 8.0、Redis、PHP-FPM 7.4、Nginx 一键部署方案,支持多项目统一管理和部署。 ## 系统架构 ``` ┌─────────────────────────────────────────────────────────────────┐ │ 宿主机 (Host) │ │ │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ Nginx (80, 443, 9600, 196xx) │ │ │ │ ├─ 19620 → zskk_new_manage (管理后台) │ │ │ │ ├─ 19602 → ris (RIS医生端前端) │ │ │ │ ├─ 19600 → zskk_new_server (RIS医生端后端API) │ │ │ │ ├─ 19603 → pacs (阅片器) │ │ │ │ └─ 9600 → API网关 (路由分发) │ │ │ └──────────────────────────────────────────────────────────┘ │ │ ↓ │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ PHP-FPM:9000 │ │ │ │ ├─ zskk_new_manage (ThinkPHP) │ │ │ │ └─ zskk_new_server (ThinkPHP) │ │ │ └──────────────────────────────────────────────────────────┘ │ │ ↓ │ │ ┌────────────────────┐ ┌──────────────────────────┐ │ │ │ MySQL:3306 │ │ Redis:6379 │ │ │ │ DB: pacsonline │ │ Auth: zskk@2025 │ │ │ └────────────────────┘ └──────────────────────────┘ │ │ │ │ Docker Network: app_network (bridge) │ └─────────────────────────────────────────────────────────────────┘ ``` ## 项目结构 ``` deploy/ ├── docker-compose.yml # Docker Compose 编排文件 ├── deploy.sh # 一键部署脚本 ├── README.md # 说明文档 │ ├── mysql/ │ ├── data/ # MySQL 数据持久化目录 │ ├── conf/ # MySQL 配置文件目录 │ └── init/ # MySQL 初始化 SQL 脚本目录 │ ├── redis/ │ ├── data/ # Redis 数据持久化目录 │ └── conf/ │ └── redis.conf # Redis 配置文件 │ ├── php-fpm/ │ ├── docker/ # PHP-FPM Dockerfile │ └── conf/ # PHP 配置文件目录 │ ├── nginx/ │ ├── conf/ # Nginx 配置目录 │ │ ├── default.conf # 主配置(加载子目录) │ │ ├── server.d/ # Server 块配置 │ │ │ ├── zskk-manage.conf # 管理后台配置 │ │ │ ├── zskk-server.conf # 后端API配置 │ │ │ ├── zskk-ris.conf # RIS前端配置 │ │ │ └── zskk-pacs.conf # PACS配置 │ │ ├── upstreams.d/ # Upstream 配置 │ │ │ ├── php-fpm.conf # PHP-FPM upstream │ │ │ ├── zskk-server.conf # 后端服务 upstream │ │ │ └── zskk-manage.conf # 管理服务 upstream │ │ └── out.d/ # 代理和路由配置 │ │ └── out.conf # API 网关配置 │ └── logs/ # Nginx 日志目录 │ ├── projects/ │ └── www/ # 项目代码目录 │ ├── zskk_new_manage/ # 管理后台 (ThinkPHP) │ ├── zskk_new_server/ # RIS后端API (ThinkPHP) │ ├── ris/ # RIS医生端前端 (Vue) │ └── pacs/ # PACS阅片器前端 │ └── images/ # Docker 镜像文件目录(离线部署用) ``` ## 服务配置 ### MySQL 8.0 - **容器名称**: `mysql` - **端口**: `3306` - **数据库**: `pacsonline` - **用户**: `zskk` - **密码**: `zskk@2025` - **Root 密码**: `Zskk@2025` - **认证插件**: `mysql_native_password` ### Redis - **容器名称**: `redis` - **端口**: `6379` - **密码**: `zskk@2025` - **持久化**: RDB + AOF ### PHP-FPM 7.4 - **容器名称**: `php_fpm` - **端口**: `9000` - **项目路径**: `/var/www/html` - **扩展**: MySQL, Redis, GD, etc. ### Nginx - **容器名称**: `nginx` - **镜像**: `nginx:alpine` ## 端口映射 | 端口 | 服务 | 说明 | |-------|----------------|-------------------------------| | 80 | Nginx | HTTP 默认端口 | | 443 | Nginx | HTTPS 端口 | | 3306 | MySQL | MySQL 数据库 | | 6379 | Redis | Redis 缓存 | | 9000 | PHP-FPM | PHP-FPM 服务(内部通信) | | 9600 | Nginx | API 网关(路由分发) | | 19600 | Nginx | RIS 后端 Server API | | 19602 | Nginx | RIS 医生端前端 | | 19603 | Nginx | PACS 阅片器前端 | | 19620 | Nginx | 管理后台 | ### API 网关路由规则 (端口 9600) ```nginx http://127.0.0.1:9600/ → zskk-manage (管理后台) http://127.0.0.1:9600/zskkapi/ → zskk-server (后端API) ``` ## 快速开始 ### 1. 启动所有服务 ```bash cd /path/to/deploy docker compose up -d ``` ### 2. 检查服务状态 ```bash docker compose ps ``` 预期输出: ``` NAME IMAGE STATUS mysql mysql:8.0 Up nginx nginx:alpine Up php_fpm php-fpm-mysql:7.4-arm64 Up redis my-redis:v1.0 Up ``` ### 3. 查看日志 ```bash # 查看所有服务日志 docker compose logs -f # 查看特定服务日志 docker compose logs -f nginx docker compose logs -f php_fpm ``` ### 4. 访问服务 - 管理后台: http://127.0.0.1:19620 - RIS 医生端: http://127.0.0.1:19602 - PACS 阅片器: http://127.0.0.1:19603 ## 项目配置 ### 配置数据库连接 每个 PHP 项目需要配置正确的数据库连接信息。 #### zskk_new_manage 配置 编辑 `projects/www/zskk_new_manage/.env`: ```ini [database] hostname = mysql database = pacsonline username = zskk password = zskk@2025 hostport = 3306 ``` #### zskk_new_server 配置 编辑 `projects/www/zskk_new_server/.env`: ```ini [database] hostname = mysql database = pacsonline username = zskk password = zskk@2025 hostport = 3306 ``` **重要提示**: - ✅ `hostname` 必须使用容器名 `mysql`(不是 `127.0.0.1` 或 `localhost`) - ✅ 用户名必须是 `zskk`(不是 `pacsonline` 或其他) - ✅ 端口必须是 `3306` ### Nginx 配置说明 #### default.conf - 主配置加载器 ```nginx # 加载所有子目录中的配置文件 include /etc/nginx/conf.d/server.d/*.conf; include /etc/nginx/conf.d/upstreams.d/*.conf; include /etc/nginx/conf.d/out.d/*.conf; ``` #### server.d/ - 各项目 Server 配置 每个项目的 server 块独立配置,便于管理。 #### upstreams.d/ - Upstream 配置 定义后端服务地址: - `php-fpm.conf`: PHP-FPM 服务地址 `php_fpm:9000` - `zskk-server.conf`: 后端 API 地址 `127.0.0.1:19600` - `zskk-manage.conf`: 管理后台地址 `127.0.0.1:19620` **关键配置**: ```nginx upstream php-fpm { server php_fpm:9000; # 必须使用容器名,不能用 127.0.0.1 } ``` ## 常用命令 ### 服务管理 ```bash # 启动服务 docker compose up -d # 停止服务 docker compose stop # 重启服务 docker compose restart # 重启单个服务 docker compose restart nginx docker compose restart php_fpm # 停止并删除容器(保留数据) docker compose down # 停止并删除容器和数据卷 docker compose down -v ``` ### 查看状态和日志 ```bash # 查看容器状态 docker ps # 查看服务状态 docker compose ps # 查看实时日志 docker compose logs -f # 查看特定服务日志 docker logs nginx --tail 100 -f docker logs php_fpm --tail 100 -f # 查看 Nginx 访问日志 tail -f nginx/logs/access.log # 查看应用错误日志 docker exec php_fpm tail -f /var/www/html/zskk_new_manage/runtime/log/*/**.log docker exec php_fpm tail -f /var/www/html/zskk_new_server/server/runtime/log/**.log ``` ### 进入容器 ```bash # 进入 Nginx 容器 docker exec -it nginx sh # 进入 PHP-FPM 容器 docker exec -it php_fpm bash # 进入 MySQL 容器 docker exec -it mysql bash # 进入 Redis 容器 docker exec -it redis sh ``` ### 数据库操作 ```bash # 连接 MySQL docker exec -it mysql mysql -uzskk -pzskk@2025 -D pacsonline # 使用 root 连接 docker exec -it mysql mysql -uroot -pZskk@2025 # 导出数据库 docker exec mysql mysqldump -uzskk -pzskk@2025 pacsonline > backup.sql # 导入数据库 docker exec -i mysql mysql -uzskk -pzskk@2025 pacsonline < backup.sql # 查看数据库列表 docker exec mysql mysql -uroot -pZskk@2025 -e "SHOW DATABASES;" ``` ### Redis 操作 ```bash # 连接 Redis docker exec -it redis redis-cli -a zskk@2025 # 测试连接 docker exec redis redis-cli -a zskk@2025 ping # 查看 Redis 信息 docker exec redis redis-cli -a zskk@2025 INFO # 清空 Redis 缓存 docker exec redis redis-cli -a zskk@2025 FLUSHALL ``` ### Nginx 配置测试 ```bash # 测试 Nginx 配置语法 docker exec nginx nginx -t # 重新加载 Nginx 配置(不重启) docker exec nginx nginx -s reload # 查看 Nginx 配置 docker exec nginx nginx -T ``` ## 故障排查 ### 1. 容器无法启动 **检查容器状态:** ```bash docker compose ps docker logs ``` **常见问题:** - 端口被占用:`lsof -i:` 或 `netstat -tulnp | grep ` - 权限问题:检查数据目录权限 `ls -la mysql/data redis/data` - 配置错误:检查 docker-compose.yml 语法 ### 2. Nginx 无法启动 **查看错误日志:** ```bash docker logs nginx tail -50 nginx/logs/error.log ``` **常见错误及解决:** #### 错误:`host not found in upstream` ``` nginx: [emerg] host not found in upstream "xxx" ``` **原因**:upstream 配置中的主机名不存在 **解决**:检查 `nginx/conf/upstreams.d/*.conf`,确保 upstream 名称和服务名称匹配 #### 错误:`open() failed (2: No such file or directory)` ``` nginx: [emerg] open() "/data/logs/nginx/xxx.log" failed ``` **原因**:日志路径不存在 **解决**:修改配置文件中的日志路径为 `/var/log/nginx/xxx.log` #### 错误:`unexpected "}"` ``` nginx: [emerg] unexpected "}" in /etc/nginx/conf.d/xxx.conf:10 ``` **原因**:配置文件语法错误(通常是缺少分号) **解决**:检查配置文件每行末尾是否有分号 ### 3. PHP 项目 500 错误 **查看 PHP 错误日志:** ```bash # 查看 PHP-FPM 日志 docker logs php_fpm # 查看项目运行日志 docker exec php_fpm tail -100 /var/www/html/zskk_new_manage/runtime/log/202510/21.log ``` **常见错误:** #### 数据库连接失败 ``` SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name does not resolve ``` **原因**:.env 文件中数据库主机名配置错误 **解决**: 1. 检查 `.env` 文件中 `hostname = mysql`(必须是容器名) 2. 确认用户名密码正确 3. 重启 PHP-FPM: `docker compose restart php_fpm` #### 数据库用户权限错误 ``` SQLSTATE[HY000] [1045] Access denied for user 'xxx'@'xxx' (using password: YES) ``` **原因**:数据库用户名或密码错误 **解决**:检查 `.env` 文件配置是否与 docker-compose.yml 一致 #### 类属性不存在 ``` 类的属性不存在:app\api\model\doctor\DoctorModel->message_voice ``` **原因**:数据库表结构缺少字段,或模型定义不完整 **解决**:检查数据库表结构,或更新模型类 ### 4. 端口访问不通 **检查端口映射:** ```bash docker ps --format "table {{.Names}}\t{{.Ports}}" ``` **检查容器网络:** ```bash docker network inspect deploy_app_network ``` **测试端口连通性:** ```bash # 测试 Web 端口 curl -I http://127.0.0.1:19620 # 测试 MySQL 端口 telnet 127.0.0.1 3306 # 测试 Redis 端口 telnet 127.0.0.1 6379 ``` ### 5. 修改配置后不生效 **重启容器使配置生效:** ```bash # Nginx 配置修改后 docker compose restart nginx # PHP 配置或项目 .env 修改后 docker compose restart php_fpm # docker-compose.yml 修改后(端口映射、环境变量等) docker compose up -d ``` ## 配置修改指南 ### 修改数据库密码 1. 编辑 `docker-compose.yml`: ```yaml services: mysql: environment: MYSQL_ROOT_PASSWORD: 新密码 MYSQL_PASSWORD: 新密码 ``` 2. 更新项目 `.env` 文件 3. 重建容器: ```bash docker compose down docker volume rm deploy_mysql_data # 仅首次修改密码时需要 docker compose up -d ``` ### 添加新项目 1. 将项目代码放入 `projects/www/新项目名/` 2. 在 `nginx/conf/server.d/` 创建新的配置文件 3. 如需代理,在 `nginx/conf/upstreams.d/` 添加 upstream 配置 4. 重启 Nginx:`docker compose restart nginx` ### 修改 Nginx 日志路径 所有 server 配置中的日志路径必须使用 `/var/log/nginx/`,因为这是容器内挂载的日志目录: ```nginx access_log /var/log/nginx/项目名.access.log; error_log /var/log/nginx/项目名.error.log; ``` ## 数据备份 ### MySQL 备份 ```bash # 备份单个数据库 docker exec mysql mysqldump -uzskk -pzskk@2025 pacsonline > backup_$(date +%Y%m%d).sql # 备份所有数据库 docker exec mysql mysqldump -uroot -pZskk@2025 --all-databases > backup_all_$(date +%Y%m%d).sql # 定时备份(添加到 crontab) 0 2 * * * cd /path/to/deploy && docker exec mysql mysqldump -uzskk -pzskk@2025 pacsonline > backups/backup_$(date +\%Y\%m\%d).sql ``` ### Redis 备份 ```bash # 触发 RDB 快照 docker exec redis redis-cli -a zskk@2025 BGSAVE # 备份 RDB 文件 docker cp redis:/data/dump.rdb ./backup_redis_$(date +%Y%m%d).rdb # 备份 AOF 文件 docker cp redis:/data/appendonly.aof ./backup_redis_$(date +%Y%m%d).aof ``` ### 项目代码备份 ```bash # 备份整个项目目录 tar -czf projects_backup_$(date +%Y%m%d).tar.gz projects/ # 备份配置文件 tar -czf config_backup_$(date +%Y%m%d).tar.gz nginx/ php-fpm/ mysql/conf/ redis/conf/ ``` ## 性能优化 ### PHP-FPM 优化 编辑 `php-fpm/conf/www.conf`(如果存在): ```ini pm = dynamic pm.max_children = 50 pm.start_servers = 10 pm.min_spare_servers = 5 pm.max_spare_servers = 20 pm.max_requests = 500 ``` ### Nginx 优化 在 server 配置中添加: ```nginx # 启用 Gzip 压缩 gzip on; gzip_types text/plain text/css application/json application/javascript; # 静态文件缓存 location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; add_header Cache-Control "public, immutable"; } ``` ### MySQL 优化 在 `mysql/conf/my.cnf` 中添加: ```ini [mysqld] max_connections = 200 innodb_buffer_pool_size = 256M innodb_log_file_size = 64M ``` ## 安全建议 1. **修改默认密码**:生产环境必须修改所有默认密码 2. **限制端口访问**:使用防火墙限制数据库端口仅允许内部访问 3. **启用 HTTPS**:配置 SSL 证书,启用 HTTPS 4. **定期备份**:设置定时备份任务 5. **更新镜像**:定期更新 Docker 镜像以获取安全补丁 6. **日志审计**:定期检查日志文件,监控异常访问 ## 离线部署 ### 导出镜像 ```bash # 导出所有镜像 docker save -o images/all-images.tar \ mysql:8.0 \ my-redis:v1.0 \ php-fpm-mysql:7.4-arm64 \ nginx:alpine ``` ### 导入镜像 ```bash # 导入镜像 docker load -i images/all-images.tar # 启动服务 docker compose up -d ``` ## 技术支持 - Docker 文档: https://docs.docker.com/ - Docker Compose 文档: https://docs.docker.com/compose/ - Nginx 文档: https://nginx.org/en/docs/ - PHP 文档: https://www.php.net/docs.php - MySQL 文档: https://dev.mysql.com/doc/ - Redis 文档: https://redis.io/documentation ## 版本信息 - Docker Compose: 2.0+ - MySQL: 8.0 - Redis: 7 - PHP-FPM: 7.4 - Nginx: Alpine - 创建日期: 2025-10-15 - 最后更新: 2025-10-21 ## 许可证 内部项目,仅供团队使用。