spacsonline容器化部署

gengjunfang 787bf46d9b 更新项目文件 1 mese fa
images 787bf46d9b 更新项目文件 1 mese fa
mysql 787bf46d9b 更新项目文件 1 mese fa
nginx 787bf46d9b 更新项目文件 1 mese fa
redis 787bf46d9b 更新项目文件 1 mese fa
README.md a9a437b798 更新项目文件 1 mese fa
deploy.sh 787bf46d9b 更新项目文件 1 mese fa
docker-compose.yml 787bf46d9b 更新项目文件 1 mese fa

README.md

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)

http://127.0.0.1:9600/             → zskk-manage (管理后台)
http://127.0.0.1:9600/zskkapi/     → zskk-server (后端API)

快速开始

1. 启动所有服务

cd /path/to/deploy
docker compose up -d

2. 检查服务状态

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. 查看日志

# 查看所有服务日志
docker compose logs -f

# 查看特定服务日志
docker compose logs -f nginx
docker compose logs -f php_fpm

4. 访问服务

项目配置

配置数据库连接

每个 PHP 项目需要配置正确的数据库连接信息。

zskk_new_manage 配置

编辑 projects/www/zskk_new_manage/.env:

[database]
hostname = mysql
database = pacsonline
username = zskk
password = zskk@2025
hostport = 3306

zskk_new_server 配置

编辑 projects/www/zskk_new_server/.env:

[database]
hostname = mysql
database = pacsonline
username = zskk
password = zskk@2025
hostport = 3306

重要提示

  • hostname 必须使用容器名 mysql(不是 127.0.0.1localhost
  • ✅ 用户名必须是 zskk(不是 pacsonline 或其他)
  • ✅ 端口必须是 3306

Nginx 配置说明

default.conf - 主配置加载器

# 加载所有子目录中的配置文件
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

关键配置

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 操作

# 连接 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 配置测试

# 测试 Nginx 配置语法
docker exec nginx nginx -t

# 重新加载 Nginx 配置(不重启)
docker exec nginx nginx -s reload

# 查看 Nginx 配置
docker exec nginx nginx -T

故障排查

1. 容器无法启动

检查容器状态:

docker compose ps
docker logs <container_name>

常见问题:

  • 端口被占用:lsof -i:<port>netstat -tulnp | grep <port>
  • 权限问题:检查数据目录权限 ls -la mysql/data redis/data
  • 配置错误:检查 docker-compose.yml 语法

2. Nginx 无法启动

查看错误日志:

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 错误日志:

# 查看 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. 端口访问不通

检查端口映射:

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

5. 修改配置后不生效

重启容器使配置生效:

# Nginx 配置修改后
docker compose restart nginx

# PHP 配置或项目 .env 修改后
docker compose restart php_fpm

# docker-compose.yml 修改后(端口映射、环境变量等)
docker compose up -d

配置修改指南

修改数据库密码

  1. 编辑 docker-compose.yml

    services:
    mysql:
    environment:
      MYSQL_ROOT_PASSWORD: 新密码
      MYSQL_PASSWORD: 新密码
    
    1. 更新项目 .env 文件
    2. 重建容器: 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/,因为这是容器内挂载的日志目录:

access_log /var/log/nginx/项目名.access.log;
error_log /var/log/nginx/项目名.error.log;

数据备份

MySQL 备份

# 备份单个数据库
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 备份

# 触发 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 优化

编辑 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

Nginx 优化

在 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 优化

mysql/conf/my.cnf 中添加:

[mysqld]
max_connections = 200
innodb_buffer_pool_size = 256M
innodb_log_file_size = 64M

安全建议

  1. 修改默认密码:生产环境必须修改所有默认密码
  2. 限制端口访问:使用防火墙限制数据库端口仅允许内部访问
  3. 启用 HTTPS:配置 SSL 证书,启用 HTTPS
  4. 定期备份:设置定时备份任务
  5. 更新镜像:定期更新 Docker 镜像以获取安全补丁
  6. 日志审计:定期检查日志文件,监控异常访问

离线部署

导出镜像

# 导出所有镜像
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

技术支持

版本信息

  • Docker Compose: 2.0+
  • MySQL: 8.0
  • Redis: 7
  • PHP-FPM: 7.4
  • Nginx: Alpine
  • 创建日期: 2025-10-15
  • 最后更新: 2025-10-21

许可证

内部项目,仅供团队使用。