Docker容器中的Apache HTTP ProxyPass链接到其他容器:由链接容器

时间:2016-05-26 22:19:55

标签: apache docker coreos

我正在将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)

这些Web服务中的每一个都在不同的容器中运行,并且其端口 NOT 已发布(无法从Internet访问)。至于Apache,它在自己的容器上运行,其端口 暴露。

我正在使用容器链接来实现ProxyPass行为的虚拟主机:--link gitlab:gitlab \ProxyPass / https://gitlab:443/

我现在面临一个问题:如果我观看Apache日志,我可以看到传入的连接正在使用预期的客户端IP地址进行记录。但是,目标容器看到的记录的传入连接是容器的IP地址,即172.17.0.1

由于目标容器Web服务(gitlab,python,java,php ...)的多样性,我无法调整这些Web服务的实现,以便他们从其他位置选择IP&#39 ; s说X-Forwarded-For

如果目标容器看不到他们在Docker中运行时会看到的IP地址,那会是什么方法呢?我愿意接受丢弃Apache HTTP的解决方案,只要完成所需的用例(端口443暴露给Internet:一个域 - >一个Web服务,保留客户端IP)。

请注意,我无法在Apache服务器上使用--net=host,因为此选项与容器链接不兼容。

1 个答案:

答案 0 :(得分:1)

链接是正在逐步淘汰的传统技术,但您是对的,容器共享主机网络无法连接到任何其他网络类型。

# docker network connect bridge container
Error response from daemon: Container sharing network namespace with another container or host cannot be connected to any other network

使用pipework将您的apache连接到外部网络。将apache和所有其他容器放在桥接网络中以提供内部连接。

一旦“实验性”构建出来,请留意macvlan driver你应该使用的,而不是管道。