|
|
@@ -1,126 +1,237 @@
|
|
|
-# pacsonline 容器化 部署方案
|
|
|
+# PACSONLINE Docker 容器化部署方案
|
|
|
|
|
|
-基于 Docker Compose 的 MySQL 8.0 、 Redis 7 、 php-fpm 7.4 、nginx 一键部署方案,支持离线部署。
|
|
|
+基于 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-test/
|
|
|
-├── docker-compose.yml # Docker Compose 编排文件
|
|
|
-├── deploy.sh # 一键部署脚本
|
|
|
-├── README.md # 说明文档
|
|
|
-├── mysql-init.sql # MySQL 初始化脚本(用户自定义)
|
|
|
-├── mysql-image.tar # MySQL 8.0 原始镜像包
|
|
|
-├── redis-image.tar # Redis 7 镜像包
|
|
|
+deploy/
|
|
|
+├── docker-compose.yml # Docker Compose 编排文件
|
|
|
+├── deploy.sh # 一键部署脚本
|
|
|
+├── README.md # 说明文档
|
|
|
+│
|
|
|
├── mysql/
|
|
|
-│ ├── init/ # MySQL 初始化 SQL 脚本目录(可选)
|
|
|
-│ └── conf/ # MySQL 配置文件目录(可选)
|
|
|
+│ ├── data/ # MySQL 数据持久化目录
|
|
|
+│ ├── conf/ # MySQL 配置文件目录
|
|
|
+│ └── init/ # MySQL 初始化 SQL 脚本目录
|
|
|
+│
|
|
|
├── redis/
|
|
|
-│ └── redis.conf # Redis 配置文件
|
|
|
-└── data/
|
|
|
- ├── mysql/ # MySQL 数据持久化目录
|
|
|
- └── redis/ # 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
|
|
|
-- **容器名称**: mysql8_deploy
|
|
|
-- **端口**: 3306
|
|
|
-- **数据库**: ris
|
|
|
-- **用户**: ris
|
|
|
-- **密码**: zskk8888
|
|
|
-- **Root 密码**: zskk8888
|
|
|
-- **初始化**: 部署时自动执行 `mysql-init.sql` 脚本(如果存在)
|
|
|
-
|
|
|
-### Redis 7
|
|
|
-- **容器名称**: redis7_deploy
|
|
|
-- **端口**: 6379
|
|
|
-- **密码**: zskk8888
|
|
|
-- **持久化**: 启用 RDB + AOF 双重持久化
|
|
|
-- **最大内存**: 256MB(可在 redis.conf 中修改)
|
|
|
+- **容器名称**: `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
|
|
|
-# 1. 进入项目目录
|
|
|
-cd deploy-test
|
|
|
+cd /path/to/deploy
|
|
|
+docker compose up -d
|
|
|
+```
|
|
|
|
|
|
-# 2. (可选)放置自定义的 MySQL 初始化脚本
|
|
|
-# 将你的 SQL 文件命名为 mysql-init.sql 放在当前目录
|
|
|
+### 2. 检查服务状态
|
|
|
|
|
|
-# 3. 运行部署脚本
|
|
|
-./deploy.sh
|
|
|
+```bash
|
|
|
+docker compose ps
|
|
|
```
|
|
|
|
|
|
-**说明**:
|
|
|
-- 如果存在 `mysql-init.sql` 文件,脚本会自动执行该文件初始化数据库
|
|
|
-- 如果不存在,则跳过初始化步骤
|
|
|
+预期输出:
|
|
|
+```
|
|
|
+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
|
|
|
-# 1. 进入项目目录
|
|
|
-cd deploy-test
|
|
|
+# 查看所有服务日志
|
|
|
+docker compose logs -f
|
|
|
|
|
|
-# 2. 启动服务
|
|
|
-docker compose up -d
|
|
|
+# 查看特定服务日志
|
|
|
+docker compose logs -f nginx
|
|
|
+docker compose logs -f php_fpm
|
|
|
+```
|
|
|
|
|
|
-# 3. 查看服务状态
|
|
|
-docker compose ps
|
|
|
+### 4. 访问服务
|
|
|
|
|
|
-# 4. 查看日志
|
|
|
-docker compose logs -f
|
|
|
-```
|
|
|
+- 管理后台: http://127.0.0.1:19620
|
|
|
+- RIS 医生端: http://127.0.0.1:19602
|
|
|
+- PACS 阅片器: http://127.0.0.1:19603
|
|
|
|
|
|
-## 离线部署
|
|
|
+## 项目配置
|
|
|
|
|
|
-### 准备镜像包(在有网络的机器上)
|
|
|
+### 配置数据库连接
|
|
|
|
|
|
-```bash
|
|
|
-# 1. 拉取并导出 MySQL 原始镜像
|
|
|
-docker pull mysql:8.0
|
|
|
-docker save -o mysql-image.tar mysql:8.0
|
|
|
+每个 PHP 项目需要配置正确的数据库连接信息。
|
|
|
+
|
|
|
+#### zskk_new_manage 配置
|
|
|
|
|
|
-# 2. 拉取并导出 Redis 镜像
|
|
|
-docker pull redis:7-alpine
|
|
|
-docker save -o redis-image.tar redis:7-alpine
|
|
|
+编辑 `projects/www/zskk_new_manage/.env`:
|
|
|
|
|
|
-# 3. 打包部署文件
|
|
|
-tar -czf deploy-package.tar.gz \
|
|
|
- docker-compose.yml \
|
|
|
- deploy.sh \
|
|
|
- README.md \
|
|
|
- mysql/ \
|
|
|
- redis/ \
|
|
|
- mysql-image.tar \
|
|
|
- redis-image.tar \
|
|
|
- mysql-init.sql # 如果有自定义初始化脚本
|
|
|
+```ini
|
|
|
+[database]
|
|
|
+hostname = mysql
|
|
|
+database = pacsonline
|
|
|
+username = zskk
|
|
|
+password = zskk@2025
|
|
|
+hostport = 3306
|
|
|
```
|
|
|
|
|
|
-### 目标服务器部署(无网络环境)
|
|
|
+#### zskk_new_server 配置
|
|
|
|
|
|
-```bash
|
|
|
-# 1. 传输部署包到目标服务器
|
|
|
-# 使用 scp、U盘等方式
|
|
|
+编辑 `projects/www/zskk_new_server/.env`:
|
|
|
|
|
|
-# 2. 解压部署包
|
|
|
-tar -xzf deploy-package.tar.gz
|
|
|
-cd deploy-test
|
|
|
+```ini
|
|
|
+[database]
|
|
|
+hostname = mysql
|
|
|
+database = pacsonline
|
|
|
+username = zskk
|
|
|
+password = zskk@2025
|
|
|
+hostport = 3306
|
|
|
+```
|
|
|
|
|
|
-# 3. (可选)放置自定义的 MySQL 初始化脚本
|
|
|
-# 如果在打包时没有包含,可以在此步骤添加 mysql-init.sql
|
|
|
+**重要提示**:
|
|
|
+- ✅ `hostname` 必须使用容器名 `mysql`(不是 `127.0.0.1` 或 `localhost`)
|
|
|
+- ✅ 用户名必须是 `zskk`(不是 `pacsonline` 或其他)
|
|
|
+- ✅ 端口必须是 `3306`
|
|
|
|
|
|
-# 4. 运行部署脚本
|
|
|
-./deploy.sh
|
|
|
+### 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;
|
|
|
```
|
|
|
|
|
|
-**说明**:
|
|
|
-- 镜像文件:`mysql-image.tar` (~757MB) + `redis-image.tar` (~41MB)
|
|
|
-- 部署脚本会自动检测并加载镜像文件
|
|
|
-- 如果存在 `mysql-init.sql`,会自动执行数据库初始化
|
|
|
+#### 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
|
|
|
+}
|
|
|
+```
|
|
|
|
|
|
## 常用命令
|
|
|
|
|
|
@@ -136,208 +247,390 @@ 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
|
|
|
+# 查看实时日志
|
|
|
+docker compose logs -f
|
|
|
|
|
|
-# 查看 MySQL 日志
|
|
|
-docker compose logs -f mysql
|
|
|
+# 查看特定服务日志
|
|
|
+docker logs nginx --tail 100 -f
|
|
|
+docker logs php_fpm --tail 100 -f
|
|
|
|
|
|
-# 查看 Redis 日志
|
|
|
-docker compose logs -f redis
|
|
|
+# 查看 Nginx 访问日志
|
|
|
+tail -f nginx/logs/access.log
|
|
|
|
|
|
-# 查看最近 100 行日志
|
|
|
-docker compose logs --tail=100
|
|
|
+# 查看应用错误日志
|
|
|
+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
|
|
|
```
|
|
|
|
|
|
-### 连接服务
|
|
|
-
|
|
|
-**MySQL 连接**
|
|
|
+### 进入容器
|
|
|
|
|
|
```bash
|
|
|
-# 方法 1: 从容器内连接
|
|
|
-docker exec -it mysql8_deploy mysql -uris -pzskk8888 -D ris
|
|
|
+# 进入 Nginx 容器
|
|
|
+docker exec -it nginx sh
|
|
|
+
|
|
|
+# 进入 PHP-FPM 容器
|
|
|
+docker exec -it php_fpm bash
|
|
|
|
|
|
-# 方法 2: 从容器内使用 root 连接
|
|
|
-docker exec -it mysql8_deploy mysql -uroot -pzskk8888
|
|
|
+# 进入 MySQL 容器
|
|
|
+docker exec -it mysql bash
|
|
|
|
|
|
-# 方法 3: 从宿主机连接(需安装 mysql 客户端)
|
|
|
-mysql -h 127.0.0.1 -P 3306 -uris -pzskk8888 -D ris
|
|
|
+# 进入 Redis 容器
|
|
|
+docker exec -it redis sh
|
|
|
```
|
|
|
|
|
|
-**Redis 连接**
|
|
|
+### 数据库操作
|
|
|
|
|
|
```bash
|
|
|
-# 方法 1: 从容器内连接
|
|
|
-docker exec -it redis7_deploy redis-cli -a zskk8888
|
|
|
+# 连接 MySQL
|
|
|
+docker exec -it mysql mysql -uzskk -pzskk@2025 -D pacsonline
|
|
|
|
|
|
-# 方法 2: 从宿主机连接(需安装 redis-cli)
|
|
|
-redis-cli -h 127.0.0.1 -p 6379 -a zskk8888
|
|
|
+# 使用 root 连接
|
|
|
+docker exec -it mysql mysql -uroot -pZskk@2025
|
|
|
|
|
|
-# 测试连接
|
|
|
-docker exec -it redis7_deploy redis-cli -a zskk8888 ping
|
|
|
-# 应该返回: PONG
|
|
|
-```
|
|
|
+# 导出数据库
|
|
|
+docker exec mysql mysqldump -uzskk -pzskk@2025 pacsonline > backup.sql
|
|
|
|
|
|
-### 数据备份
|
|
|
+# 导入数据库
|
|
|
+docker exec -i mysql mysql -uzskk -pzskk@2025 pacsonline < backup.sql
|
|
|
|
|
|
-**MySQL 备份**
|
|
|
+# 查看数据库列表
|
|
|
+docker exec mysql mysql -uroot -pZskk@2025 -e "SHOW DATABASES;"
|
|
|
+```
|
|
|
+
|
|
|
+### Redis 操作
|
|
|
|
|
|
```bash
|
|
|
-# 备份单个数据库
|
|
|
-docker exec mysql8_deploy mysqldump -uroot -pzskk8888 ris > backup_ris.sql
|
|
|
+# 连接 Redis
|
|
|
+docker exec -it redis redis-cli -a zskk@2025
|
|
|
|
|
|
-# 备份所有数据库
|
|
|
-docker exec mysql8_deploy mysqldump -uroot -pzskk8888 --all-databases > backup_all.sql
|
|
|
+# 测试连接
|
|
|
+docker exec redis redis-cli -a zskk@2025 ping
|
|
|
+
|
|
|
+# 查看 Redis 信息
|
|
|
+docker exec redis redis-cli -a zskk@2025 INFO
|
|
|
|
|
|
-# 恢复数据库
|
|
|
-docker exec -i mysql8_deploy mysql -uroot -pzskk8888 ris < backup_ris.sql
|
|
|
+# 清空 Redis 缓存
|
|
|
+docker exec redis redis-cli -a zskk@2025 FLUSHALL
|
|
|
```
|
|
|
|
|
|
-**Redis 备份**
|
|
|
+### Nginx 配置测试
|
|
|
|
|
|
```bash
|
|
|
-# 手动触发 RDB 快照
|
|
|
-docker exec redis7_deploy redis-cli -a zskk8888 BGSAVE
|
|
|
+# 测试 Nginx 配置语法
|
|
|
+docker exec nginx nginx -t
|
|
|
|
|
|
-# 备份 RDB 文件
|
|
|
-docker cp redis7_deploy:/data/dump.rdb ./backup_redis_dump.rdb
|
|
|
+# 重新加载 Nginx 配置(不重启)
|
|
|
+docker exec nginx nginx -s reload
|
|
|
|
|
|
-# 备份 AOF 文件
|
|
|
-docker cp redis7_deploy:/data/appendonly.aof ./backup_redis_aof.aof
|
|
|
+# 查看 Nginx 配置
|
|
|
+docker exec nginx nginx -T
|
|
|
```
|
|
|
|
|
|
-## 自定义配置
|
|
|
+## 故障排查
|
|
|
|
|
|
-### 修改 MySQL 配置
|
|
|
+### 1. 容器无法启动
|
|
|
|
|
|
-在 `mysql/conf/` 目录下创建 `.cnf` 配置文件,例如 `my.cnf`:
|
|
|
+**检查容器状态:**
|
|
|
+```bash
|
|
|
+docker compose ps
|
|
|
+docker logs <container_name>
|
|
|
+```
|
|
|
|
|
|
-```ini
|
|
|
-[mysqld]
|
|
|
-max_connections = 200
|
|
|
-character-set-server = utf8mb4
|
|
|
-collation-server = utf8mb4_unicode_ci
|
|
|
+**常见问题:**
|
|
|
+- 端口被占用:`lsof -i:<port>` 或 `netstat -tulnp | grep <port>`
|
|
|
+- 权限问题:检查数据目录权限 `ls -la mysql/data redis/data`
|
|
|
+- 配置错误:检查 docker-compose.yml 语法
|
|
|
+
|
|
|
+### 2. Nginx 无法启动
|
|
|
+
|
|
|
+**查看错误日志:**
|
|
|
+```bash
|
|
|
+docker logs nginx
|
|
|
+tail -50 nginx/logs/error.log
|
|
|
```
|
|
|
|
|
|
-### 修改 Redis 配置
|
|
|
+**常见错误及解决:**
|
|
|
+
|
|
|
+#### 错误:`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
|
|
|
+```
|
|
|
+**原因**:配置文件语法错误(通常是缺少分号)
|
|
|
+**解决**:检查配置文件每行末尾是否有分号
|
|
|
|
|
|
-编辑 `redis/redis.conf` 文件,修改后重启容器:
|
|
|
+### 3. PHP 项目 500 错误
|
|
|
|
|
|
+**查看 PHP 错误日志:**
|
|
|
```bash
|
|
|
-docker compose restart redis
|
|
|
+# 查看 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 一致
|
|
|
|
|
|
-### MySQL 初始化脚本
|
|
|
+#### 类属性不存在
|
|
|
+```
|
|
|
+类的属性不存在:app\api\model\doctor\DoctorModel->message_voice
|
|
|
+```
|
|
|
+**原因**:数据库表结构缺少字段,或模型定义不完整
|
|
|
+**解决**:检查数据库表结构,或更新模型类
|
|
|
|
|
|
-**方法 1: 使用 mysql-init.sql(推荐)**
|
|
|
+### 4. 端口访问不通
|
|
|
|
|
|
-将你的初始化 SQL 文件命名为 `mysql-init.sql` 放在项目根目录,部署脚本会自动执行:
|
|
|
+**检查端口映射:**
|
|
|
+```bash
|
|
|
+docker ps --format "table {{.Names}}\t{{.Ports}}"
|
|
|
+```
|
|
|
|
|
|
+**检查容器网络:**
|
|
|
```bash
|
|
|
-# 部署时自动执行
|
|
|
-./deploy.sh
|
|
|
+docker network inspect deploy_app_network
|
|
|
```
|
|
|
|
|
|
-**方法 2: 使用 mysql/init/ 目录**
|
|
|
+**测试端口连通性:**
|
|
|
+```bash
|
|
|
+# 测试 Web 端口
|
|
|
+curl -I http://127.0.0.1:19620
|
|
|
+
|
|
|
+# 测试 MySQL 端口
|
|
|
+telnet 127.0.0.1 3306
|
|
|
|
|
|
-将 `.sql` 文件放入 `mysql/init/` 目录,容器首次启动时会自动执行(按字母顺序)。
|
|
|
+# 测试 Redis 端口
|
|
|
+telnet 127.0.0.1 6379
|
|
|
+```
|
|
|
|
|
|
-**注意**:
|
|
|
-- 方法 1 每次部署都会执行(适合测试环境)
|
|
|
-- 方法 2 只在首次启动时执行,如需重新初始化需删除数据卷:
|
|
|
+### 5. 修改配置后不生效
|
|
|
|
|
|
+**重启容器使配置生效:**
|
|
|
```bash
|
|
|
-# 删除数据卷
|
|
|
-docker compose down -v
|
|
|
+# Nginx 配置修改后
|
|
|
+docker compose restart nginx
|
|
|
|
|
|
-# 重新启动
|
|
|
+# PHP 配置或项目 .env 修改后
|
|
|
+docker compose restart php_fpm
|
|
|
+
|
|
|
+# docker-compose.yml 修改后(端口映射、环境变量等)
|
|
|
docker compose up -d
|
|
|
```
|
|
|
|
|
|
-## 多架构支持
|
|
|
+## 配置修改指南
|
|
|
+
|
|
|
+### 修改数据库密码
|
|
|
|
|
|
-如果需要在不同 CPU 架构的服务器上部署(x86_64、ARM64),需分别构建镜像:
|
|
|
+1. 编辑 `docker-compose.yml`:
|
|
|
+```yaml
|
|
|
+services:
|
|
|
+ mysql:
|
|
|
+ environment:
|
|
|
+ MYSQL_ROOT_PASSWORD: 新密码
|
|
|
+ MYSQL_PASSWORD: 新密码
|
|
|
+```
|
|
|
|
|
|
+2. 更新项目 `.env` 文件
|
|
|
+3. 重建容器:
|
|
|
```bash
|
|
|
-# 在 x86_64 机器上构建
|
|
|
-docker buildx build --platform linux/amd64 -t my-mysql:v1.0-amd64 .
|
|
|
-docker save -o mysql-redis-amd64.tar my-mysql:v1.0-amd64 my-redis:v1.0-amd64
|
|
|
+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`
|
|
|
|
|
|
-# 在 ARM64 机器上构建
|
|
|
-docker buildx build --platform linux/arm64 -t my-mysql:v1.0-arm64 .
|
|
|
-docker save -o mysql-redis-arm64.tar my-mysql:v1.0-arm64 my-redis:v1.0-arm64
|
|
|
+### 修改 Nginx 日志路径
|
|
|
+
|
|
|
+所有 server 配置中的日志路径必须使用 `/var/log/nginx/`,因为这是容器内挂载的日志目录:
|
|
|
+```nginx
|
|
|
+access_log /var/log/nginx/项目名.access.log;
|
|
|
+error_log /var/log/nginx/项目名.error.log;
|
|
|
```
|
|
|
|
|
|
-## 故障排查
|
|
|
+## 数据备份
|
|
|
|
|
|
-### 容器无法启动
|
|
|
+### MySQL 备份
|
|
|
|
|
|
```bash
|
|
|
-# 查看详细日志
|
|
|
-docker compose logs mysql
|
|
|
-docker compose logs redis
|
|
|
+# 备份单个数据库
|
|
|
+docker exec mysql mysqldump -uzskk -pzskk@2025 pacsonline > backup_$(date +%Y%m%d).sql
|
|
|
|
|
|
-# 检查端口占用
|
|
|
-lsof -i:3306
|
|
|
-lsof -i:6379
|
|
|
+# 备份所有数据库
|
|
|
+docker exec mysql mysqldump -uroot -pZskk@2025 --all-databases > backup_all_$(date +%Y%m%d).sql
|
|
|
|
|
|
-# 检查权限
|
|
|
-ls -la data/mysql
|
|
|
-ls -la data/redis
|
|
|
+# 定时备份(添加到 crontab)
|
|
|
+0 2 * * * cd /path/to/deploy && docker exec mysql mysqldump -uzskk -pzskk@2025 pacsonline > backups/backup_$(date +\%Y\%m\%d).sql
|
|
|
```
|
|
|
|
|
|
-### MySQL 连接失败
|
|
|
+### Redis 备份
|
|
|
|
|
|
```bash
|
|
|
-# 检查容器状态
|
|
|
-docker compose ps
|
|
|
+# 触发 RDB 快照
|
|
|
+docker exec redis redis-cli -a zskk@2025 BGSAVE
|
|
|
|
|
|
-# 测试网络连接
|
|
|
-docker exec mysql8_deploy mysqladmin -uroot -pzskk8888 ping
|
|
|
+# 备份 RDB 文件
|
|
|
+docker cp redis:/data/dump.rdb ./backup_redis_$(date +%Y%m%d).rdb
|
|
|
|
|
|
-# 检查用户权限
|
|
|
-docker exec -it mysql8_deploy mysql -uroot -pzskk8888 -e "SELECT user, host FROM mysql.user;"
|
|
|
+# 备份 AOF 文件
|
|
|
+docker cp redis:/data/appendonly.aof ./backup_redis_$(date +%Y%m%d).aof
|
|
|
```
|
|
|
|
|
|
-### Redis 连接失败
|
|
|
+### 项目代码备份
|
|
|
|
|
|
```bash
|
|
|
-# 测试 Redis 连接
|
|
|
-docker exec redis7_deploy redis-cli -a zskk8888 ping
|
|
|
+# 备份整个项目目录
|
|
|
+tar -czf projects_backup_$(date +%Y%m%d).tar.gz projects/
|
|
|
|
|
|
-# 检查密码配置
|
|
|
-docker exec redis7_deploy redis-cli -a zskk8888 CONFIG GET requirepass
|
|
|
+# 备份配置文件
|
|
|
+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. **修改默认密码**: 部署到生产环境前,请修改 `docker-compose.yml` 中的所有密码
|
|
|
-2. **限制访问**: 如果不需要外部访问,可以移除端口映射或使用防火墙限制
|
|
|
-3. **定期备份**: 建议定期备份数据库和 Redis 数据
|
|
|
-4. **更新镜像**: 定期更新到最新的稳定版本以获取安全补丁
|
|
|
+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/
|
|
|
-- MySQL 官方文档: https://dev.mysql.com/doc/
|
|
|
-- Redis 官方文档: https://redis.io/documentation
|
|
|
+- 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: 3.8+
|
|
|
+- Docker Compose: 2.0+
|
|
|
- MySQL: 8.0
|
|
|
-- Redis: 7-alpine
|
|
|
+- Redis: 7
|
|
|
+- PHP-FPM: 7.4
|
|
|
+- Nginx: Alpine
|
|
|
- 创建日期: 2025-10-15
|
|
|
+- 最后更新: 2025-10-21
|
|
|
+
|
|
|
+## 许可证
|
|
|
+
|
|
|
+内部项目,仅供团队使用。
|