我最近一直在玩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容器也可以管理其他连接的容器。
答案 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