apache docker容器与rstudio容器进行通信

时间:2018-01-11 18:40:39

标签: apache docker rstudio-server

我最近一直在玩docker和apache这两个我都不太了解。

我遇到有关同一主机上2个docker容器之间通信的问题。

一个容器运行apache,选项-p 80:80。 转到localhost:80显示默认的apache页面

我有第二个容器运行摇杆/ rstudio图像,选项为-p 8787:8787。 转到localhost:8787按预期显示rstudio登录页面。

我想在我的apache容器内部使得localhost / rstudio将我带到摇杆容器中运行的rstudio的登录页面。

据我所知,apache容器应该能够看到localhost:8787,在sites-available下我有以下rstudio.conf文件

<VirtualHost *:80>

  <Proxy *>
    Allow from localhost
  </Proxy>

  # Specify path for Logs
  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined
  RewriteEngine on

  # Following lines should open rstudio directly from the url
  # Map rstudio to rstudio/
  RedirectMatch ^/rstudio$ /rstudio/

  RewriteCond %{HTTP:Upgrade} =websocket
  RewriteRule /rstudio/(.*) ws://localhost:8787/$1 [P,L]
  RewriteCond %{HTTP:Upgrade}     !=websocket
  RewriteRule /rstudio/(.*) http://localhost:8787/$1 [P,L]
  ProxyPass /rstudio/     http://localhost:8787/
  ProxyPassReverse /rstudio/ http://localhost:8787/
  ProxyRequests off
</VirtualHost>

正如rstudio服务器配置文档所建议的那样。然而localhost:80 / rstudio返回404,我不明白为什么。有没有人对如何解决这个问题有任何建议?

我想从apache容器内部执行此操作而不是仅在摇杆容器中安装apache的主要原因是apache容器也可以管理其他连接的容器。

1 个答案:

答案 0 :(得分:1)

  

据我所知,apache容器应该能够看到localhost:8787,在sites-available下我有以下rstudio.conf文件

几乎。从apache docker容器内部,localhost是该容器,而不是主机。

如果你想看看我在说什么,请进入正在运行的apache容器和curl localhost:8787。你将获得一个404.现在在8787的apache容器中添加另一个vhost并启用它,然后再从容器curl localhost:8787内部获取新vhost的内容。

执行所要求的两个最直接的选项可能是自定义网络或使用docker-compose。

自定义网络

docker network create jamie-rowan-network
docker run -itd -p 80:80  --network jamie-rowan-network --name apache <image>
docker run -itd -p 8787:8787 --network jamie-rowan-network --name rstudio <image>

这会创建一个名为jamie-rowan-network的bridge网络。运行容器时,将它们添加到此网络。嵌入式网络DNS还具有服务发现功能,因此您的容器将能够通过运行中给出的--name相互解析。 (建议阅读here

现在,您应该可以使用curl rstudio:8787从apache容器中解析rstudio容器。

重要提示:在Docker 1.10之前和之后,这种行为有点不同,请务必查看我上面链接的文档。我假设你在&gt; 1.10。

<强>搬运工-撰写

docker-compose是一种旨在使容器编排更简单的工具。在这种情况下,它几乎完成了自定义网络所需的所有提升,无需您的工作。我不会介绍如何编写docker-compose.yml,但是docker-compose.yml中列出的任何服务都可以通过其他服务按名称访问。

示例:

version: '3'
services:
  apache:
    image: <image>
    ports:
      - 80:80
  rstudio:
    image: <image>
    ports:
      - 8787:8787

这将完成与自定义网络相同的操作; rstudio可以从带有curl rstudio:8787的apache容器到达,而另一方面,可以通过curl apache:80

从rstudio访问apache