PHP + Apache2 一键容器化:基于 Docker Compose 的 apache-php 示例完整实战指南
示例工程【免费下载链接】awesome-composeAwesome Docker Compose samples项目地址https://gitcode.com/gh_mirrors/aw/awesome-compose点击查看免费下载本指南围绕 awesome-compose 仓库中 apache-php 示例展开讲解如何用 Docker Compose 将一个最简 PHP 应用与 Apache2 Web 服务器打包、构建、启动、验证并清理。读完本文你将掌握compose.yaml中构建上下文、端口映射、卷挂载等核心配置的实战写法理解官方 PHP-Apache 镜像的多阶段构建机制并能独立复现从docker compose up -d到curl localhost:80的完整部署闭环。示例概览一个单服务PHP 应用的样板apache-php 是 awesome-compose 仓库中典型的**单服务single service**示例其定位在仓库根 README.md 中被明确归类为 Single service samples。它的用途不是演示多容器协作而是展示最基础也最常用的一种容器化形态把一个带 Apache2 的 PHP 应用通过 Compose 一条命令跑起来。该示例的完整目录结构如下与文档一致. ├── compose.yaml # Compose 编排文件服务定义入口 └── app ├── Dockerfile # PHP Apache2 镜像构建脚本 └── index.php # 唯一的路由/页面入口整条链路只有两个角色compose.yaml负责描述服务app/目录负责承载应用代码与镜像构建逻辑。核心配置解析compose.yaml文档给出了示例的服务编排配置当前仓库中的实际文件 compose.yaml 内容如下services: web: build: context: app target: builder ports: - 80:80 volumes: - ./app:/var/www/html/相比文档中的简写build: app仓库当前版本使用了build.contextbuild.target的完整写法语义上更精确。逐项拆解services.web定义一个名为web的服务这是本示例唯一的服务后续docker compose up默认启动它。build.context: app构建上下文为app目录Docker 会以该目录为基准解析Dockerfile与 COPY 的源路径。注意 Compose 会自动在该上下文内查找名为Dockerfile的构建文件。build.target: builder指定多阶段构建的目标阶段为builder对应 Dockerfile 中的AS builder。这保证了默认部署时只产出轻量的运行镜像而不会把后文提到的开发工具阶段dev-envs带入运行产物。ports: - 80:80将容器内 Apache 的 80 端口映射到宿主机的 80 端口80:80是hostPort:containerPort的标准写法。若宿主机 80 端口被占用可自行改为如8080:80。volumes: - ./app:/var/www/html/把宿主机app/目录挂载为容器内 Apache 文档根目录/var/www/html/。Apache 的默认站点根目录正是/var/www/html因此容器启动后即可直接以/var/www/html/index.php作为首页入口。这里有一个值得强调的实战要点卷挂载意味着应用代码不在镜像内、而在宿主机上实时可见。修改app/index.php后无需重新构建镜像刷新浏览器即可生效非常适合本地开发调试。应用源码与 Dockerfile 深度解析页面入口 index.phpapp/index.php 是整个应用的唯一业务代码?php echo h1Hello World!/h1; ?它通过 PHP 直接输出一个一级标题Hello World!。由于 Apache 的mod_php处理.php请求当浏览器访问根路径时Apache 会把请求交给 PHP 解释器执行该文件并把渲染后的 HTML 返回客户端。说明文档中curl localhost:80的示例输出为纯文本Hello World!那是示例早期版本无 HTML 标签的返回结果当前仓库 index.php 会返回带h1标签的 HTML 内容实际 curl 输出为h1Hello World!/h1。多阶段 Dockerfileapp/Dockerfile 采用多阶段构建整体结构如下# syntaxdocker/dockerfile:1.4 FROM --platform$BUILDPLATFORM php:8.0.9-apache as builder CMD [apache2-foreground] FROM builder as dev-envs RUN EOF apt-get update apt-get install -y --no-install-recommends git EOF RUN EOF useradd -s /bin/bash -m vscode groupadd docker usermod -aG docker vscode EOF # install Docker tools (cli, buildx, compose) COPY --fromgloursdocker/docker / / CMD [apache2-foreground]几个值得展开的关键点基础镜像php:8.0.9-apache这是官方 PHP 镜像的 Apache 变体内置 Apache2 与 PHP 模块。文档部署日志中出现的php:7.2-apache是示例早期使用的镜像版本当前仓库已升级到 8.0.9。--platform$BUILDPLATFORM配合 BuildKit 的跨平台构建能力允许在不同架构的宿主机上为构建阶段选取合适的平台提升多架构构建效率。CMD [apache2-foreground]以前台模式启动 Apache保证容器主进程持续运行且日志直接输出到 stdout这是容器内运行 Web 服务的标准姿势容器内不能用service apache2 start这类后台启动方式。dev-envs阶段在builder基础上追加 git、vscode用户、docker 用户组以及 Docker CLI 工具链专供开发容器如 Dev Containers使用。由于 compose.yaml 的target: builder指向了builder阶段默认部署不会携带这些开发依赖镜像更精简。Dockerfile 语法# syntaxdocker/dockerfile:1.4启用 Dockerfile 1.4 语法从而支持RUN EOF这种 heredoc 写法与COPY --from跨阶段拷贝等 BuildKit 特性。一键部署docker compose up -d进入示例根目录执行部署命令$ docker compose up -d-ddetached让容器在后台运行。文档中展示的典型构建与启动日志如下Creating network php-docker_web with the default driver Building web Step 1/6 : FROM php:7.2-apache ... ... Creating php-docker_web_1 ... done日志中的两处细节值得注意网络名与容器名Compose 默认以所在目录名作为 project 名并以此派生网络、卷与容器名。php-docker_web、php-docker_web_1表明该示例早期位于名为php-docker的目录中当前目录名为apache-php因此实际生成的名字会是apache-php_web、apache-php-web-1。若想显式控制 project 名可用docker compose -p name up -d指定。首次构建耗时首次执行需要拉取php:8.0.9-apache基础镜像并完成构建日志中的Step 1/6即对应 Dockerfile 的逐步执行再次启动时镜像已缓存速度会快得多。验证运行结果部署完成后先检查容器与端口映射是否符合预期$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2bc8271fee81 apache-php_web docker-php-entrypoi… About a minute ago Up About a minute 0.0.0.0:80-80/tcp apache-php-web-1关键信息解读STATUS: Up容器正常运行说明apache2-foreground前台进程没有退出PORTS: 0.0.0.0:80-80/tcp宿主机 80 端口已成功映射到容器 80 端口NAMES容器名遵循{project}-{service}-{序号}规则。随后在浏览器访问http://localhost:80或直接用 curl 验证$ curl localhost:80 h1Hello World!/h1返回的h1Hello World!/h1正是 index.php 中echo的输出证明浏览器 → Apache2 → mod_php → index.php整条请求链路已打通。若使用-i参数还能看到HTTP/1.1 200 OK状态码与Content-Type: text/html响应头。停止与清理开发或测试结束后用以下命令停止并移除容器$ docker compose down该命令会按 Compose 项目维度清理停止并删除web容器、移除由up创建的默认网络。若还需一并删除挂载卷或构建缓存可扩展使用$ docker compose down -v # 同时删除该项目的匿名卷 $ docker build --no-cache # 需要强制重建镜像时跳过缓存注意本示例通过卷将宿主机./app映射进容器应用数据存于宿主机因此down不会丢失代码。关键机制与注意事项小结文档与仓库的版本差异属正常演进README 中php:7.2-apache、简写build: app与纯文本Hello World!均来自示例早期版本当前仓库的 compose.yaml、Dockerfile、index.php 已升级为 PHP 8.0.9 多阶段构建形态实操时以仓库现行为准。卷挂载是开发利器也是生产隐患./app:/var/www/html/让代码改动即时生效省去重建镜像但生产环境通常应把代码 COPY 进镜像、去掉卷映射以获得可复现的交付物。镜像必须前台运行容器存活的前提是主进程不退出CMD [apache2-foreground]正是为容器化定制的启动方式勿改成 Apache 默认的后台守护模式。适用范围与仓库根 README.md 的声明一致本示例面向本地开发环境项目初始化、技术栈验证等不应直接用于生产部署。至此从配置解读、镜像构建、一键部署到结果验证与清理回收你已经完整掌握了 apache-php 示例的全部实战链路这套compose.yamlapp/的组织模式同样适用于迁移到你自己的 PHP 项目。赞分享示例工程【免费下载链接】awesome-composeAwesome Docker Compose samples项目地址https://gitcode.com/gh_mirrors/aw/awesome-compose点击查看免费下载相关推荐Firefox Send 容器化部署指南基于 Docker 与 docker-compose 的完整实战Firefox Send 容器化部署指南基于 Docker 与 docker compose 的完整实战 本篇技术指南以 Firefox Send 官方文档后端前端Spark Java 应用容器化部署实战基于 Awesome Compose 的 Docker Compose 单服务示例Spark Java 应用容器化部署实战基于 Awesome Compose 的 Docker Compose 单服务示例 本篇技术指南以仓库中的 spark示例工程使用 PHP mysqli 扩展连接 Apache Doris完整示例与实战指南使用 PHP mysqli 扩展连接 Apache Doris完整示例与实战指南 导读 Apache Doris 对外提供 MySQL 协议兼容的访问接口默OLAP数据库大数据实时分析上一篇深度修复戴森V6/V7电池开源固件终极实战指南下一篇如何在Android手机上快速部署Alpine LinuxTermuxAlpine完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

