我目前正在建立一个由不同的 Docker 容器组成的系统,这些容器必须以某种方式相互通信。
一个 Docker 容器专用于 XMPP 服务器(韵律)。此容器通过下列步骤启动docker-compose.yml
:
version: "3.8"
services:
prosody_server:
container_name: prosody_server
build:
context: ./
dockerfile: Dockerfile
ports:
- "5222:5222"
- "5269:5269"
- "5347:5347"
当我在该容器上运行时docker ports
,我得到以下输出,表明端口映射有效:
5222/tcp -> 0.0.0.0:5222
5269/tcp -> 0.0.0.0:5269
5347/tcp -> 0.0.0.0:5347
第二个 Docker 容器运行一个 Python 脚本,该脚本与 XMPP 服务器交互并进一步托管一个简单的 Web 界面。我的问题是,如果我在启动Python 脚本的文件network_mode: "host"
中设置,由于某种原因,第二个 Docker 容器只能与第一个容器中的 XMPP 服务器通信docker-compose.yml
:
version: '3.8'
services:
python_script:
build:
context: ../
dockerfile: docker/Dockerfile
container_name: python_script
stdin_open: true
network_mode: 'host'
working_dir: '/python'
command: bash -c 'python main.py'
在这种情况下,我可以使用 Python 脚本成功运行 Docker 容器,并且它能够与 XMPP 服务器通信。
但是,在这种情况下无法访问 Web 界面。它使用库托管aiohttp
并提供服务0.0.0.0:8080
。
使用为 Python 脚本提供服务的 Docker 容器的 bash,我可以通过输入成功请求界面curl localhost:8080
,但无法从容器外部访问它。
据我所知,使用network_mode: "host"
理论上可以使curl localhost:8080
我的主机上类似地使用,但不起作用。
更改 XMPP 服务器的 Docker 容器或 Python 脚本容器的网络配置也不起作用,因为这会干扰这些容器之间的通信。
我还为防火墙添加了例外并暂时完全禁用它,但这并不能解决问题。