【发布时间】:2016-09-25 02:45:06
【问题描述】:
我正在将 Apache 配置从基于主机的普通 Ubuntu 迁移到基于容器的 CoreOS。 我只有一个 CoreOS 实例用于探索性目的和个人用途,所以我真的不需要云基础设施兼容的解决方案来完成这项任务。 假设所有容器都在同一台物理机器上运行。
那个 Apache 配置是一个带有 ProxyPreserveHost On 的虚拟主机 ProxyPass。在主机上安装了 Apache 而没有 Docker 的 Ubuntu 上,一切都很好。目标是在同一台机器上托管多个 Web 服务,每个 Web 服务位于其自己的子域中,端口为 443。
例如,我目前在我的 CoreOS 上安装:
- example.com(网站)
- gitlab.example.com (gitlab)
- jenkins.example.com (jenkins)
- sonar.example.com(声纳)
- monitoring.app.example.com (python)
- event.api.example.com (java)
- legacy.api.example.com (php)
这些网络服务中的每一项都在单独的容器中运行,并且它们的端口未发布(无法从 Internet 访问)。至于 Apache,它在自己的容器上运行,并且它的端口是暴露的。
我正在使用容器链接来实现虚拟主机到 ProxyPass 的行为:--link gitlab:gitlab \ 和 ProxyPass / https://gitlab:443/
我现在面临一个问题:如果我查看 Apache 日志,我可以看到传入连接正在使用预期的客户端 IP 地址进行记录。但是,目标容器看到的记录传入连接是容器的 IP 地址,即172.17.0.1。
由于目标容器 Web 服务(gitlab、python、java、php...)的多样性,我无法调整这些 Web 服务的实现,以便它们从另一个位置选择 IP,比如说@ 987654326@.
有什么方法可以让目标容器看到如果它们不在 Docker 中运行时它们会看到的所需 IP 地址?只要完成所需的用例(端口 443 暴露给 Internet:一个域 -> 一个 Web 服务,保留客户端 IP),我就愿意接受涉及丢弃 Apache HTTP 的解决方案。
请注意,我无法在 Apache 服务器上使用 --net=host,因为此选项与容器链接不兼容。
【问题讨论】:
-
--net=host 与--link 不兼容,你用的是什么版本的docker
-
@Shibashis “来自守护进程的错误响应:冲突选项:--net=host 不能与链接一起使用。这将导致未定义的行为”与“Docker 版本 1.9.1,内部版本 9894698”