同一个 docker 容器上的多个虚拟主机
Multiple vhosts on one and the same docker container
我正在尝试 运行 同一个 Docker 容器和端口上的两个不同域。
Docker 容器 运行s CentOS。 docker-compose.yml
看起来像这样:
web:
image: fab/centos
ports:
- "80:80"
volumes:
- ./src/httpd.conf:/etc/httpd/conf/httpd.conf
- ./src:/var/www/html
- ./src/hosts:/etc/hosts
environment:
- VIRTUAL_HOST=dummy.dev,tests.dev
我还在主机上 /etc/hosts
内声明了两个 .dev 域名 (OS X.)
配置虚拟主机已经有一段时间了。我的理解是,我只需要声明它们,Apache 会根据请求的 HTTP HOST 自动提供正确的文件。
这是我在httpd.conf
末尾添加的:
<VirtualHost *:80> # first host = default host
DocumentRoot /var/www/html/default
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /var/www/html/dummy
ServerName dummy.dev
ServerAdmin webmaster@dummy.dev
ErrorLog logs/dummy.dev-error_log
CustomLog logs/dummy.dev-access_log common
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /var/www/html/tests
ServerName tests.dev
ServerAdmin webmaster@tests.dev
ErrorLog logs/tests.dev-error_log
CustomLog logs/tests.dev-access_log common
</VirtualHost>
然而,实际上,访问 dummy.dev 或 tests.dev 实际上服务于 /var/www/html/default
。这就好像 Apache 没有意识到正在调用哪个主机(尽管 PHP 中 $_SERVER
的转储确实显示了预期的 HTTP_HOST
值,即:127.0.0.1,dummy.dev 或 tests.dev 取决于我访问哪个 URL。)
我错过了什么?
我不清楚这是 Apache 问题还是 Docker 问题。
(请注意,这与如何在同一域中使用不同端口托管多个应用程序是不同的问题。就我而言,我确实希望虚拟主机全部 inside/on 相同 app/port/container.)
fab/centos
在 public docker 集线器中不存在,因此不确定您遇到此问题的原因。
我的建议是退后一步,尝试用一个简单的例子让它发挥作用。
docker search apache
产生 eboraas/apache
作为最加星标的图像,所以我将使用那个作为示例。
在测试目录中,使用您的示例:
文件:httpd.conf
<VirtualHost *:80> # first host = default host
DocumentRoot /var/www/html/default
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /var/www/html/dummy
ServerName dummy.dev
ServerAdmin webmaster@dummy.dev
ErrorLog logs/dummy.dev-error_log
CustomLog logs/dummy.dev-access_log common
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /var/www/html/tests
ServerName tests.dev
ServerAdmin webmaster@tests.dev
ErrorLog logs/tests.dev-error_log
CustomLog logs/tests.dev-access_log common
</VirtualHost>
然后创建虚拟主机网站和日志目录。
mkdir -p logs; for i in default tests dummy; do mkdir -p $i; echo "hello $i" > $i/index.html; done
最后,运行 docker.
docker run -it -v $(pwd):/var/www/html -v $(pwd)/httpd.conf:/etc/apache2/sites-available/000-default.conf -v $(pwd)/logs:/etc/apache2/logs -p 9090:80 --rm --name apache_c eboraas/apache
请注意,我使用的卷与您在 docker-compose.yml 中使用的卷基本相同,只是我使用 site-available
而不是更改 httpd.conf。
要进行测试,请确保 /etc/hosts 中的 tests.dev 和 dummy.dev 指向正确的 Docker IP 并测试:
$> curl dummy.dev:9090
hello dummy
$> curl tests.dev:9090
hello tests
从这一点开始,首先尝试使用您正在使用的 docker apache 映像,然后尝试使用您的自定义 /etc/hosts 文件,然后将其放回 docker-编写文件
原来这是 Apache 配置问题。
我需要显式启用域名虚拟主机,如下所示:
NameVirtualHost *:80
Docker与此事无关
在您的 httpd 配置中开启 NameVirtualHost:
文件:/etc/httpd/conf/httpd.conf
NameVirtualHost *:80
NameVirtualHost *:443
我正在尝试 运行 同一个 Docker 容器和端口上的两个不同域。
Docker 容器 运行s CentOS。 docker-compose.yml
看起来像这样:
web:
image: fab/centos
ports:
- "80:80"
volumes:
- ./src/httpd.conf:/etc/httpd/conf/httpd.conf
- ./src:/var/www/html
- ./src/hosts:/etc/hosts
environment:
- VIRTUAL_HOST=dummy.dev,tests.dev
我还在主机上 /etc/hosts
内声明了两个 .dev 域名 (OS X.)
配置虚拟主机已经有一段时间了。我的理解是,我只需要声明它们,Apache 会根据请求的 HTTP HOST 自动提供正确的文件。
这是我在httpd.conf
末尾添加的:
<VirtualHost *:80> # first host = default host
DocumentRoot /var/www/html/default
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /var/www/html/dummy
ServerName dummy.dev
ServerAdmin webmaster@dummy.dev
ErrorLog logs/dummy.dev-error_log
CustomLog logs/dummy.dev-access_log common
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /var/www/html/tests
ServerName tests.dev
ServerAdmin webmaster@tests.dev
ErrorLog logs/tests.dev-error_log
CustomLog logs/tests.dev-access_log common
</VirtualHost>
然而,实际上,访问 dummy.dev 或 tests.dev 实际上服务于 /var/www/html/default
。这就好像 Apache 没有意识到正在调用哪个主机(尽管 PHP 中 $_SERVER
的转储确实显示了预期的 HTTP_HOST
值,即:127.0.0.1,dummy.dev 或 tests.dev 取决于我访问哪个 URL。)
我错过了什么?
我不清楚这是 Apache 问题还是 Docker 问题。
(请注意,这与如何在同一域中使用不同端口托管多个应用程序是不同的问题。就我而言,我确实希望虚拟主机全部 inside/on 相同 app/port/container.)
fab/centos
在 public docker 集线器中不存在,因此不确定您遇到此问题的原因。
我的建议是退后一步,尝试用一个简单的例子让它发挥作用。
docker search apache
产生 eboraas/apache
作为最加星标的图像,所以我将使用那个作为示例。
在测试目录中,使用您的示例:
文件:httpd.conf
<VirtualHost *:80> # first host = default host
DocumentRoot /var/www/html/default
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /var/www/html/dummy
ServerName dummy.dev
ServerAdmin webmaster@dummy.dev
ErrorLog logs/dummy.dev-error_log
CustomLog logs/dummy.dev-access_log common
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /var/www/html/tests
ServerName tests.dev
ServerAdmin webmaster@tests.dev
ErrorLog logs/tests.dev-error_log
CustomLog logs/tests.dev-access_log common
</VirtualHost>
然后创建虚拟主机网站和日志目录。
mkdir -p logs; for i in default tests dummy; do mkdir -p $i; echo "hello $i" > $i/index.html; done
最后,运行 docker.
docker run -it -v $(pwd):/var/www/html -v $(pwd)/httpd.conf:/etc/apache2/sites-available/000-default.conf -v $(pwd)/logs:/etc/apache2/logs -p 9090:80 --rm --name apache_c eboraas/apache
请注意,我使用的卷与您在 docker-compose.yml 中使用的卷基本相同,只是我使用 site-available
而不是更改 httpd.conf。
要进行测试,请确保 /etc/hosts 中的 tests.dev 和 dummy.dev 指向正确的 Docker IP 并测试:
$> curl dummy.dev:9090
hello dummy
$> curl tests.dev:9090
hello tests
从这一点开始,首先尝试使用您正在使用的 docker apache 映像,然后尝试使用您的自定义 /etc/hosts 文件,然后将其放回 docker-编写文件
原来这是 Apache 配置问题。
我需要显式启用域名虚拟主机,如下所示:
NameVirtualHost *:80
Docker与此事无关
在您的 httpd 配置中开启 NameVirtualHost:
文件:/etc/httpd/conf/httpd.conf
NameVirtualHost *:80
NameVirtualHost *:443