使用 Docker 撰写时容器之间的连接被拒绝

Connection refused between containers when using Docker compose

我一直在 GCP VM 中出于学习目的测试 Docker,我的项目中有两个容器:

  1. 第一个容器是一个nodejsAPI,它returnsjson在访问端口80上的VM地址时格式化数据。
  2. 第二个容器是一个 python flask 服务器,当访问端口 5000 上的 VM 地址时,它会在网站上显示此数据。

我已经测试了两个容器,当我从 public 网络访问它们时我能够访问它们。我在 python flask 服务器中所做的是使用 VM IP public 地址和这个简单的代码访问 API 并在浏览器中显示内容:

from flask import Flask
from urllib.request import urlopen
import json
app = Flask(__name__)
@app.route("/")
def dataserver():
        with urlopen("http://xxx.xxx.xxx.xxx/api/devices") as url:
                data = json.loads(url.read().decode())
                return data
if __name__ == "__main__":
        app.run(host="0.0.0.0", port=int("5000"), debug=True)

这没有问题,内容按预期显示。但是现在我想 运行 这个容器使用 docker-compose 并使它们能够使用 docker-compose 服务名称而不是 public IP 地址在本地网络中进行通信。我已经替换了这行代码,但连接被拒绝:

with urlopen("http://nodejs-service/api/devices") as url:

这是我的 docker-compose 文件:

version: '3'

services:
  nodejs-service:
    build: ./nodejsAppDocker
    volumes:
      - ./nodejsAppDocker
    ports:
      - 80:8080
    networks:
      - local

  python-service:
    build: ./pythonAppDocker
    volumes:
      - ./pythonAppDocker
    ports:
      - 5000:5000
    depends_on:
      - nodejs-service
    networks:
      - local

networks:
  local:
    driver: bridge

我创建了一个本地网络,如您在 docker-compose.yml 文件中所见,但 python 容器无法使用服务名称与 nodejs 容器通信。这是我在网站上收到的消息:

urllib.error.URLError: <urlopen error [Errno 111] Connection refused>

有什么我遗漏的吗?

正如 Alex 所说,在 URL 中指定端口使其工作。出于某种原因,我虽然必须通过容器外部端口完成连接,但这是没有意义的,而且显然是错误的。 David 说网络不是必需的也是正确的。我从撰写文件中删除了网络声明,它也有效。