URP、HDRP与UE4全局光照对比:烘焙与实时GI选型指南

URP、HDRP与UE4全局光照对比:烘焙与实时GI选型指南

前阵子一个做独立游戏的朋友问了我一个挺典型的问题:同一套低模场景,在URP里烘焙完,切到HDRP之后光照颜色和亮度全变了;放到UE4里用Lightmass重新烘焙,出来的效果又是另一个味道。我说这太正常了,因为三个方…

2026/9/30 13:19:43 阅读更多 →
RabbitMQ Shovel 跨集群消息迁移与运维实战

RabbitMQ Shovel 跨集群消息迁移与运维实战

1. Shovel 到底解决什么问题:从"我不想写搬运代码"说起手上有两个 RabbitMQ 集群,一边是老机房要下线,队列里还压着上百万条没消费完的消息;另一边是新集群,业务已经切过去了。这时候最朴素的做法是写一段 J…

2026/9/30 13:19:43 阅读更多 →
分布式AI系统实战:NCCL优化、GPU拓扑感知与混合并行落地

分布式AI系统实战:NCCL优化、GPU拓扑感知与混合并行落地

1. 这不是“分布式AI”的科普课,而是八次实战后沉淀下来的系统骨架“分布式AI系统(八)”这个标题乍看像系列教程的普通一节,但如果你真在产线跑过模型、调过集群、扛过半夜三点的OOM报警,就会明白——这数字“八”不是…

