Appearance
Docker 部署
MineShop 提供完整的 Docker 支持,可以快速搭建开发和生产环境。
🐳 快速开始
使用 Docker Compose
bash
# 克隆项目
git clone https://github.com/since-leoo/mine-shop.git
cd mine-shop
# 启动所有服务
docker-compose up -d📄 docker-compose.yml
yaml
name: mineshop
volumes:
mine_redis_data:
mine_mysql_data:
services:
# Redis 缓存服务
redis:
image: redis:7.2-alpine
ports:
- "6379:6379"
volumes:
- mine_redis_data:/data
command: redis-server --appendonly yes
deploy:
resources:
limits:
memory: 1G
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 3
environment:
- TZ=Asia/Shanghai
# MySQL 数据库
mysql:
image: mysql:8.0
volumes:
- mine_mysql_data:/var/lib/mysql
ports:
- "3306:3306"
command: --default-authentication-plugin=mysql_native_password
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: mineshop
MYSQL_CHARACTER_SET_SERVER: utf8mb4
MYSQL_COLLATION_SERVER: utf8mb4_unicode_ci
TZ: Asia/Shanghai
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
# Hyperf 应用服务
hyperf:
image: hyperf/hyperf:8.3-alpine-vedge-swoole-v6.1
volumes:
- ./:/www
working_dir: /www
ports:
- "9501:9501"
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_healthy
environment:
- TZ=Asia/Shanghai
- APP_NAME=MineShop
- APP_ENV=dev
- DB_HOST=mysql
- REDIS_HOST=redis
command: php /www/bin/hyperf.php start🏗️ Dockerfile
生产环境推荐使用自定义 Dockerfile:
dockerfile
FROM hyperf/hyperf:8.3-alpine-vedge-swoole-v6.1
LABEL maintainer="MineShop Team" version="1.0"
# 时区设置
ARG timezone=Asia/Shanghai
ENV TIMEZONE=${timezone}
ENV APP_ENV=prod
ENV SCAN_CACHEABLE=true
# PHP 配置
RUN set -ex \
&& cd /etc/php* \
&& { \
echo "upload_max_filesize=128M"; \
echo "post_max_size=128M"; \
echo "memory_limit=1G"; \
echo "date.timezone=${TIMEZONE}"; \
} | tee conf.d/99_overrides.ini \
&& ln -sf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \
&& echo "${TIMEZONE}" > /etc/timezone
# 安装 xlswriter 扩展(Excel 导出)
RUN apk add --no-cache --virtual .build-deps \
$PHPIZE_DEPS zlib-dev \
&& pecl install xlswriter \
&& echo "extension=xlswriter.so" >> /etc/php83/conf.d/60-xlswriter.ini \
&& apk del .build-deps
WORKDIR /opt/www
# 复制代码
COPY . /opt/www
# 安装依赖
RUN composer install --no-dev -o \
&& cp .env.example .env \
&& php bin/hyperf.php
EXPOSE 9501
ENTRYPOINT ["php", "/opt/www/bin/hyperf.php", "start"]🔧 开发环境配置
开发模式 docker-compose.dev.yml
yaml
version: '3.8'
services:
hyperf:
image: hyperf/hyperf:8.3-alpine-vedge-swoole-v6.1
volumes:
- ./:/www
working_dir: /www
ports:
- "9501:9501"
environment:
- APP_ENV=dev
- DB_HOST=mysql
- REDIS_HOST=redis
# 开发模式使用热重载
command: php /www/bin/hyperf.php server:watch
tty: true启动开发环境:
bash
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d📦 常用命令
容器管理
bash
# 启动所有服务
docker-compose up -d
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs -f hyperf
# 停止所有服务
docker-compose down
# 重启服务
docker-compose restart hyperf进入容器
bash
# 进入 Hyperf 容器
docker-compose exec hyperf sh
# 执行 Artisan 命令
docker-compose exec hyperf php bin/hyperf.php migrate
docker-compose exec hyperf php bin/hyperf.php db:seed数据库操作
bash
# 进入 MySQL 容器
docker-compose exec mysql mysql -uroot -proot mineshop
# 备份数据库
docker-compose exec mysql mysqldump -uroot -proot mineshop > backup.sql
# 恢复数据库
docker-compose exec -T mysql mysql -uroot -proot mineshop < backup.sql🚀 生产环境部署
构建镜像
bash
# 构建生产镜像
docker build -t mineshop:latest .
# 推送到镜像仓库
docker tag mineshop:latest your-registry/mineshop:latest
docker push your-registry/mineshop:latest生产环境 docker-compose.prod.yml
yaml
version: '3.8'
services:
hyperf:
image: your-registry/mineshop:latest
restart: always
ports:
- "9501:9501"
environment:
- APP_ENV=prod
- DB_HOST=your-mysql-host
- DB_PASSWORD=${DB_PASSWORD}
- REDIS_HOST=your-redis-host
deploy:
replicas: 2
resources:
limits:
cpus: '2'
memory: 2G
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9501/health"]
interval: 30s
timeout: 10s
retries: 3🔍 健康检查
bash
# 检查服务健康状态
docker-compose ps
# 检查 Hyperf 服务
curl http://localhost:9501/health
# 检查 MySQL 连接
docker-compose exec mysql mysqladmin ping -h localhost
# 检查 Redis 连接
docker-compose exec redis redis-cli ping⚠️ 注意事项
- 数据持久化: 确保 MySQL 和 Redis 数据卷正确挂载
- 环境变量: 生产环境使用环境变量或 secrets 管理敏感信息
- 资源限制: 根据服务器配置合理设置资源限制
- 日志管理: 配置日志轮转,避免磁盘空间耗尽
- 网络安全: 生产环境不要暴露数据库端口到公网