mirror of
https://gitee.com/ShopeX/ECShopX_docker
synced 2026-08-01 19:16:04 +08:00
560 lines
13 KiB
Markdown
Executable File
560 lines
13 KiB
Markdown
Executable File
# 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 Desktop(macOS/Windows)或 Docker Engine(Linux)
|
||
- 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)。
|