2026/9/30 13:19:43 阅读更多 →

最新新闻

TextEdit不是输入框:QML文本引擎底层原理与实战避坑指南

TextEdit不是输入框:QML文本引擎底层原理与实战避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 14:07:46 阅读更多 →
GO [ 结构体 ]

GO [ 结构体 ]

前面我们已经学习了 Go 的变量、常量、数据类型、输入输出、条件控制、切片、字符串、映射表和指针。接下来开始学习 Go 语言里最常用的复合类型之一:结构体(struct)。 很多初学者第一次接触结构体时,会把它理解成“Go 语言里的 …

2026/9/30 14:07:46 阅读更多 →
RCU CPU Stall检测机制详解:从原理到排查实战

RCU CPU Stall检测机制详解:从原理到排查实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 14:07:46 阅读更多 →
夜间行人检测:5000张数据+三种标签格式+YOLO11跨平台训练

夜间行人检测:5000张数据+三种标签格式+YOLO11跨平台训练

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 14:07:46 阅读更多 →
Unity格斗游戏期末大作业:从零搭建到打包的完整指南

Unity格斗游戏期末大作业:从零搭建到打包的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 14:07:46 阅读更多 →
Zabbix自定义监控实战:脚本编写、Agent配置与日志服务监控

Zabbix自定义监控实战:脚本编写、Agent配置与日志服务监控

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 14:06:44 阅读更多 →

日新闻

Base64 图片头部特征识别:从文件头到格式判断的完整指南

Base64 图片头部特征识别:从文件头到格式判断的完整指南

1. 项目概述:为什么说看懂 base64 图片头部是基本功这几年跟 base64 打交道的机会越来越多,后端接口返回图片、前端渲染验证码、小程序里存小图、还有一些老系统导出报表,动不动就给你一段长到怀疑人生的 base64 字符串。很多人拿到字符串就直…

2026/9/30 0:00:35 阅读更多 →
Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

简介:本资源是一份面向Java初学者与课程设计学生的公交站牌广告灯箱管理系统毕业设计文档,聚焦城市公共广告资源信息化管理痛点,提供从需求分析到技术实现的完整方案。文档采用标准学术论文结构,含摘要、英文摘要、目录及五章正文…

2026/9/30 0:00:35 阅读更多 →
用 Redis Lua 构建大模型 API 多租户原子配额治理体系

用 Redis Lua 构建大模型 API 多租户原子配额治理体系

我去年年底接了一个内部 AI 平台的治理需求,背景很直接:公司把 DeepSeek、MiniMax 这类大模型 API 统一封装成内部网关,开放给几个业务团队用。结果第一个月账单出来,额度直接超了 4 倍。仔细查日志,发现原因并不复杂—…

2026/9/30 0:00:35 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 16:41:41 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/29 19:29:29 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/29 5:58:00 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/29 3:55:56 阅读更多 →