- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想构建一个模块化系统,其中的模块通过 ZeroMQ 进行通信。为了提高可用性,我想对其中一些模块进行 Dockerize,这样用户就不必设置环境了。但是,我无法让 Docker 化的发布者让非 Docker 化的订阅者接收其消息。
zmq_sub.py
# CC0
import zmq
def main():
# ZMQ connection
url = "tcp://127.0.0.1:5550"
ctx = zmq.Context()
socket = ctx.socket(zmq.SUB)
socket.bind(url) # subscriber creates ZeroMQ socket
socket.setsockopt(zmq.SUBSCRIBE, ''.encode('ascii')) # any topic
print("Sub bound to: {}\nWaiting for data...".format(url))
while True:
# wait for publisher data
topic, msg = socket.recv_multipart()
print("On topic {}, received data: {}".format(topic, msg))
if __name__ == "__main__":
main()
zmq_pub.py
# CC0
import zmq
import time
def main():
# ZMQ connection
url = "tcp://127.0.0.1:5550"
ctx = zmq.Context()
socket = ctx.socket(zmq.PUB)
socket.connect(url) # publisher connects to subscriber
print("Pub connected to: {}\nSending data...".format(url))
i = 0
while True:
topic = 'foo'.encode('ascii')
msg = 'test {}'.format(i).encode('ascii')
# publish data
socket.send_multipart([topic, msg]) # 'test'.format(i)
print("On topic {}, send data: {}".format(topic, msg))
time.sleep(.5)
i += 1
if __name__ == "__main__":
main()
当我打开 2 个终端并运行时:
订阅者正确接收数据(关于主题 b'foo',收到的数据:b'test 1'
)
我创建了以下Dockerfile
:
FROM python:3.7.1-slim
MAINTAINER foo bar <<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="187e7777586b687975367d7f7f6b" rel="noreferrer noopener nofollow">[email protected]</a>>
RUN apt-get update && \
apt-get install -y --no-install-recommends \
gcc
WORKDIR /app
COPY requirements.txt /app
RUN pip install -r requirements.txt
COPY zmq_pub.py /app/zmq_pub.py
EXPOSE 5550
CMD ["python", "zmq_pub.py"]
然后我使用以下命令成功构建了一个 Dockerized 发布者: sudo docker build 。 -t foo/bar
现在我有了带有发布者的 docker 容器,我正在尝试让我的非 docker 订阅者接收数据。我运行以下 2 个命令:
python zmq_sub.py
sudo docker run -it foo/bar
我看到我的发布者在容器内发布数据,但我的订阅者什么也没收到。
由于我必须将 dockerized 发布者的内部端口映射到我机器的端口,因此我运行以下 2 个命令:
python zmq_sub.py
sudo docker run -p 5550:5550 -it foo/bar
However, then I receive the following error: docker: Error response from daemon: driver failed programming external connectivity on endpoint objective_shaw (09b5226d89a815ce5d29842df775836766471aba90b95f2e593cf5ceae0cf174): Error starting userland proxy: listen tcp 0.0.0.0:5550: bind: address已在使用。
在我看来,我的订阅者已经绑定(bind)到 127.0.0.1:5550
,因此当我尝试映射它时 Docker 无法再执行此操作。如果我将其更改为 -p 5549:5550
,Docker 不会给出错误,但情况与尝试 1 相同。
如何让我的 Docker 化发布者向我的非 Docker 化订阅者发布数据?
编辑 1:更新了代码,还提供了如何使用 docker-compose
进行自动 IP 推断的示例。
最佳答案
这主要是一个 docker 网络问题,并不特定于 pyzmq 或 Zeromq。对于尝试从容器连接到主机的任何内容,您都会遇到同样的问题。
需要明确的是,在这个示例中,您有一个在主机上运行的服务器(zmq_sub.py,它调用bind),并且您希望从在docker内运行的客户端连接到它容器(zmq_pub.py)。
由于 docker 容器是连接的容器,因此您不需要进行任何 docker 端口暴露或转发。 EXPOSE 和转发端口仅用于使连接到容器成为可能(即在容器中调用bind
),而不是进行出站连接来自 一个容器,这就是这里发生的事情。
这里最主要的是,当涉及到与 docker 联网时,您应该将每个容器视为本地网络上的一台单独的机器。为了能够从其他容器或主机连接,服务应该绑定(bind)到所有接口(interface)(或至少是可访问的接口(interface))。绑定(bind)到容器中的本地主机意味着只有该容器中的其他进程才能与其通信。同样,在主机上绑定(bind) localhost 意味着 docker 容器不应该能够连接。
所以第一个改变是你的绑定(bind) URL 应该是:
url = 'tcp://0.0.0.0:5550'
...
socket.bind(url)
或者选择与您的 Docker 虚拟网络相对应的 IP 地址。
然后,您的 connect
url 需要是从容器中看到的主机的 IP。这可以通过 ifconfig
找到。通常任何 IP 地址都可以,但如果您有 docker0
网络,那么这将是合理的选择。
关于python-3.x - PyZMQ Dockerized pub sub - sub不会收到消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53802691/
我在产品类别和子类别网站上工作,可以创建的子类别数量是无限的,这意味着我们可以自己拥有子类别的子类别。一切正常,我只是有一个问题:假设“PRODUCT 1”属于“SUB SUB CATEGORY 1”
我正在学习OCaml,并在代码2022的到来中努力工作。。但似乎读取input.txt文件会导致一些问题。。我收到了这个奇怪的错误,它来自于函数分数。尤其是那个叫得分手HD的表达。不过,当我手动将LI
我有一个奇怪的行为(对于 Python 程序员)子例程,它简化如下: use strict; use Data::Dumper; sub a { my @x; sub b { push @x,
在此页上 http://bit.ly/T3yJIH , drupal 的 Nice Menu 模块不能正确显示子子菜单。如果转到菜单中的第一项,然后转到子菜单中的第一项,就可以看到它。 (Facili
我需要在我的站点内创建一个子结构,我在其中拥有: 实际上我是通过 Javascript 来完成的(伪代码):SUB_Content.height = ParentDiv.height - Sub_He
我有一个与子菜单一起使用的 CSS 手册。我想知道如何向它添加子子菜单。例如,我将鼠标悬停在主菜单项上并弹出子菜单,然后我将鼠标悬停在子菜单项上并弹出另一个子菜单。这是我现在使用的 JS Fiddle
我有一个关于 navmenu 的问题我不能选择导航菜单的 sub sub ul,如果我会做什么它会影响 3.ul。这是一个 wordpress 菜单我没有机会使用类或菜单的 ID。提前感谢您的帮助。
我创建了一个带有 2 级子菜单的简单导航。我正在寻找“sub sub”选项以显示在其父项的右侧而不是下方。对于 CSS 的任何帮助,我将不胜感激。下面是 html 和 css 以及 JS fiddle
我对 VBA、这个论坛和编程很陌生。我有一个工作表,我已经设法根据我的要求谷歌并调整某些代码行。 我的问题是我总共有三个潜艇,必须逐步运行每个 VBA 脚本。我希望将所有三个 VBA 脚本合二为一。
我使用 sub 调用作为另一个 sub 的参数。示例代码: test(isInString(), 'second parameter', 'third parameter'); sub test {
我想使用 HTML ui->FresBox->setText("fres"); 但它在 QCheckbox 中不起作用。如果您使用标签,它会很好用。有什么不同以及如何在 QCheckbox 中使用 H
我没有遇到这个问题,但在处理相关问题时想到了这个问题。让我们: logging = 'something' # bad naming decision import logging as lg
我正在查看 Redis pubsub,消费者是 2-4 节点自动缩放组的一部分(HA 原因) 也许我遗漏了一些明显的东西,但是 Redis pubsub 中是否有某种机制可以管理订阅者/消费者收到的重
对你们来说应该是一个快速和简单的,为什么这不起作用? 代码限制用户只能在文本框中输入文本。 它工作正常,但我有大约 50 个文本框,所以会更干净,更容易调用。 但是,这样做,限制不再起作用 Priva
(编辑)TL; DR :我的问题是,尽管Win32 API定义的是真实的整数常量(如平台SDK header 中一样),而Win32 Perl包装器将它们定义为subs。从而引起一线解析的误解。 在单
我有一个使用 Jersey 实现 REST API 的 Web 应用程序。 Web 容器 id Tomcat 以下是 API 的摘要: /rest/patients 获取患者元数据列表。 /rest/
我与 Czech 一起工作Python 3.4 中的重音文本。 调用 re.sub()用正则表达式对重音句子进行替换效果很好,但使用用 re.compile() 编译的正则表达式然后调用regex.s
对于我的一个新项目,我必须创建一个包含主类别、子类别和子子类别的类别页面。例如; 互联网 互联网 > 发展 互联网 > 开发 > 移动应用 在此类别中,您可以找到有关这些内容的网站。我必须为每个网站提
表1 - 客户数据 c_id(整数) 名称(varchar) 表2 - account_data a_id(整数) c_id (int) -> 使用customer_data。c_id plan_id
我有一些位图文件(jpeg、png、...),我想编写一个 C++ 程序,将这些位图文件连接到 pes 流(mpeg-2 格式),然后创建一个子文件(.sub/. idx:vobsub 字幕文件)。
我是一名优秀的程序员,十分优秀!