【发布时间】:2022-01-30 17:19:22
【问题描述】:
以下我想实现:
在服务器 A 上安装了 docker。假设有 3 个容器:
- 容器 1:App1,ip:172.17.0.2,网络:mynet,简单 HTML 欢迎页面,可通过端口 80 访问
- 容器 2:App2,ip:172.17.0.3,网络:mynet,Wiki 系统 -> dokuwiki,可通过端口 8080 访问
- 容器 3:App3,ip:172.17.0.4,网络:mynet,其他东西
您可以看到,每个容器都在同一个 Docker 网络中。容器可以通过不同的端口访问。
同一网络上的客户端需要访问所有容器。在这种情况下我不能使用 DNS(通过 VHOST 反向代理),因为我无法控制 DNS。我的目标:
- 容器 1:可通过http://myserver.home.local/app1/ 访问
- 容器 2:可通过http://myserver.home.local/app2/ 访问
- 容器 3:可通过http://myserver.home.local/app3/ 访问
我为解决这个问题所做的如下:使用 nginx 添加另一个容器,并对容器执行 proxy_pass。我使用官方的 nginx 映像(docker pull nginx),然后将我的自定义配置挂载到 /etc/nginx/conf.d 目录中。我的配置如下所示:
server {
location / {
root /usr/share/nginx/html;
index: index.html index.htm;
}
location /app1/ {
proxy_pass http://app1/
}
location /app2/ {
proxy_pass http://app2:8080/
}
location /app3/ {
proxy_pass http://app3/
}
}
app1 确实有效。 app2 没有:它打印出一些丑陋的 html 输出。在浏览器 Web 控制台中,我看到很多 404。我猜这与 nginx 的 Reverse / Rewrite 有关,因为 app2 是 Dokuwiki。我还为 nginx 添加了等效的 apache ProxyPassReverse,但没有成功。
我只是不知道在这种情况下该怎么做,或者从哪里开始。我怎么知道,要重写什么?我希望有人可以帮助我。
【问题讨论】:
-
我猜 docuwiki 设置引用了静态资产。您可能需要对其进行配置,以便它知道它不是托管在基本 URL
/上,而是托管在/app2上。否则内部生成的静态资源链接会出错。 -
如果 app2 正在监听 8080 端口,那么您需要将其指定为
proxy_pass http://app2:8080/ -
@HansKilian 对不起,我已经这样做了。我的错。我更正了帖子。