在 docker 中部署 apache 虚拟主机需自定义 vhosts.conf 并挂载生效,核心是通过 dockerfile 或挂载方式启用 include 指令加载虚拟主机配置,同时分别挂载各站点 documentroot 目录,并在宿主机 /etc/hosts 中映射域名。

在 Docker 中部署 Apache 虚拟主机,核心是让容器内的 Apache 识别并响应多个域名(或路径),关键不在“装 Apache”,而在“配好虚拟主机配置并正确挂载生效”。官方 httpd 镜像默认不启用 vhost 支持,需自定义配置文件并确保其被加载。
一、准备虚拟主机配置文件
Apache 的虚拟主机通过 <virtualhost></virtualhost> 指令块定义。你需要一个独立的配置文件(如 vhosts.conf),放在容器能读取的位置。
- 创建本地目录结构:
mkdir -p ./apache/conf && cd ./apache - 新建
conf/vhosts.conf,内容示例(支持两个域名):
ServerName site-a.local
DocumentRoot "/var/www/site-a"
Require all granted
ServerName site-b.local
DocumentRoot "/var/www/site-b"
Require all granted
- 注意:
ServerName是逻辑标识,实际访问时需在宿主机/etc/hosts中映射到容器 IP(如127.0.0.1 site-a.local site-b.local)
二、挂载配置并启用 vhost 模块
官方镜像默认未加载虚拟主机相关模块,且主配置中未包含 vhosts.conf。需通过自定义 Dockerfile 或覆盖主配置实现。
PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
- 方法 A(推荐):用
Dockerfile构建新镜像
新建Dockerfile:
FROM httpd:2.4
COPY ./conf/vhosts.conf /usr/local/apache2/conf/extra/vhosts.conf
RUN echo "Include conf/extra/vhosts.conf" >> /usr/local/apache2/conf/httpd.conf - 方法 B(轻量):直接挂载修改后的主配置
复制原始httpd.conf,在末尾添加Include conf/extra/vhosts.conf,再挂载:docker run -d -p 80:80 \-v $(pwd)/conf/vhosts.conf:/usr/local/apache2/conf/extra/vhosts.conf:ro \-v $(pwd)/httpd.conf:/usr/local/apache2/conf/httpd.conf:ro \httpd:2.4
三、挂载各站点根目录
每个 VirtualHost 的 DocumentRoot 必须指向容器内真实路径,因此需分别挂载对应静态文件目录。
- 创建本地站点目录:
mkdir -p ./www/site-a ./www/site-b - 放入测试文件,例如:
echo "<h1>Site A</h1>" > ./www/site-a/index.htmlecho "<h1>Site B</h1>" > ./www/site-b/index.html - 运行容器时挂载全部路径:
docker run -d -p 80:80 \-v $(pwd)/conf/vhosts.conf:/usr/local/apache2/conf/extra/vhosts.conf:ro \-v $(pwd)/www/site-a:/var/www/site-a:ro \-v $(pwd)/www/site-b:/var/www/site-b:ro \httpd:2.4
四、验证与调试
启动后,先确认配置语法无误,再检查服务是否按预期响应不同域名。
- 进入容器验证配置:
docker exec -it httpd -t(应输出Syntax OK) - 查看日志快速定位问题:
docker logs(常见错误包括路径不存在、权限拒绝、ServerName未解析) - 浏览器访问:
→http://site-a.local应显示 Site A
→http://site-b.local应显示 Site B
(前提是宿主机/etc/hosts已添加对应条目)










