使用 Docker 撰写时容器之间的连接被拒绝
Connection refused between containers when using Docker compose
我一直在 GCP VM 中出于学习目的测试 Docker,我的项目中有两个容器:
- 第一个容器是一个nodejsAPI,它returnsjson在访问端口80上的VM地址时格式化数据。
- 第二个容器是一个 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 说网络不是必需的也是正确的。我从撰写文件中删除了网络声明,它也有效。
我一直在 GCP VM 中出于学习目的测试 Docker,我的项目中有两个容器:
- 第一个容器是一个nodejsAPI,它returnsjson在访问端口80上的VM地址时格式化数据。
- 第二个容器是一个 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 说网络不是必需的也是正确的。我从撰写文件中删除了网络声明,它也有效。