在 ubuntu 上用 dockerfile 定制 hyperf 镜像需基于 php 8.1+ 官方镜像,安装 swoole、redis 等扩展,以非 root 用户运行,复制代码并启动;关键点包括版本对齐、安全用户配置与多阶段构建优化。

在 Ubuntu 上用 Dockerfile 定制 Hyperf 镜像,核心是基于官方 PHP 基础镜像,安装 Hyperf 所需扩展(如 Swoole、Redis、PDO 等),再复制项目代码并配置启动命令。关键在于版本对齐、扩展编译方式和运行用户安全。
准备基础环境与依赖
确保 Ubuntu 主机已安装 Docker 和 Docker Buildx(推荐 23.0+):
- 更新系统:`sudo apt update && sudo apt upgrade -y`
- 安装 Docker:按官方指南操作
- 验证:`docker --version` 和 `docker run --rm hello-world`
编写适配 Hyperf 的 Dockerfile
Hyperf 3.x 推荐使用 PHP 8.1+ 和 Swoole 5.x。以下是一个最小可行 Dockerfile 示例(保存为 Dockerfile):
FROM php:8.1-cli-bullseye <h1>安装系统依赖</h1><p>RUN apt-get update && apt-get install -y \ libzip-dev \ unzip \ git \ curl \ && rm -rf /var/lib/apt/lists/*</p><h1>启用必要 PHP 扩展</h1><p>RUN docker-php-ext-install zip pdo pdo_mysql \ && pecl install redis swoole \ && docker-php-ext-enable redis swoole</p><h1>安装 Composer(全局可用)</h1><p>COPY --from=composer:2 /usr/bin/composer /usr/bin/composer</p><h1>创建非 root 用户(安全实践)</h1><p>RUN useradd -m -u 1001 -g root -s /bin/bash -d /home/app app USER app WORKDIR /home/app</p><h1>复制项目(假设当前目录含 hyperf 项目)</h1><p>COPY . .</p><h1>安装依赖(生产模式,跳过 dev 包)</h1><p>RUN composer install --no-dev --optimize-autoloader</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill6198" title="Dolphindb Docker"><img src="https://img.php.cn/upload/skill/000/000/081/179083807043363.jpg" alt="Dolphindb Docker" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill6198" title="Dolphindb Docker" class="overflowclass">Dolphindb Docker</a> <p class="overflowclass">自动化 DolphinDB Docker 部署,支持自动架构检测(ARM64/x86_64),智能内存分配(50% 规则)以及完整数据持久化。</p> </div> <a rel="nofollow" href="/xiazai/skill6198" title="Dolphindb Docker" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div><h1>暴露端口(Hyperf 默认 9501)</h1><p>EXPOSE 9501</p><h1>启动命令(使用 Hyperf 内置 server)</h1><p>CMD ["php", "bin/hyperf.php", "start"] </p>
注意点:
- 使用 php:8.1-cli-bullseye 而非 alpine,避免 Swoole 编译问题;如需 Alpine,须手动编译 Swoole
- 务必用 non-root 用户 运行,Hyperf 官方也建议不以 root 启动
- 若项目含 MySQL/Redis 客户端,确认
pdo_mysql和redis已启用
构建与测试镜像
在项目根目录执行:
docker build -t my-hyperf-app . docker run -it --rm -p 9501:9501 my-hyperf-app
访问 http://localhost:9501 应看到 Hyperf 默认欢迎页。如报错,常见原因:
-
权限问题:检查
runtime/目录是否可写(可在 Dockerfile 中加RUN mkdir -p runtime && chmod -R 755 runtime) -
配置缺失:确保
config/autoload/server.php中port为 9501,且未绑定 127.0.0.1(应为 0.0.0.0) -
扩展未加载:进容器执行
php -m | grep -E "(swoole|redis)"验证
进阶优化建议
提升构建效率与运行稳定性:
- 使用 多阶段构建:将
composer install放在 builder 阶段,只拷贝vendor到最终镜像 - 添加
.dockerignore:排除node_modules/、.git/、tests/等非运行所需文件 - 通过
ENV注入配置:如ENV HYPERF_ENV=prod,并在config/autoload/env.php中读取 - 健康检查:在 Dockerfile 末尾加
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 CMD curl -f http://localhost:9501/health || exit 1










