4

问题

我有两个 Docker 容器:

  • 一台服务器运行fastapi;uvicorn
  • 客户端发送GET请求http://0.0.0.0

服务器似乎工作得很好,因为 bashingcurl -X GET http://0.0.0.0按预期工作。但是,我的 docker 客户端似乎无法访问。

构建客户端容器(下面的文件)后,运行时docker run -it --name app_client_container app_client:latest收到以下错误:

requests.exceptions.ConnectionError: HTTPConnectionPool(host='0.0.0.0', port=80): Max retries exceeded with url: / (由 NewConnectionError(': 无法建立新连接: Errno 111 Connection refused'))

设置

我的项目看起来像这样

|- client.Dockerfile
|- client.py
|- client_req.txt
|- server.Dockerfile
|- server.py
|- server_req.txt

客户

# client.Dockerfile
FROM python:3.8

WORKDIR /srv
WORKDIR /srv
ADD client_req.txt /srv/client_req.txt
RUN pip install -r client_req.txt

ADD . /srv
CMD python /srv/client.py

# client.py
import json
import requests
import traceback

try:
    response = requests.get('http://0.0.0.0', timeout=5)
    print(json.dumps(response.json(), indent=4))
except Exception as e:
    print('Connection could not be established :(')
    print('Here is more information:')
    traceback.print_exc()

# client_req.txt
requests

服务器

# server.Dockerfile
FROM python:3.8

WORKDIR /srv
ADD server_req.txt /srv/server_req.txt
RUN pip install -r server_req.txt

EXPOSE 80

ADD . /srv
CMD uvicorn server:app --host 0.0.0.0 --port 80 --reload

# server.py
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}

# server_req.txt
fastapi
uvicorn
4

2 回答 2

5

尝试运行客户端docker run ... --net=host ...

尽管服务器暴露:80给主机,但主机的网络默认情况下对其他容器不可用;即主机:80在其他(包括客户端)容器中不可用。

或者,您可以:

  • 通过容器内的 DNS 引用主机;
  • 创建一个 docker 网络并将两个容器绑定到它(因此也使用容器名称来引用)
  • 或者——与前面的差不多——使用 Docker Compose。
于 2020-02-19T18:47:09.103 回答
0

您还可以使用默认的 docker 桥接网络。

将 IP 地址设置为:172.17.0.1(对于 mac,它是 docker.for.mac.host.internal)
这应该可以:

response = requests.get('http://172.17.0.1', timeout=5)
于 2020-02-20T11:25:23.513 回答