Docker容器之间的IPC通信

16

两个独立的Docker容器如何通过ZMQ IPC套接字进行通信?如果可以,如何实现?

例如:

Docker容器#1执行创建ZMQ响应套接字并绑定到“ipc:// tmp / service_name”的应用程序。

Docker容器#2执行创建ZMQ请求套接字并连接到“ipc:// tmp / service_name”的应用程序。

使用以下命令在两个独立的Docker容器中运行这些应用程序:

// Run container #1 (binds to "ipc://tmp/service_name")
docker run --name c1 -it container1

// Run container #2 (connects to "ipc://tmp/service_name")
docker run -it --link c1:container1 --name c2 container2

在运行容器后,我无法建立ZMQ(IPC)连接。但是,我能够从容器2 ping通容器1,并且也能够从容器1 ping通容器2。

我还尝试使用--ipc命令,但没有帮助:

// Run container #1 (binds to "ipc://tmp/service_name")
docker run --name c1 --ipc=host -it container1

// Run container #2 (connects to "ipc://tmp/service_name")
docker run -it --link c1:container1 --ipc=container:c1 --name c2 container2

更新: 我能够使用 ZMQ TCP 套接字在两个不同的 Docker 容器之间进行通信,但是仍然无法使用 IPC 套接字进行通信。这是否可能?


1
你自己调查了什么?例如,你读过这篇文章吗? - Jeroen Heier
为什么不自己试一下,然后回报错误信息,这样我们才有助于提供帮助呢? - Andy Shinn
是的,我确实读了@JeroenHeier的那篇文章。我打算重新阅读一遍并再次尝试,看看是否有我漏掉的东西。 - milenko
我更新了原始问题,展示了我迄今为止尝试过的内容,@AndyShinn - milenko
2个回答

13

你看过Docker版本1.4.1中如何使用共享内存吗?似乎你需要分享包含IPC的卷,同时设置--ipc host。在您的示例中,可能像这样:

# Container #1
docker run -it --name c1 -v /tmp:/tmp --ipc=host container1

# Container #2
docker run -it --name c2 -v /tmp:/tmp --ipc=host container2

2
我猜实现只需要一个共享的/tmp目录。没有必要使用--ipc=host。出于安全原因,我不会共享主机的/tmp或IPC。 - Ricardo Branco
2
同意 @RicardoBranco。以下命令也可以运行:`docker run -it --name c1 -v /tmp container1docker run -it --name c2 --ipc=container:c1 --volumes-from c1 container2` - milenko
4
那我想根本不需要 --ipc=... - Ricardo Branco
没错,我根本不需要 --ipc-...。只需要 /tmp 挂载就可以了... - milenko
看起来Docker的ipc设置是用于共享内存,而不是Unix套接字,这正是ZMQ所使用的。 - orodbhen
如果不需要 --ipc=host,而且 ZMQ 只使用 Unix sockets,那么仅拥有共享的 /tmp 目录如何工作? - cogitoergosum

1

我有3个容器,其中2个容器共享数据到另一个容器,对我有效的方法是:

# container 1
docker run -it --ipc=shareable -v ///tmp --network=host --name node container1

# container 2
docker run -it --ipc=container:node --volumes-from node --network=host --name mdns container2

# container 3
docker run -it --ipc=container:node --volumes-from node --network=host --name connection container3

container1 可以获取在 container2container3 中运行的进程的 pid,从而获取容器中的数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接