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>
- ./www:/var/www/html
- ./apache/conf:/etc/apache2/sites-available depends_on:
- mysql ports:
- "80:80"
restart: unless-stopped
可选:安装 MySQL 扩展(PHP 连接 MySQL 必需)
command: bash -c "docker-php-ext-install mysqli pdo pdo_mysql && a2enmod rewrite && apache2-foreground"
phpmyadmin: image: phpmyadmin/phpmyadmin container_name: my-pma environment: PMA_HOST: mysql PMA_PORT: 3306 PMA_ARBITRARY: 1 depends_on:
- mysql ports:
- "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)分别验证











