Files
ECShopX_docker/php74/README.md
2025-12-29 22:29:50 +08:00

560 lines
13 KiB
Markdown
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ECShopX Docker 开发环境
ECShopX 采用前后端分离的方式开发,代码结构由后端 API 和多个前端组成。
- **后端 API**:基于 Lumen 开发,包含 Web、Scheduler、Worker
- **前端**管理端、小程序、PC端、H5端
## 📋 目录
- [准备工作](#准备工作)
- [快速开始](#快速开始)
- [详细步骤](#详细步骤)
- [脚本说明](#脚本说明)
- [常见问题](#常见问题)
- [访问地址](#访问地址)
## 🚀 快速开始
### 1. 克隆项目
```bash
git clone https://github.com/shopex/ecshopx-open-docker.git
cd ecshopx-open-docker/php74
cp .env.example .env
```
### 2. 初始化子项目代码
```bash
chmod +x setup.sh init-api.sh
./setup.sh
```
### 3. 配置 Docker Desktop 文件共享重要macOS 用户必须操作)
```bash
# 打开 Docker Desktop → Settings → Resources → File Sharing
# 添加项目所在目录(如 /Users/你的用户名/data/ecshopx-open-docker/php74
```
### 4. 启动 Docker 容器
```bash
docker-compose up -d
```
### 5. 一键初始化 API包含数据库迁移
```bash
./init-api.sh
```
### 6. 访问应用
```bash
# 管理后台: http://127.0.0.1:8080
# 移动端: http://127.0.0.1:8081
# PC端: http://127.0.0.1:8082
```
## 📦 准备工作
### 1. 系统要求
- Docker DesktopmacOS/Windows或 Docker EngineLinux
- Docker Compose
- Git
- 至少 4GB 可用内存
- 至少 10GB 可用磁盘空间
Docker 会自动处理不同 CPU 架构的兼容性问题,无需手动配置。
### 2. 克隆项目
```bash
git clone https://github.com/shopex/ecshopx-open-docker.git
cd ecshopx-open-docker/php74
```
### 3. macOS 用户重要配置 ⚠️
**Docker Desktop 文件共享配置(必须操作)**
1. 打开 Docker Desktop 应用
2. 点击右上角 **⚙️ Settings**
3. 进入 **Resources****File Sharing**
4. 添加项目所在目录(例如:`/Users/你的用户名/data/ecshopx-open-docker/php74`
5. 点击 **Apply & Restart**
> **为什么需要这一步?**
> macOS 的 Docker Desktop 默认只允许访问某些目录。如果不配置文件共享,容器内将看不到挂载的文件,导致应用无法正常运行。
## 📖 详细步骤
### 第一步:初始化代码
#### 方式一:使用 setup.sh 自动拉取(推荐)
```bash
chmod +x setup.sh
./setup.sh
```
运行脚本后会交互式询问是否拉取子项目代码:
-**Y/y****回车** → 自动从 GitHub 拉取所有子项目
-**N/n** → 跳过拉取,使用本地已有的代码
#### 方式二:手动放置代码
如果你已经下载了代码包,可以手动复制到对应目录:
- `管理端`代码 → `ECShopX_admin-frontend/` 目录
- `API端`代码 → `ECShopX/` 目录
- `PC端`代码 → `ECShopX_desktop-frontend/` 目录
- `H5端`代码 → `ECShopX_mobile-frontend/` 目录
#### 完成后的目录结构
```
php74/
├── .env # Docker Compose 环境变量(需创建)
├── docker-compose.yml # Docker 编排配置
├── setup.sh # 子项目代码初始化脚本
├── init-api.sh # API 服务一键初始化脚本
├── config/ # 配置文件目录
│ ├── nginx/
│ └── php/
├── ECShopX/ # 后端 API 代码
│ ├── app/
│ ├── bootstrap/
│ ├── config/
│ ├── .env # API 配置(自动生成)
│ └── ...
├── ECShopX_admin-frontend/ # 管理端前端代码
├── ECShopX_desktop-frontend/ # PC端前端代码
└── ECShopX_mobile-frontend/ # H5端前端代码
```
### 第二步:创建 Docker Compose 环境变量
在 php74 目录创建 `.env` 文件:
```bash
cp .env.example .env
```
> **说明**:这个 `.env` 文件用于 docker-compose.yml 中的卷映射配置。使用相对路径使项目更便于移动。
### 第三步:启动 Docker 容器
```bash
# 后台启动所有服务
docker-compose up -d
# 查看容器状态
docker-compose ps
# 查看日志(可选)
docker-compose logs -f
```
> **首次启动说明**
> - 第一次启动需要拉取 Docker 镜像,可能需要等待几分钟
> - 镜像地址:`shopexhub/php:ecx-7.4.32-fpm-alpine3.16`
> - 如果拉取失败,可能需要配置 Docker 镜像加速或使用代理
### 第四步:一键初始化 API推荐
使用 `init-api.sh` 脚本一键完成所有配置:
```bash
chmod +x init-api.sh
./init-api.sh
```
**脚本会自动完成以下操作**
1. ✅ 检查容器运行状态
2. ✅ 复制 `.env.full``.env`(如果不存在)
3. ✅ 验证文件挂载是否正常
4. ✅ 安装 Composer 依赖(使用阿里云镜像加速)
5. ✅ 安装 Supervisor、Curl、Vim
6. ✅ 配置并启动 Supervisor
7. ✅ 设置存储目录权限
8. ✅ 自动配置数据库和 Redis 连接
9. ✅ 创建数据库
10. ✅ 生成应用密钥
11. ✅ 运行数据库迁移
整个过程约需 3-5 分钟,完成后即可直接使用。
### 第五步:手动配置(可选,如果不使用 init-api.sh
如果你想手动配置,可以按照以下步骤操作:
#### 1. 进入容器
```bash
docker exec -it ecshopx-api sh
cd /data/httpd
```
#### 2. 配置 `.env` 文件
```bash
# 复制配置文件
cp .env.full .env
# 编辑配置
vi .env
```
修改以下配置项:
```env
# 数据库配置
DB_CONNECTION=default
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=ecshopx
DB_USERNAME=root
DB_PASSWORD=root
# Redis 配置
REDIS_CLIENT=predis
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=123456
```
#### 3. 安装依赖
```bash
# 配置 Composer 镜像
php composer.phar config repo.packagist composer https://mirrors.aliyun.com/composer/
# 安装依赖(需要较大内存)
php -d memory_limit=-1 composer.phar install --optimize-autoloader
```
#### 4. 创建数据库
```bash
# 退出容器
exit
# 进入 MySQL 容器创建数据库
docker exec ecshopx-open-docker_mysql_1 mysql -uroot -proot -e \
"CREATE DATABASE IF NOT EXISTS ecshopx CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
```
#### 5. 初始化数据库
```bash
# 重新进入 API 容器
docker exec -it ecshopx-api sh
cd /data/httpd
# 生成应用密钥
php artisan key:generate
# 运行数据库迁移
php artisan doctrine:migrations:migrate
```
### 第六步:编译前端代码(可选)
如果需要开发前端,需要在宿主机安装 Node.js 并编译:
```bash
# 进入前端项目目录
cd ECShopX_admin-frontend
# 安装依赖
npm install
# 开发模式
npm run dev
# 生产构建
npm run build
```
详细步骤请参考各前端项目的 README.md。
## 🌐 访问地址
服务启动后,可以通过以下地址访问:
| 服务 | 地址 | 说明 |
|------|------|------|
| **管理后台** | http://127.0.0.1:8080 | 商城管理端 |
| **移动端** | http://127.0.0.1:8081 | H5 移动端 |
| **PC端** | http://127.0.0.1:8082 | PC 桌面端 |
| **后端 API** | http://127.0.0.1:8080/api | RESTful API |
| **phpMyAdmin** | http://127.0.0.1:8083 | 数据库管理工具 |
### 数据库连接信息
| 配置项 | 值 |
|--------|-----|
| 主机 | `mysql` (容器内) / `127.0.0.1:3306` (宿主机) |
| 用户名 | `root` |
| 密码 | `root` |
| 数据库 | `ecshopx` |
### Redis 连接信息
| 配置项 | 值 |
|--------|-----|
| 主机 | `redis` (容器内) / `127.0.0.1:6379` (宿主机) |
| 密码 | `123456` |
| 数据库 | `0` |
## 🛠 脚本说明
### setup.sh - 子项目代码初始化
**功能**:自动从 GitHub 克隆所有子项目代码
**使用方法**
```bash
chmod +x setup.sh
./setup.sh
```
**工作流程**
1. 交互式询问是否拉取代码
2. 检查各子项目目录是否已存在
3. 如果不存在,则从 GitHub 克隆
4. 如果已存在,则跳过
**克隆的子项目**
- `ECShopX` - 后端 API
- `ECShopX_admin-frontend` - 管理端前端
- `ECShopX_desktop-frontend` - PC端前端
- `ECShopX_mobile-frontend` - H5端前端
### init-api.sh - API 服务一键初始化
**功能**:自动完成 API 服务的所有初始化配置
**使用方法**
```bash
chmod +x init-api.sh
./init-api.sh
```
**详细功能**
| 步骤 | 说明 | 技术细节 |
|------|------|----------|
| 检查环境 | 验证 docker-compose.yml 和容器状态 | 确保在正确目录运行 |
| 配置文件 | 自动复制 `.env.full``.env` | 仅在 .env 不存在时复制 |
| 验证挂载 | 检查容器内文件是否可见 | 解决 macOS 文件共享问题 |
| Composer | 安装 PHP 依赖包148个 | 使用 `-d memory_limit=-1` 避免内存不足 |
| 系统工具 | 安装 supervisor、curl、vim | Alpine Linux 包管理 |
| Supervisor | 配置进程管理器 | 管理队列和 WebSocket 服务 |
| 权限设置 | 设置 storage 目录权限 | 确保日志和缓存可写 |
| 数据库配置 | 自动替换 DB/Redis 配置 | 使用 sed 批量替换 |
| 创建数据库 | 创建 ecshopx 数据库 | UTF-8MB4 字符集 |
| 应用密钥 | 生成 Laravel 应用密钥 | 用于加密 session 等 |
| 数据库迁移 | 执行 64 个数据库迁移 | 创建所有表结构 |
**脚本亮点**
- ✅ 智能内存管理:使用 `-d memory_limit=-1` 解决 Composer 内存不足
- ✅ 镜像加速:配置阿里云 Composer 镜像,加快依赖下载
- ✅ 自动配置:无需手动编辑配置文件
- ✅ 错误检测:每步都有状态检查和错误提示
- ✅ 幂等性:可以重复执行,不会造成数据问题
## ❓ 常见问题
### 1. 容器内看不到挂载的文件
**症状**:运行 `docker exec ecshopx-api ls /data/httpd` 显示为空
**原因**macOS Docker Desktop 文件共享权限未配置
**解决方案**
```bash
# 1. 打开 Docker Desktop
# 2. Settings → Resources → File Sharing
# 3. 添加项目所在目录(如 /Users/你的用户名/data/ecshopx-open-docker/php74
# 4. Apply & Restart
# 5. 重启容器
docker-compose down
docker-compose up -d
```
详见:[VOLUME_ISSUE_SOLUTION.md](./VOLUME_ISSUE_SOLUTION.md)
### 2. Composer 安装失败:内存不足
**症状**
```
Fatal error: Allowed memory size of 1610612736 bytes exhausted
```
**解决方案**:使用 `-d memory_limit=-1` 参数
```bash
docker exec ecshopx-api sh -c "cd /data/httpd && php -d memory_limit=-1 composer.phar install"
```
`init-api.sh` 脚本已自动处理此问题。
### 3. 数据库连接失败
**症状**
```
SQLSTATE[HY000] [2002] Connection refused
```
**解决方案**
检查 `.env` 配置中数据库主机是否正确:
```bash
# 容器内必须使用服务名
DB_HOST=mysql # ✅ 正确
DB_HOST=127.0.0.1 # ❌ 错误(容器内不可用)
DB_HOST=localhost # ❌ 错误(容器内不可用)
```
### 4. Redis 连接失败
**症状**
```
Connection refused [tcp://127.0.0.1:6379]
```
**解决方案**
检查 `.env` 配置:
```env
REDIS_HOST=redis # ✅ 正确
REDIS_PASSWORD=123456 # 必须配置密码
```
### 5. 端口冲突
**症状**
```
Bind for 0.0.0.0:8080 failed: port is already allocated
```
**解决方案**
```bash
# 方式一:停止占用端口的程序
lsof -ti:8080 | xargs kill
# 方式二:修改 docker-compose.yml 中的端口映射
# 例如:将 8080:80 改为 8090:80
```
### 6. 查看容器日志
```bash
# 查看所有容器日志
docker-compose logs
# 查看特定容器日志
docker-compose logs ecshopx-api
# 实时跟踪日志
docker-compose logs -f ecshopx-api
# 查看最近 100 行日志
docker-compose logs --tail=100 ecshopx-api
```
### 7. 重启服务
```bash
# 重启所有服务
docker-compose restart
# 重启特定服务
docker-compose restart ecshopx-api
# 停止并删除容器(不会删除数据)
docker-compose down
# 完全清理(包括卷和网络)
docker-compose down -v
```
## 🔧 开发命令
### 进入容器
```bash
# 进入 API 容器
docker exec -it ecshopx-api sh
# 进入 MySQL 容器
docker exec -it ecshopx-open-docker_mysql_1 mysql -u root -p
# 进入 Redis 容器
docker exec -it ecshopx-redis redis-cli -a 123456
```
### 常用 Artisan 命令
```bash
# 进入 API 容器
docker exec -it ecshopx-api sh
cd /data/httpd
# 查看路由
php artisan route:list
# 清除缓存
php artisan cache:clear
# 清除配置缓存
php artisan config:clear
# 生成 API 文档
php artisan swagger:generate
# 运行队列
php artisan queue:work
# 查看所有命令
php artisan list
```
### 数据库操作
```bash
# 运行迁移
docker exec -w /data/httpd ecshopx-api php artisan doctrine:migrations:migrate
# 回滚迁移
docker exec -w /data/httpd ecshopx-api php artisan doctrine:migrations:rollback
# 查看迁移状态
docker exec -w /data/httpd ecshopx-api php artisan doctrine:migrations:status
```
## 📚 更多资源
- [ECShopX 官方文档](https://op.shopex.cn/doc_ecshopx_dev/docs/readme.html)
- [Docker 官方文档](https://docs.docker.com/)
- [Docker Compose 文档](https://docs.docker.com/compose/)
- [Lumen 框架文档](https://lumen.laravel.com/)
---
如有问题,请提交 [Issue](https://github.com/shopex/ecshopx-open-docker/issues)。