You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将带多虚拟主机的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:00:58