使用主机名访问Docker容器中的Apache服务器

使用主机名访问Docker容器中的Apache服务器,apache,dns,docker,Apache,Dns,Docker,我有一个使用Apache2.4.6和CentOS在Docker容器中运行的web应用程序;这个应用程序又通过Docker链接与其他几个Docker容器(如后端服务和mysql)通信。我可以使用boot2docker vm的ip本地连接到应用程序容器,即http://192.168.59.103:80/。但是,我希望能够通过带有子域的域名在本地访问它,即http://test.mydomain.com。原因是应用程序使用$\u SERVER['HTTP\u HOST']变量对请求进行身份验证,反过

我有一个使用Apache2.4.6和CentOS在Docker容器中运行的web应用程序;这个应用程序又通过Docker链接与其他几个Docker容器(如后端服务和mysql)通信。我可以使用boot2docker vm的ip本地连接到应用程序容器,即
http://192.168.59.103:80/
。但是,我希望能够通过带有子域的域名在本地访问它,即
http://test.mydomain.com
。原因是应用程序使用
$\u SERVER['HTTP\u HOST']
变量对请求进行身份验证,反过来,后端服务使用
HTTP\u ORIGIN
头对来自web应用程序的请求是否来自有效子域进行身份验证。因此,在浏览器中测试应用程序时,我需要它正确发送这些HTTP头。我只需要为本地环境而不是部署配置它(特别是为了对应用程序运行连续集成测试)。我真的不知道如何配置我的本地系统(OSXMavericks)和CI环境(Ubuntu12.04),使域名可以访问

这是我当前的配置:

httpd.conf

DocumentRoot/var/www/site
服务器别名172*
ServerName mydomain.com
在上使用CanonicalName
选项如下符号链接
允许超越所有
命令允许,拒绝
通融
这是我运行以启动web应用程序容器的命令:

docker run-d-p 80:80-h mydomain.com——名称web——链接mysql:mysql——链接memcached:memcached——链接服务:服务——链接api:base api myorg/mywebapp:develope


在此设置下,我可以在
http://192.168.59.103
但由于HTTP\u主机是IP,应用程序不会解析子域,也不会对登录进行身份验证。有没有办法让对something.mydomain.com的本地请求重定向到docker容器?apache配置中的
ServerName mydomain.com
行以及
docker run
命令中的
-h mydomain.com
参数有什么用途?

docker run-h
from

-h HOSTNAME或--HOSTNAME=HOSTNAME-设置容器识别自身的主机名。这被写入/etc/hostname,/etc/hosts作为容器的面向主机的IP地址的名称,并且是容器中的/bin/bash将在其提示符中显示的名称。但是,从容器外部很难看到主机名。它不会出现在docker ps或任何其他容器的/etc/hosts文件中

因此,您应该无法使用主机名ping容器,但此命令对于apache设置非常有用

Apache服务器名执行以下操作,从:

ServerName指令设置服务器用于标识自身的请求方案、主机名和端口。这在创建重定向URL时使用

此外,当使用基于名称的虚拟主机时,ServerName(可能与ServerAlias结合使用)用于唯一标识虚拟主机

要访问子域,您需要一个。您还必须在主机文件中输入vm(192.168.59.103)的IP地址,名称为mydomain.com。如果您已经这样做了,您应该能够ping mydomain.com


下面是一个例子(来自askubuntu的问题)。

显然,我所需要做的就是在我的/etc/hosts文件中添加一行:

192.168.59.103 sub.mydomain.com


我可以在浏览器中找到这个地址,子域将被正确解析。我仍然不明白docker run-h选项是如何影响这一点的,但至少它是有效的。这不是很容易扩展,因为我可能希望将来使用多个子域,并将它们全部路由到web app容器(根据子域的不同,它将提供不同的页面)。

您可以定义容器的主机名和域名,并使用shell脚本为您更新/etc/hosts

在这里你可以找到一些关于如何:

可以创建一个docker应用程序,该应用程序将侦听docker api(启动和停止),并更新主机和来宾之间的共享/etc/hosts文件(作为一个优雅的自动化解决方案)。看一看,例如RubyAPI:,可能与bjeanes/ghost主机管理器(github)结合使用

更新:

另一种方法是在主机上添加网桥网络,提供静态ip地址,如
192.168.33.100

然后使用docker端口转发,它也接受IP地址。在docker compose yaml中,语法为:

端口:
- "192.168.33.100:80:80" 需要使用指向域url的IP更新文件
/etc/hosts
。这种方式可以添加许多具有不同静态IP的网桥,每个docker项目只需修改/etc/hosts文件


最后一个解决方案看起来是最优雅的。

这一行是添加到容器或主机的
/etc/hosts
文件中的吗。我正准备这么做,根据我目前的阅读,我的理解是,
docker run-h
已经在容器中这样做了。那么,您是说它没有,您必须在容器内手动更改
/etc/hosts
?或者您是说您必须更改托管服务器的
/etc/hosts
文件?我猜是后者,但你能确认吗?@senderle无需触摸容器中的
/etc/hosts
文件。只需在主机的
/etc/hosts
文件中添加域名,您的请求将被路由到本地主机,然后由容器服务器响应。
<VirtualHost *:80>
    DocumentRoot /var/www/site
    ServerAlias 172.*
    ServerName mydomain.com
    UseCanonicalName On

    <Directory "/var/www/site">
        Options FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>