如何将带多虚拟主机的LAMP应用Docker化?适配新开发者部署
将多站点LAMP架构从Homestead迁移到Docker的实现方案
问题背景
现有由7个独立站点组成的LAMP架构应用,各站点共享部分数据库与文件,每个站点对应独立域名并通过虚拟主机指向应用内指定目录。当前基于Homestead/Vagrant运行正常,核心配置示例如下:
- map: website1.test to: /home/vagrant/code/website1 php: "8.1" type: "apache" - map: website2.test to: /home/vagrant/code/website2 php: "8.1" type: "apache" ...
需求是迁移至Docker,实现新开发者可快速部署、共享环境。
1. 项目目录结构规划
先梳理本地目录结构,让Docker挂载逻辑更清晰:
your-project-root/ ├── docker/ │ ├── apache/ │ │ ├── conf.d/ # 存放所有站点的虚拟主机配置 │ │ ├── logs/ # Apache日志挂载目录(.gitignore) │ │ └── Dockerfile # 自定义Apache+PHP8.1镜像构建文件 │ ├── mysql/ │ │ ├── init.d/ # 数据库初始化脚本(共享库表结构) │ │ └── data/ # 数据库数据持久化目录(.gitignore) │ └── shared-files/ # 各站点共享文件目录 ├── website1/ # 站点1源码目录 ├── website2/ # 站点2源码目录 ... ├── docker-compose.yml # Docker服务编排核心文件 └── .env # 环境变量配置(数据库密码等)
2. 构建自定义Apache+PHP8.1镜像
基于官方镜像扩展,适配多站点需求,编写docker/apache/Dockerfile:
# 基础镜像:Apache+PHP8.1 FROM php:8.1-apache # 启用Apache必要模块 RUN a2enmod rewrite headers # 安装应用依赖的PHP扩展(按需添加) RUN docker-php-ext-install mysqli pdo_mysql gd # 同步本地用户UID,避免文件权限问题 RUN usermod -u 1000 www-data # 挂载本地虚拟主机配置到容器 COPY conf.d/ /etc/apache2/conf.d/
3. 编写Docker Compose编排文件
docker-compose.yml定义所有服务的关联关系:
version: '3.8' services: apache-php: build: ./docker/apache ports: - "80:80" volumes: # 挂载各站点源码到容器 - ./website1:/var/www/html/website1 - ./website2:/var/www/html/website2 ... # 挂载共享文件目录 - ./docker/shared-files:/var/www/html/shared-files # 挂载Apache日志到本地 - ./docker/apache/logs:/var/log/apache2 depends_on: - mysql networks: - lamp-internal mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: ${DB_ROOT_PWD} MYSQL_DATABASE: ${SHARED_DB_NAME} volumes: # 持久化数据库数据 - ./docker/mysql/data:/var/lib/mysql # 自动执行初始化脚本(创建共享库表) - ./docker/mysql/init.d:/docker-entrypoint-initdb.d ports: - "3306:3306" networks: - lamp-internal networks: lamp-internal: driver: bridge
同时创建.env文件管理敏感变量:
DB_ROOT_PWD=your-secure-password SHARED_DB_NAME=shared_app_db
4. 配置Apache虚拟主机
在docker/apache/conf.d/下为每个站点创建独立配置文件,比如website1.conf:
<VirtualHost *:80> ServerName website1.test DocumentRoot /var/www/html/website1 <Directory /var/www/html/website1> AllowOverride All Require all granted </Directory> ErrorLog /var/log/apache2/website1-error.log CustomLog /var/log/apache2/website1-access.log combined </VirtualHost>
其他站点配置同理,确保ServerName与原Homestead配置一致,DocumentRoot对应容器内挂载路径。
5. 本地域名解析配置
和Homestead逻辑一致,修改本地hosts文件添加域名映射:
127.0.0.1 website1.test website2.test ...
6. 数据库共享配置
如果各站点需要共享部分库表,在docker/mysql/init.d/下创建SQL脚本(如shared-tables.sql),写入共享库表的初始化语句,MySQL容器启动时会自动执行该脚本。各站点的数据库连接配置中,主机名填写mysql即可(Docker内部DNS会自动解析到MySQL容器)。
7. 新开发者快速部署流程
给团队提供标准化部署步骤:
- 克隆项目仓库
- 安装Docker与Docker Compose
- 复制
.env.example为.env,配置数据库密码 - 执行
docker-compose up -d启动所有服务 - 添加本地
hosts域名映射 - 直接访问各站点域名即可使用
内容的提问来源于stack exchange,提问作者Flunch
相关产品推荐
相关产品推荐

