无法访问 docker 容器上的 RabbitMQ UI
Cannot access RabbitMQ UI on docker container
我目前正在做一个项目,我在 Microsoft Azure 上有一个虚拟机,我试图在 Traefik 反向代理的帮助下通过不同的路由访问多个 Docker 容器.除了反向代理,我需要的第一个服务是 RabbitMQ,我应该能够在 /rmq
路由上访问它的用户界面。现在,我有以下 docker-compose 文件来构建这两个服务:
version: "3.5"
services:
rabbitmq:
image: rabbitmq:3-alpine
expose:
- 5672
- 15672
volumes:
- ./rabbit/enabled_plugins:/etc/rabbitmq/enabled_plugins
labels:
- traefik.enable=true
- traefik.http.routers.rabbitmq.rule=Host(`HOST.com`) && PathPrefix(`/rmq`)
# needed, when you do not have a route "/rmq" inside your container (according to
- traefik.http.routers.rabbitmq.middlewares=strip-docs
- traefik.http.middlewares.strip-docs.stripprefix.prefixes=/rmq
- traefik.port=15672
networks:
- proxynet
traefik:
image: traefik:2.1
command: --api=true # Enables the web UI
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik/traefik.toml:/etc/traefik/traefik.toml:ro
ports:
- 80:80
- 443:443
labels:
traefik.enable: true
traefik.http.routers.traefik.rule: "Host(`HOST.com`)"
traefik.http.routers.traefik.service: "api@internal"
networks:
- proxynet
这是我的 traefik.toml 文件的内容:
logLevel = "DEBUG"
debug = true
[api]
dashboard = true
insecure = false
debug = true
[providers.docker]
endpoint = "unix:///var/run/docker.sock"
watch = true
[entryPoints]
[entryPoints.web]
address = ":80"
[entryPoints.web-secure]
address = ":443"
[log]
level = "DEBUG"
format = "json"
enabled_plugins
文件指定应激活哪些 RabbitMQ 插件。在这里,我有 rabbitmq_management 插件(以及其他插件),我认为它是访问 RabbitMQ UI 所必需的。我什至检查了 RabbitMQ 容器的日志,显然 rabbitmq_management 已正确启动:
rabbitmq_1 | 2021-01-30 15:50:30.538 [info] <0.730.0> Server startup complete; 7 plugins started.
rabbitmq_1 | * rabbitmq_stomp
rabbitmq_1 | * rabbitmq_federation_management
rabbitmq_1 | * rabbitmq_mqtt
rabbitmq_1 | * rabbitmq_federation
rabbitmq_1 | * rabbitmq_management
rabbitmq_1 | * rabbitmq_web_dispatch
rabbitmq_1 | * rabbitmq_management_agent
rabbitmq_1 | completed with 7 plugins.
rabbitmq_1 | 2021-01-30 15:50:30.539 [info] <0.730.0> Resetting node maintenance status
使用这些配置 运行 docker-compose up
,如果我尝试访问 HOST。com/rmq,我会得到 502 (Bad Gateway) 浏览器控制台错误。最初,这就是我被困的地方。然而,在网上搜索一些帮助后,我发现了一种不同的方法来指定 RabbitMQ 容器标签上的 traefik 端口(traefik.http.services.rabbitmq.loadbalancer.server.port=15672
),并且通过这种修改,我不再有 Bad Request 错误,但是我在我的浏览器控制台上收到很多 ERR_ABORTED 404(未找到) 错误(下面的列表不包含所有错误):
rmq:7 GET http://HOST.com/js/ejs-1.0.min.js net::ERR_ABORTED 404 (Not Found)
rmq:18 GET http://HOST.com/js/charts.js net::ERR_ABORTED 404 (Not Found)
rmq:19 GET http://HOST.com/js/singular/singular.js net::ERR_ABORTED 404 (Not Found)
Refused to apply style from 'http://HOST.com/css/main.css' because its MIME type ('text/plain') is not a supported stylesheet MIME type, and strict MIME checking is enabled.
rmq:27 Uncaught ReferenceError: sync_get is not defined at rmq:27
我对这类项目没有太多经验,我不知道我是否做错了什么,或者这些配置或虚拟机本身的配置是否缺少某些东西。你知道我应该怎么做才能使用 URL HOST.com/rmq ?
访问 RabbitMQ UI
如果我得到这个 运行 正确,我想我也可以配置 Docker 只允许使用 [=34] 等路由访问 Traefik UI =]HOST.com/dashboard,而不是仅通过 URL 访问它而没有任何路由。
提前致谢!
在我没有使用特定工具的情况下,我是如何确定这个问题的建议答案的:
通过搜索 rabbitmq admin url
,我找到了靠近顶部的 rabbitmq 管理文档页面,提到支持 path prefix
设置。我搜索了该页面,在 relevant heading 下,发现您可能需要在 rabbitmq 配置中设置此设置:
management.path_prefix = /rmq
因此,为了将它应用于您的 docker 配置,我查阅了 rabbitmq docker image,其中讨论了配置文件需要通过绑定安装注入,或者可以通过深奥的方式提供erlang 配置我个人不会搞砸的东西。因此,我从这里开始的步骤是:
- 查看现有的 rabbitmq 映像以找出 /etc/rabbitmq/rabbitmq.conf 中的默认配置文件是什么,例如 运行
docker-compose run rabbitmq cat /etc/rabbitmq/rabbitmq.conf
,或适当的 docker cp 命令,如果事实证明 rabbitmq 设置了一个 docker ENTRYPOINT 防止在图像命令行 上使用 shell 命令
- 像启用插件一样添加一个卷,但将其向上移动一个目录,将 rabbit/ 映射到 /etc/rabbitmq/,然后将容器中的默认配置放入 rabbit/
- 将该行添加到配置文件
运气好的话,至少应该能让你们更接近。我很想知道进展如何!
顺便说一下,在查看 rabbitmq docker 图像文档时,我发现如果您需要管理接口支持,则有特殊标签。您可能会发现您需要切换到其中一个而不是普通的 3-alpine
才能使其工作,例如 rabbitmq:3-management-alpine
.
解决了。我不知道为什么,但是当我使用配置 traefik.http.services.rabbitmq.loadbalancer.server.port=15672
时,我更改了行 traefik.http.routers.rabbitmq.middlewares=strip-docs
和 traefik.http.middlewares.strip-docs.stripprefix.prefixes=/rmq
的顺序,使 prefix
出现在 [= 之前15=]。更改了它,现在我可以在 HOST.com/rmq
上访问 RabbitMQ UI。所以我最后的 docker-compose
是这样的:
version: "3.5"
services:
rabbitmq:
image: rabbitmq:3-alpine
expose:
- 5672
- 15672
volumes:
- ./rabbit/enabled_plugins:/etc/rabbitmq/enabled_plugins
labels:
- traefik.enable=true
- traefik.http.routers.rabbitmq.rule=Host(`HOST.com`) && PathPrefix(`/rmq`)
# needed, when you do not have a route "/rmq" inside your container (according to
- traefik.http.routers.rabbitmq.middlewares=strip-docs
- traefik.http.middlewares.strip-docs.stripprefix.prefixes=/rmq
- traefik.http.services.rabbitmq.loadbalancer.server.port=15672
networks:
- proxynet
traefik:
image: traefik:2.1
command: --api=true # Enables the web UI
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik/traefik.toml:/etc/traefik/traefik.toml:ro
ports:
- 80:80
- 443:443
labels:
traefik.enable: true
traefik.http.routers.traefik.rule: "Host(`HOST.com`)"
traefik.http.routers.traefik.service: "api@internal"
networks:
- proxynet
我会将此问题标记为已解决,但如果您知道为什么这两行的顺序很重要,请解释以供将来参考。
谢谢!
我目前正在做一个项目,我在 Microsoft Azure 上有一个虚拟机,我试图在 Traefik 反向代理的帮助下通过不同的路由访问多个 Docker 容器.除了反向代理,我需要的第一个服务是 RabbitMQ,我应该能够在 /rmq
路由上访问它的用户界面。现在,我有以下 docker-compose 文件来构建这两个服务:
version: "3.5"
services:
rabbitmq:
image: rabbitmq:3-alpine
expose:
- 5672
- 15672
volumes:
- ./rabbit/enabled_plugins:/etc/rabbitmq/enabled_plugins
labels:
- traefik.enable=true
- traefik.http.routers.rabbitmq.rule=Host(`HOST.com`) && PathPrefix(`/rmq`)
# needed, when you do not have a route "/rmq" inside your container (according to
- traefik.http.routers.rabbitmq.middlewares=strip-docs
- traefik.http.middlewares.strip-docs.stripprefix.prefixes=/rmq
- traefik.port=15672
networks:
- proxynet
traefik:
image: traefik:2.1
command: --api=true # Enables the web UI
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik/traefik.toml:/etc/traefik/traefik.toml:ro
ports:
- 80:80
- 443:443
labels:
traefik.enable: true
traefik.http.routers.traefik.rule: "Host(`HOST.com`)"
traefik.http.routers.traefik.service: "api@internal"
networks:
- proxynet
这是我的 traefik.toml 文件的内容:
logLevel = "DEBUG"
debug = true
[api]
dashboard = true
insecure = false
debug = true
[providers.docker]
endpoint = "unix:///var/run/docker.sock"
watch = true
[entryPoints]
[entryPoints.web]
address = ":80"
[entryPoints.web-secure]
address = ":443"
[log]
level = "DEBUG"
format = "json"
enabled_plugins
文件指定应激活哪些 RabbitMQ 插件。在这里,我有 rabbitmq_management 插件(以及其他插件),我认为它是访问 RabbitMQ UI 所必需的。我什至检查了 RabbitMQ 容器的日志,显然 rabbitmq_management 已正确启动:
rabbitmq_1 | 2021-01-30 15:50:30.538 [info] <0.730.0> Server startup complete; 7 plugins started.
rabbitmq_1 | * rabbitmq_stomp
rabbitmq_1 | * rabbitmq_federation_management
rabbitmq_1 | * rabbitmq_mqtt
rabbitmq_1 | * rabbitmq_federation
rabbitmq_1 | * rabbitmq_management
rabbitmq_1 | * rabbitmq_web_dispatch
rabbitmq_1 | * rabbitmq_management_agent
rabbitmq_1 | completed with 7 plugins.
rabbitmq_1 | 2021-01-30 15:50:30.539 [info] <0.730.0> Resetting node maintenance status
使用这些配置 运行 docker-compose up
,如果我尝试访问 HOST。com/rmq,我会得到 502 (Bad Gateway) 浏览器控制台错误。最初,这就是我被困的地方。然而,在网上搜索一些帮助后,我发现了一种不同的方法来指定 RabbitMQ 容器标签上的 traefik 端口(traefik.http.services.rabbitmq.loadbalancer.server.port=15672
),并且通过这种修改,我不再有 Bad Request 错误,但是我在我的浏览器控制台上收到很多 ERR_ABORTED 404(未找到) 错误(下面的列表不包含所有错误):
rmq:7 GET http://HOST.com/js/ejs-1.0.min.js net::ERR_ABORTED 404 (Not Found)
rmq:18 GET http://HOST.com/js/charts.js net::ERR_ABORTED 404 (Not Found)
rmq:19 GET http://HOST.com/js/singular/singular.js net::ERR_ABORTED 404 (Not Found)
Refused to apply style from 'http://HOST.com/css/main.css' because its MIME type ('text/plain') is not a supported stylesheet MIME type, and strict MIME checking is enabled.
rmq:27 Uncaught ReferenceError: sync_get is not defined at rmq:27
我对这类项目没有太多经验,我不知道我是否做错了什么,或者这些配置或虚拟机本身的配置是否缺少某些东西。你知道我应该怎么做才能使用 URL HOST.com/rmq ?
访问 RabbitMQ UI如果我得到这个 运行 正确,我想我也可以配置 Docker 只允许使用 [=34] 等路由访问 Traefik UI =]HOST.com/dashboard,而不是仅通过 URL 访问它而没有任何路由。
提前致谢!
在我没有使用特定工具的情况下,我是如何确定这个问题的建议答案的:
通过搜索 rabbitmq admin url
,我找到了靠近顶部的 rabbitmq 管理文档页面,提到支持 path prefix
设置。我搜索了该页面,在 relevant heading 下,发现您可能需要在 rabbitmq 配置中设置此设置:
management.path_prefix = /rmq
因此,为了将它应用于您的 docker 配置,我查阅了 rabbitmq docker image,其中讨论了配置文件需要通过绑定安装注入,或者可以通过深奥的方式提供erlang 配置我个人不会搞砸的东西。因此,我从这里开始的步骤是:
- 查看现有的 rabbitmq 映像以找出 /etc/rabbitmq/rabbitmq.conf 中的默认配置文件是什么,例如 运行
docker-compose run rabbitmq cat /etc/rabbitmq/rabbitmq.conf
,或适当的 docker cp 命令,如果事实证明 rabbitmq 设置了一个 docker ENTRYPOINT 防止在图像命令行 上使用 shell 命令
- 像启用插件一样添加一个卷,但将其向上移动一个目录,将 rabbit/ 映射到 /etc/rabbitmq/,然后将容器中的默认配置放入 rabbit/
- 将该行添加到配置文件
运气好的话,至少应该能让你们更接近。我很想知道进展如何!
顺便说一下,在查看 rabbitmq docker 图像文档时,我发现如果您需要管理接口支持,则有特殊标签。您可能会发现您需要切换到其中一个而不是普通的 3-alpine
才能使其工作,例如 rabbitmq:3-management-alpine
.
解决了。我不知道为什么,但是当我使用配置 traefik.http.services.rabbitmq.loadbalancer.server.port=15672
时,我更改了行 traefik.http.routers.rabbitmq.middlewares=strip-docs
和 traefik.http.middlewares.strip-docs.stripprefix.prefixes=/rmq
的顺序,使 prefix
出现在 [= 之前15=]。更改了它,现在我可以在 HOST.com/rmq
上访问 RabbitMQ UI。所以我最后的 docker-compose
是这样的:
version: "3.5"
services:
rabbitmq:
image: rabbitmq:3-alpine
expose:
- 5672
- 15672
volumes:
- ./rabbit/enabled_plugins:/etc/rabbitmq/enabled_plugins
labels:
- traefik.enable=true
- traefik.http.routers.rabbitmq.rule=Host(`HOST.com`) && PathPrefix(`/rmq`)
# needed, when you do not have a route "/rmq" inside your container (according to
- traefik.http.routers.rabbitmq.middlewares=strip-docs
- traefik.http.middlewares.strip-docs.stripprefix.prefixes=/rmq
- traefik.http.services.rabbitmq.loadbalancer.server.port=15672
networks:
- proxynet
traefik:
image: traefik:2.1
command: --api=true # Enables the web UI
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik/traefik.toml:/etc/traefik/traefik.toml:ro
ports:
- 80:80
- 443:443
labels:
traefik.enable: true
traefik.http.routers.traefik.rule: "Host(`HOST.com`)"
traefik.http.routers.traefik.service: "api@internal"
networks:
- proxynet
我会将此问题标记为已解决,但如果您知道为什么这两行的顺序很重要,请解释以供将来参考。
谢谢!