Skip to content

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

⚠️ 注意事项

  1. 数据持久化: 确保 MySQL 和 Redis 数据卷正确挂载
  2. 环境变量: 生产环境使用环境变量或 secrets 管理敏感信息
  3. 资源限制: 根据服务器配置合理设置资源限制
  4. 日志管理: 配置日志轮转,避免磁盘空间耗尽
  5. 网络安全: 生产环境不要暴露数据库端口到公网

📚 下一步

基于 Apache-2.0 许可发布 | 感谢 MineAdmin 提供的优秀基础框架