- 后端
- 电商
- 前端
【免费下载链接】CRMEB
🔥CRMEB开源商城免费开源多语言商城系统,Tp6框架商城,系统可商用;包含小程序商城、H5商城、公众号商城、PC商城、App,支持分销、拼团、砍价、秒杀、优惠券、积分、会员等级、小程序直播、页面DIY,前后端分离,方便二开,更有详细使用文档、接口文档、数据字典、二开文档/视频教程,欢迎大家提出宝贵意见和建议
本指南以 CRMEB 开源商城仓库中的 docker-compose/window/README.md 为骨架,完整讲解在 Windows 上使用 Docker Compose 一键拉起 CRMEB 前后端分离环境(MySQL + Redis + PHP-FPM + Nginx)的步骤,并深入剖析 docker-compose/window/docker-compose.yml 的容器网络、端口映射与数据持久化设计,以及php think timer / workerman / queue:listen三类后台任务的启动原理。读完本文,你将能够从零搭建一套可运行、可安装、可二开的 CRMEB 本地开发环境,并具备独立排查端口冲突、IP 占用、镜像兼容性等常见故障的能力。
一、环境准备:安装 Docker 与 Docker Compose
CRMEB 的 Docker 部署方案由四个容器组成,全部依赖 Docker 运行时与 Compose 编排工具,因此环境准备是第一道门槛。
1. 安装 Docker
Windows 用户推荐直接下载 Docker Desktop 官方安装包(Docker Desktop 内置了 docker CLI 与 docker-compose v2 插件),安装后需确保 Docker Desktop 已启动,并在设置中将共享驱动器/文件共享指向代码所在目录。
如果宿主系统为 Linux(也可用于 Windows WSL),文档同时提供了国内可用的脚本安装方式:
curl -sSL https://get.daocloud.io/docker | sh该脚本通过 DaoCloud 镜像源安装 Docker 引擎,适合网络受限环境。
2. 安装 docker-compose
Docker Desktop 自带 compose 能力,可直接使用docker compose子命令;若使用独立安装的 docker-compose v1,需单独安装。命令均以docker-compose up -d形式调用,与文档保持一致。
二、下载 CRMEB 代码并规划目录
文档要求将 CRMEB 程序放到与docker-compose目录同级的位置。以当前仓库为例,目录结构对应为:
CRMEB/ # 仓库根目录 ├── crmeb/ # CRMEB 主程序(ThinkPHP 6 应用) └── docker-compose/ └── window/ # Windows 版 Compose 编排目录 ├── docker-compose.yml ├── mysql/ # my.cnf 配置挂载 ├── nginx/ # vhost.conf 配置挂载 ├── php/ # Dockerfile 与 php.ini 覆盖 └── redis/ # redis.conf 配置挂载关键挂载关系:在 docker-compose/window/docker-compose.yml 中,PHP 容器通过../../crmeb:/var/www将仓库根目录下的crmeb主程序直接挂载进容器工作目录/var/www。这意味着代码改动即时生效,无需重新构建镜像,非常适合二开调试;同时../../crmeb/runtime:/var/www/temp将运行时缓存目录单独挂载,用于承载上传临时文件与缓存。
三、启动项目:docker-compose up -d 背后发生了什么
进入 Compose 编排目录并执行:
cd docker-compose docker-compose up -d-d表示后台守护模式运行。首次执行时,Compose 会按编排文件拉取基础镜像并执行 docker-compose/window/php/Dockerfile 构建 PHP 镜像。下面拆解四个服务的编排设计。
3.1 服务清单与端口映射
| 容器名 | 镜像/构建 | 宿主机端口 → 容器端口 | 固定容器 IP |
|---|---|---|---|
crmeb_mysql | mysql:5.7 | 3336:3306 | 192.168.10.11 |
crmeb_redis | redis:alpine | 6379:6379 | 192.168.10.10 |
crmeb_php | 由./php/Dockerfile构建(php:7.4-fpm) | 9000:9000、40001:40001、40002:40002、40003:40003 | 192.168.10.90 |
crmeb_nginx | nginx:alpine | 8011:80 | 192.168.10.80 |
其中 PHP 容器的 40001/40002/40003 三个端口对应 CRMEB 的 Workerman 长连接服务端口(见下文第四节),9000 为 PHP-FPM 默认端口,供 Nginx 通过fastcgi_pass phpfpm:9000转发 PHP 请求。
3.2 自定义桥接网络与固定 IP
编排文件底部声明了自定义桥接网络:
networks: app_net: driver: bridge ipam: driver: default config: - subnet: 192.168.10.0/24四个容器全部接入app_net并各自固定ipv4_address。这样设计的原因在于:CRMEB 安装向导需要填入数据库与 Redis 的固定地址(详见第五节),固定 IP 可以保证容器重启后连接地址不变。Nginx 的 vhost.conf 中/notice与/msg两个 WebSocket 反向代理也直接引用了 PHP 容器的固定 IP192.168.10.90,若改动了 IP 段,这两处代理地址必须同步修改。
3.3 MySQL 的关键启动参数
MySQL 容器通过command注入了一组对 CRMEB 至关重要的参数:
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --explicit_defaults_for_timestamp=true --lower_case_table_names=1 --max_allowed_packet=128M --default-authentication-plugin=mysql_native_password --sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"utf8mb4字符集保证商品标题、用户昵称等 emoji 字符正常存储;lower_case_table_names=1让表名不区分大小写,避免 Linux 容器与 Windows 开发环境的表名大小写差异引发报错;max_allowed_packet=128M支持较大数据包(如批量导入的商品图片数据);mysql_native_password认证插件则确保 ThinkPHP 6 的旧式 MySQL 客户端驱动可以正常连接。
挂载的 docker-compose/window/mysql/my.cnf 还会叠加character-set-server=utf8mb4、collation-server=utf8mb4_unicode_ci与skip-grant-tables等配置,数据目录与日志目录分别挂载到本地的./mysql/data与./mysql/log。
3.4 Redis 与 PHP 配置
Redis 使用redis-server /usr/local/etc/redis/redis.conf启动,挂载 docker-compose/window/redis/redis.conf。该配置中与 CRMEB 直接相关的关键项包括:
port 6379:监听端口;requirepass 123456:连接密码,与安装向导中的 Redis 密码一致;databases 16:可用 db 编号 0~15,安装时默认使用db:0;appendonly yes:开启 AOF 持久化,避免容器重启丢失缓存数据;protected-mode no:允许容器网络内其他主机访问。
PHP 容器构建自php:7.4-fpm,Dockerfile 安装bcmath / redis / mysqli / gd四个扩展,正好对应该仓库 composer.json 中声明的依赖(ThinkPHP 6 需要 bcmath、Redis 连接需要 redis 扩展、二维码与图片处理需要 gd)。此外还会注入 php-ini-overrides.ini,其中upload_max_filesize=100M、post_max_size=108M支撑商城商品图与编辑器大图上传,upload_tmp_dir=/var/www/temp对应挂载的临时目录。
四、启动队列、定时任务与长连接
CRMEB 的业务强依赖三个常驻后台进程:定时任务(如未支付订单自动取消)、Workerman 长连接(后台新订单弹窗、客服消息)、Redis 队列(短信、订单通知等异步任务)。它们都需要在 PHP 容器内以守护方式启动:
# 进入 PHP 容器 docker exec -it crmeb_php /bin/bash # 进入项目目录 cd /var/www # 启动定时任务(守护进程方式) php think timer start --d # 启动 Workerman 长连接服务 php think workerman start --d # 启动 Redis 队列消费 php think queue:listen --queue4.1 定时任务:php think timer
timer命令由 crmeb/crmeb/command/Timer.php 实现,它基于 Workerman 的 Worker 构建常驻进程:
--d表示 daemon 守护方式运行,PID 写入runtime/timer.pid;-i选项可自定义执行间隔(精确到 0.001 秒);- 进程启动后在
onWorkerStart回调中调用SystemCrontabServices::crontabCommandRun(),即从数据库读取后台配置的定时任务并逐条执行,对应 CRMEB 后台「定时任务」管理功能。
4.2 长连接:php think workerman
workerman命令由 crmeb/crmeb/command/Workerman.php 实现,启动三类服务,端口定义在 crmeb/config/workerman.php:
| 服务 | 端口 | 作用 |
|---|---|---|
admin(WorkermanService) | 40001 | 系统程序推送消息给后台,新订单/新退款弹窗提醒 |
chat(ChatService) | 40002 | 客户或客服发送消息,客服消息通知(/notice代理到该端口) |
channel(Channel Server) | 40003 | 内部通讯服务,程序间消息转发(/msg代理到该端口) |
这与 PHP 容器暴露的 40001~40003 端口一一对应。Nginx 的 vhost.conf 将/notice与/msg两个路径通过 WebSocket 升级代理到 PHP 容器固定 IP 的 40002/40003 端口,实现浏览器端长连接。
4.3 队列:php think queue:listen
CRMEB 的异步任务基于 ThinkPHP 的think-queue组件,crmeb/config/queue.php 将默认驱动设为redis,队列名为CRMEB,并读取环境变量中的 Redis 主机、端口、密码与 select 库。因此队列消费进程必须与安装时填写的 Redis 配置一致,否则会出现任务入队成功但无法消费的情况。--queue参数指定监听队列名称(CRMEB)。
五、访问并安装 CRMEB 系统
容器全部启动后,浏览器访问:
http://localhost:8011/Nginx 容器将宿主机 8011 端口映射到容器内 80 端口,root /var/www/public指向 CRMEB 的前端入口目录。首次访问会进入安装向导(由 crmeb/public/install/index.php 提供),依次完成「安装许可协议 → 运行环境检测 → 安装参数设置 → 安装详细过程 → 安装完成」五个步骤。
5.1 MySQL 数据库连接信息
在安装向导的「数据库配置」步骤,填写以下固定信息:
Host:192.168.10.11 Port:3306 user:root pwd:123456- 192.168.10.11 即 MySQL 容器在
app_net网络中的固定 IP; - 容器内部端口为 3306;宿主机上的 3336 端口仅供外部工具(如 Navicat 连接
localhost:3336)调试使用; - root 密码由编排文件的
MYSQL_ROOT_PASSWORD: '123456'指定。
5.2 Redis 连接信息
Host:192.168.10.10 Port:6379 db:0 pwd:123456Redis 容器固定 IP 为 192.168.10.10,密码123456对应 redis.conf 中的requirepass 123456,默认使用 0 号库。
5.3 环境兼容性提示
安装向导对 PHP 版本有硬性校验(install/index.php):要求PHP 7.1.0 ~ 7.4。这正是 PHP 容器选用php:7.4-fpm镜像的原因,请勿随意更换为 PHP 8 以上镜像,否则安装向导会直接拒绝。
六、常见问题排查
问题 1:端口被占用
若宿主机 8011、3336、6379、9000、40001~40003 中的某个端口已被占用,docker-compose up -d会报端口绑定失败。解决方式:打开 docker-compose/window/docker-compose.yml,修改对应服务的ports左侧宿主机端口,例如将"8011:80"改为"8012:80",同时注意同步更新 vhost.conf 中引用的容器内部端口。
问题 2:启动失败
启动失败时优先查看容器日志定位原因:
docker-compose logs mysql docker-compose logs phpfpm docker-compose ps文档提示可检查镜像地址或其它配置。常见的镜像拉取失败场景,可切换编排文件注释中预留的镜像备选,例如 Redis 的daocloud.io/library/redis:6.0.5-alpine,MySQL 的daocloud.io/library/mysql:5.7.5-m15。
问题 3:Error response from daemon: Address already in use
该报错通常不是端口冲突,而是容器网络 IP 被占用。由于编排文件为每个容器固定了ipv4_address,若宿主机所在网段恰好已存在同名 IP 或其他 Docker 网络占用了该地址,就会触发此错误。解决方式:修改 docker-compose.yml 中对应容器networks.app_net.ipv4_address的值(保持192.168.10.0/24网段内),并同步更新 nginx vhost.conf 中192.168.10.90的代理地址,以及安装向导中填写的数据库/Redis 地址。
问题 4:MYSQL 容器无法启动且无日志
文档特别指出:M1 芯片(Apple Silicon)下必须使用daocloud.io/library/mysql:5.7.5-m15镜像;其他任何情况下都使用mysql:5.7镜像。这本质上是mysql:5.7官方镜像在 arm64 架构下的兼容性问题,Windows + Intel/AMD 环境使用默认的mysql:5.7即可,M1 用户则需要将编排文件中image: mysql:5.7替换为 M1 专用镜像后重新docker-compose up -d。
七、一句话总结部署闭环
整个部署链路可以概括为:装好 Docker → 放置代码 →docker-compose up -d拉起四容器 → 进 PHP 容器启动 timer/workerman/queue 三个常驻进程 → 访问 8011 端口走安装向导(填 192.168.10.11 与 192.168.10.10 两个固定地址)→ 完成安装。这套方案将代码以卷挂载方式接入容器,既保证了 MySQL/Redis/Workerman 端口与地址的可预期性,又让二开者可以在宿主机直接编辑crmeb/目录下的代码,是 CRMEB 在 Windows 上进行本地开发与部署的推荐起点。
- 后端
- 电商
- 前端
【免费下载链接】CRMEB
🔥CRMEB开源商城免费开源多语言商城系统,Tp6框架商城,系统可商用;包含小程序商城、H5商城、公众号商城、PC商城、App,支持分销、拼团、砍价、秒杀、优惠券、积分、会员等级、小程序直播、页面DIY,前后端分离,方便二开,更有详细使用文档、接口文档、数据字典、二开文档/视频教程,欢迎大家提出宝贵意见和建议
相关推荐
CRMEB 商城 Docker Compose 快速部署指南:基于 docker-compose/linux 的容器化安装与运行
CRMEB 商城 Docker Compose 快速部署指南:基于 docker compose/linux 的容器化安装与运行 导读 本指南以 CRMEB 仓
后端电商前端从0到1搭建CRMEB Java商城:Docker Compose一键部署多环境
从0到1搭建CRMEB Java商城:Docker Compose一键部署多环境 CRMEB Java商城是一款基于SpringBoot + Maven + V
后端前端电商CRMEB 商城在 Mac M 系列芯片上的 Docker Compose 快速部署指南:环境搭建、容器配置与定时任务/长连接/队列启动全解析
CRMEB 商城在 Mac M 系列芯片上的 Docker Compose 快速部署指南:环境搭建、容器配置与定时任务/长连接/队列启动全解析 导读 本文基于
后端电商前端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考