当前位置: 首页 > news >正文

Hyperf方案 Docker容器化部署

<?php/** * 案例标题:Docker容器化部署 * 说明:Dockerfile多阶段构建 + docker-compose.yml配置Hyperf + MySQL + Redis完整开发环境 * 需要安装的包:无需额外PHP包,这是Docker配置文件 */// ========== Dockerfile ==========/* # 第一阶段:用完整PHP镜像安装Composer依赖 FROM hyperf/hyperf:8.1-alpine-v3.16-cli AS builder WORKDIR /app # 先只复制composer文件,利用Docker缓存层,依赖没变就不重装 COPY composer.json composer.lock ./ # 安装生产依赖,不装dev包,--no-scripts避免触发不必要的脚本 RUN composer install --no-dev --no-scripts --optimize-autoloader # 复制应用代码 COPY . . # 运行一次 composer dump-autoload 生成优化的自动加载文件 RUN composer dump-autoload --optimize --no-dev # 第二阶段:用精简镜像运行,把builder阶段的产物复制过来 FROM hyperf/hyperf:8.1-alpine-v3.16-cli LABEL maintainer="yourteam@company.com" WORKDIR /app # 只从builder阶段复制必要文件,不复制.git等无用文件 COPY --from=builder /app /app # 暴露Hyperf默认端口 EXPOSE 9501 # 容器启动命令,--watch false 生产环境关掉文件监听 CMD ["php", "bin/hyperf.php", "start"] */// ========== docker-compose.yml ==========/* version: '3.8' services: # Hyperf应用服务 app: build: context: . dockerfile: Dockerfile container_name: hyperf_app restart: always # 崩了自动重启 ports: - "9501:9501" # 把容器9501映射到宿主机9501 environment: - APP_ENV=dev - DB_HOST=mysql # 用服务名做域名,Docker内部DNS会解析 - DB_PORT=3306 - DB_DATABASE=hyperf - DB_USERNAME=hyperf - DB_PASSWORD=hyperf123 - REDIS_HOST=redis - REDIS_PORT=6379 volumes: - ./:/app # 开发时挂载代码目录,改代码不用重建镜像 - /app/vendor # 但vendor目录用容器里的,别被宿主机覆盖 depends_on: mysql: condition: service_healthy # 等MySQL健康才启动app redis: condition: service_healthy networks: - hyperf_net # MySQL数据库 mysql: image: mysql:8.0 container_name: hyperf_mysql restart: always environment: MYSQL_ROOT_PASSWORD: root123 # root密码 MYSQL_DATABASE: hyperf # 自动建库 MYSQL_USER: hyperf # 应用用的普通用户 MYSQL_PASSWORD: hyperf123 ports: - "3306:3306" # 暴露出来方便用Navicat连 volumes: - mysql_data:/var/lib/mysql # 数据持久化,容器重建数据不丢 - ./docker/mysql/init.sql:/docker-entrypoint-initdb.d/init.sql # 初始化SQL healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot123"] interval: 10s timeout: 5s retries: 5 networks: - hyperf_net # Redis缓存 redis: image: redis:7-alpine # alpine镜像小 container_name: hyperf_redis restart: always command: redis-server --requirepass redis123 --appendonly yes # 开密码+AOF持久化 ports: - "6379:6379" volumes: - redis_data:/data # Redis数据持久化 healthcheck: test: ["CMD", "redis-cli", "-a", "redis123", "ping"] interval: 10s timeout: 5s retries: 5 networks: - hyperf_net volumes: mysql_data: # 数据卷,Docker管理,重建容器数据不丢 redis_data: networks: hyperf_net: driver: bridge # 桥接网络,容器之间可以用服务名互通 */// ========== docker/mysql/init.sql 初始化SQL ==========/* -- 建应用数据库(compose里已经建了,这里可以建其他库或初始化表) CREATE DATABASE IF NOT EXISTS hyperf_test CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; GRANT ALL ON hyperf.* TO 'hyperf'@'%'; GRANT ALL ON hyperf_test.* TO 'hyperf'@'%'; FLUSH PRIVILEGES; */// ========== .dockerignore ==========/* .git .env .env.* vendor runtime tests docker *.md .phpunit.result.cache */// ========== Makefile 常用操作封装 ==========/* .PHONY: up down build restart logs shell up: docker-compose up -d ## 后台启动所有服务 down: docker-compose down ## 停止并删除容器(数据卷保留) build: docker-compose build --no-cache ## 重新构建镜像 restart: docker-compose restart app ## 只重启app服务 logs: docker-compose logs -f app ## 实时看app日志 shell: docker-compose exec app sh ## 进入app容器的shell,方便调试 migrate: docker-compose exec app php bin/hyperf.php migrate ## 在容器里跑数据库迁移 */// ========== app/Controller/HealthController.php 健康检查接口 ==========namespaceApp\Controller;useHyperf\HttpServer\Annotation\Controller;useHyperf\HttpServer\Annotation\GetMapping;#[Controller]classHealthController{/** * GET /health - Docker healthcheck 和 负载均衡都会来探测这个 */#[GetMapping(path:'/health')]publicfunctioncheck():array{return['status'=>'ok','timestamp'=>time()];}}
http://www.jsqmd.com/news/589150/

相关文章:

  • # MAUI 中的异步加载优化实战:从理论到高性能 UI 体验提升在现代跨平台移动开发中,*
  • Python flask django高校学生综合医疗健康服务管理系统设计与实现
  • 多核通信中的环形缓冲区设计与实现
  • 嵌入式R-Tree空间索引:轻量级矩形碰撞检测与地理围栏实现
  • Windows下OpenClaw安装避坑指南:Qwen3.5-9B-AWQ-4bit联调实录
  • STLink与STM8/32单片机连接与调试指南
  • 修改docker镜像源
  • VoltLora库详解:RYLR998 LoRa模块AT命令驱动实践
  • 程序员副业全攻略:从技术到变现
  • 嵌入式系统架构设计:从前后台到RTOS的实践指南
  • 【源码深度】Android 触摸事件分发机制全解析|吃透 dispatch、intercept、onTouchEvent 与滑动冲突|Android全栈体系150讲-09
  • OpenClaw内存优化技巧:Phi-3-vision-128k-instruct大模型加载的资源配置
  • OpenClaw+千问3.5-9B:自动化学术论文阅读助手
  • Spring Security 2026 最佳实践:构建安全可靠的应用系统
  • 支持安卓的可行性与方向 | Swift 周报 issue 81
  • 电子元器件失效机理与预防全解析
  • OpenClaw调试指南:解决Qwen3-4B-Thinking-2507-GPT-5-Codex-Distill-GGUF模型响应超时问题
  • Java 设计模式在 Spring 中的现代应用:构建优雅的企业级应用
  • OpenClaw开源贡献:为Qwen3-4B开发新技能并提交社区
  • 解决《十字军之王II》中文显示难题:双字节字符补丁全攻略
  • Android SPI CAN管理芯片适配
  • 单片机产品设计全流程与实战经验分享
  • SEO网站页面优化的常见问题有什么_SEO网站页面优化的步骤是什么
  • ViT推理超快
  • 3个颠覆式创新:抖音批量下载工具如何解决内容采集效率难题
  • PinButtonEvents:嵌入式按钮事件处理框架深度解析
  • Linux 的 df 命令
  • Switch游戏格式转换工具SAK Switch Army Knife .nsz .xcz解压及.nsp .xci转档工具下载
  • 铜片划痕识别分类数据集1557张3类别低分辨率
  • 完整Android SPI CAN管理应用程序设计 HAL/Framework配合