|
|
hai 1 mes | |
|---|---|---|
| images | hai 1 mes | |
| mysql | hai 1 mes | |
| nginx | hai 1 mes | |
| redis | hai 1 mes | |
| README.md | hai 1 mes | |
| deploy.sh | hai 1 mes | |
| docker-compose.yml | hai 1 mes |
基于 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 镜像文件目录(离线部署用)
mysql3306pacsonlinezskkzskk@2025Zskk@2025mysql_native_passwordredis6379zskk@2025php_fpm9000/var/www/htmlnginxnginx: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 | 管理后台 |
http://127.0.0.1:9600/ → zskk-manage (管理后台)
http://127.0.0.1:9600/zskkapi/ → zskk-server (后端API)
cd /path/to/deploy
docker compose up -d
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
# 查看所有服务日志
docker compose logs -f
# 查看特定服务日志
docker compose logs -f nginx
docker compose logs -f php_fpm
每个 PHP 项目需要配置正确的数据库连接信息。
编辑 projects/www/zskk_new_manage/.env:
[database]
hostname = mysql
database = pacsonline
username = zskk
password = zskk@2025
hostport = 3306
编辑 projects/www/zskk_new_server/.env:
[database]
hostname = mysql
database = pacsonline
username = zskk
password = zskk@2025
hostport = 3306
重要提示:
hostname 必须使用容器名 mysql(不是 127.0.0.1 或 localhost)zskk(不是 pacsonline 或其他)3306# 加载所有子目录中的配置文件
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 块独立配置,便于管理。
定义后端服务地址:
php-fpm.conf: PHP-FPM 服务地址 php_fpm:9000zskk-server.conf: 后端 API 地址 127.0.0.1:19600zskk-manage.conf: 管理后台地址 127.0.0.1:19620关键配置:
upstream php-fpm {
server php_fpm:9000; # 必须使用容器名,不能用 127.0.0.1
}
# 启动服务
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
# 查看容器状态
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
# 进入 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
# 连接 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
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 配置语法
docker exec nginx nginx -t
# 重新加载 Nginx 配置(不重启)
docker exec nginx nginx -s reload
# 查看 Nginx 配置
docker exec nginx nginx -T
检查容器状态:
docker compose ps
docker logs <container_name>
常见问题:
lsof -i:<port> 或 netstat -tulnp | grep <port>ls -la mysql/data redis/data查看错误日志:
docker logs nginx
tail -50 nginx/logs/error.log
常见错误及解决:
host not found in upstreamnginx: [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
原因:配置文件语法错误(通常是缺少分号) 解决:检查配置文件每行末尾是否有分号
查看 PHP 错误日志:
# 查看 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 文件中数据库主机名配置错误 解决:
.env 文件中 hostname = mysql(必须是容器名)docker compose restart php_fpmSQLSTATE[HY000] [1045] Access denied for user 'xxx'@'xxx' (using password: YES)
原因:数据库用户名或密码错误
解决:检查 .env 文件配置是否与 docker-compose.yml 一致
类的属性不存在:app\api\model\doctor\DoctorModel->message_voice
原因:数据库表结构缺少字段,或模型定义不完整 解决:检查数据库表结构,或更新模型类
检查端口映射:
docker ps --format "table {{.Names}}\t{{.Ports}}"
检查容器网络:
docker network inspect deploy_app_network
测试端口连通性:
# 测试 Web 端口
curl -I http://127.0.0.1:19620
# 测试 MySQL 端口
telnet 127.0.0.1 3306
# 测试 Redis 端口
telnet 127.0.0.1 6379
重启容器使配置生效:
# Nginx 配置修改后
docker compose restart nginx
# PHP 配置或项目 .env 修改后
docker compose restart php_fpm
# docker-compose.yml 修改后(端口映射、环境变量等)
docker compose up -d
编辑 docker-compose.yml:
services:
mysql:
environment:
MYSQL_ROOT_PASSWORD: 新密码
MYSQL_PASSWORD: 新密码
.env 文件bash
docker compose down
docker volume rm deploy_mysql_data # 仅首次修改密码时需要
docker compose up -d
projects/www/新项目名/nginx/conf/server.d/ 创建新的配置文件nginx/conf/upstreams.d/ 添加 upstream 配置docker compose restart nginx所有 server 配置中的日志路径必须使用 /var/log/nginx/,因为这是容器内挂载的日志目录:
access_log /var/log/nginx/项目名.access.log;
error_log /var/log/nginx/项目名.error.log;
# 备份单个数据库
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
# 触发 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
# 备份整个项目目录
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/conf/www.conf(如果存在):
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 500
在 server 配置中添加:
# 启用 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/conf/my.cnf 中添加:
[mysqld]
max_connections = 200
innodb_buffer_pool_size = 256M
innodb_log_file_size = 64M
# 导出所有镜像
docker save -o images/all-images.tar \
mysql:8.0 \
my-redis:v1.0 \
php-fpm-mysql:7.4-arm64 \
nginx:alpine
# 导入镜像
docker load -i images/all-images.tar
# 启动服务
docker compose up -d
内部项目,仅供团队使用。