Apache作为Web服务器需通过PHP等中间层连接MySQL,Docker Compose负责统一编排三者:MySQL须先启动并就绪,PHP-Apache依赖其服务名“mysql”通信,phpMyAdmin同理;目录结构需分设mysql/conf.d、init、www及apache/conf;docker-compose.yml中通过depends_on、volumes、environment和network自动实现配置、持久化与依赖启动;验证时应检查MySQL日志就绪状态、PHP扩展加载及index.php连通性。
明确服务角色与依赖关系
apache 作为 web 服务器,本身不处理数据库逻辑,必须通过后端应用(如 php、python 或 node.js)连接 mysql。docker compose 的作用是把 apache、mysql 和中间层服务一起启动,并确保它们网络互通、启动顺序合理。mysql 必须先就绪,apache(或其关联的运行时)才能成功连接它。
准备基础目录结构
在项目根目录下建立清晰的结构,便于维护:
- ./mysql/conf.d/:存放自定义 MySQL 配置(如 my.cnf)
- ./mysql/init/:存放初始化 SQL 脚本(如建库、建表、插入示例数据)
- ./www/:存放 Apache 提供的静态或动态网页文件(如 index.php)
- ./apache/conf/:可选,挂载自定义 httpd.conf 或虚拟主机配置
编写 docker-compose.yml 文件
以下是一个稳定可用的三服务组合示例(MySQL + PHP-Apache + phpMyAdmin),适用于本地开发:
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: my-mysql
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: app_db
MYSQL_USER: app_user
MYSQL_PASSWORD: user123
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf.d:/etc/mysql/conf.d
- ./mysql/init:/docker-entrypoint-initdb.d
ports:
- "3306:3306"
restart: unless-stopped
<p>apache-php:
image: php:8.2-apache
container_name: my-apache
volumes:</p><ul><li>./www:/var/www/html</li><li>./apache/conf:/etc/apache2/sites-available
depends_on:</li><li>mysql
ports:</li><li>"80:80"
restart: unless-stopped<h1>可选:安装 MySQL 扩展(PHP 连接 MySQL 必需)</h1><p>command: bash -c "docker-php-ext-install mysqli pdo pdo_mysql && a2enmod rewrite && apache2-foreground"</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" 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 href="/xiazai/skill6198" title="Dolphindb Docker">Dolphindb Docker</a>
<p>自动化 DolphinDB Docker 部署,支持自动架构检测(ARM64/x86_64),智能内存分配(50% 规则)以及完整数据持久化。</p>
</div>
<a href="/xiazai/skill6198" title="Dolphindb Docker" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div></li></ul><p>phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: my-pma
environment:
PMA_HOST: mysql
PMA_PORT: 3306
PMA_ARBITRARY: 1
depends_on:</p><ul><li>mysql
ports:</li><li>"8080:80"
restart: unless-stopped
注意:service 名称(mysql / apache-php)就是容器内其他服务访问它的主机名,所以 phpMyAdmin 中设 PMA_HOST: mysql 即可直连,无需 IP。
验证与调试要点
启动后别急着访问页面,先确认关键状态:
- 运行 docker compose up -d 启动全部服务
- 用 docker compose logs -f mysql 查看 MySQL 是否完成初始化(出现 mysqld: ready for connections)
- 进入 Apache 容器执行 docker compose exec apache-php php -m | grep mysqli,确认 PHP 已加载 MySQL 扩展
- 在 ./www/index.php 中写一段测试连接代码,验证能否连上 mysql:3306(不是 localhost)
- 浏览器打开 http://localhost(Apache)、http://localhost:8080(phpMyAdmin)分别验证

















