【问题标题】:Docker for Windows can't hit RabbitMQ ip unless port is bound to localhostDocker for Windows 无法访问 RabbitMQ ip,除非端口绑定到 localhost
【发布时间】:2021-02-26 17:59:45
【问题描述】:

尝试为rabbitmq和其他一些服务构建开发环境。阅读 docker hub 后,我应该能够通过访问 http://container-ip:15672 获取在此处 (https://hub.docker.com/_/rabbitmq/) 找到的图像后访问 RabbitMQ 管理。这对我不起作用。如果我公开端口 15672,以便 localhost:15672 映射到容器 15672,我可以通过 http://localhost:15672 访问预期的输出。对 docker 来说仍然很新,所以认为我在这里缺少一些关于网络的基本知识。如果可能的话,我宁愿不要像那样绑定本地主机上的端口。

Dockerfile

FROM rabbitmq:3-management

RUN apt-get update \
    && apt-get install -y --no-install-recommends vsftpd \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

RUN mkdir -p /var/run/vsftpd/empty \
 && mkdir -p /etc/vsftpd \
 && mkdir -p /var/ftp \
 && mv /etc/vsftpd.conf /etc/vsftpd.orig \
 && mkdir -p /etc/service/vsftpd

ADD vsftpd.sh /etc/service/vsftpd/run
VOLUME ["/var/ftp"]

EXPOSE 20-21
EXPOSE 65500-65515

DockerRun.bat

docker build -t dev-environment .
docker run -d --hostname my-rabbit --name some-rabbit -it dev-environment 
docker inspect --format "RabbitMQ management @ http://{{ .NetworkSettings.IPAddress }}:15672" some-rabbit

来自 docker 检查的输出

docker inspect --format "RabbitMQ management @ http://172.17.0.2:15672" some-rabbit

【问题讨论】:

  • 为什么要安装 FTP 守护程序?为什么要查找容器专用 IP 地址?你是如何启动容器的(你有什么docker run -p 选项)?当您尝试调用 localhost:15672 时会出现什么错误?
  • 嘿@DavidMaze 我正在安装一个 FTP 守护程序,因为我正在处理的开发项目正在设置一个现代事件系统,该系统将在旧系统将 FTP 上传到某个位置时做出响应。我已经用现场机器证明了该系统,但我的公司希望我将系统容器化以进行测试和开发。运行命令在上面的 .bat 文件中。我希望我不必使用 -p 并绑定本地端口。我已经能够通过这样做并让它在本地主机上工作来让它工作。我希望在没有我链接的中心页面的情况下让它工作。
  • 你需要两个独立的容器,而且你几乎总是需要一个-p 选项来使端口可以从容器外部访问。 docker inspect IP 地址是一个实现细节,在许多常见上下文中不起作用(包括它在 Windows 主机上根本不起作用)。
  • 啊,所以 Docker for Windows 的功能不起作用?好吧,这可能是事情。该文档特别说明您不必使用 -p 并且可以通过内部 ip 进行连接。这将是本地测试环境的首选方法,因此它不会干扰其他事情。我可以做一个 docker compose 文件并使用 2 个不同的容器。我对 docker 很陌生,这是我第一次使用它。所以任何见解都是有帮助的。

标签: docker rabbitmq


【解决方案1】:

只需要在运行容器的时候绑定端口,所以

docker run -d --hostname my-rabbit --name some-rabbit -p15672:15672 -p5672:5672 -it dev-environment

您可以使用 -P 发布所有公开的端口。见docker run reference

编辑:

如果您不想将端口绑定到本地主机(TBH,我认为没有理由不这样做:))但仍想从主机上的浏览器打开管理 UI,您可以在主机网络中冷运行容器通过传递--network=host,然后使用 docker inspect 找出分配给该容器的 IP 地址...

【讨论】:

  • 嘿@cantSleep现在我试图避免这种情况并从内部IP地址运行它,就像提到的rabbitmq集线器是可能的。有人提到该功能在 Windows 上不起作用,所以看起来我必须执行上述操作。我以前也有过这样的工作。
  • 对不起,感谢您清理它,我会编辑我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多