无法从Docker容器访问本地主机

时间:2020-02-19 18:30:11

标签: python docker fastapi uvicorn

问题

我有两个Docker容器:

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

服务器似乎可以正常工作,如扑打curl -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):URL超过了最大重试次数:/(由NewConnectionError(':导致无法建立新连接:Errno 111连接被拒绝' ))

设置

我的项目看起来像这样

|- 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

2 个答案:

答案 0 :(得分:2)

尝试使用docker run ... --net=host ...

运行客户端

尽管服务器向主机公开了:80,但是默认情况下,主机的网络不可用于其他容器。也就是说,主机的:80在其他(包括客户端)容器内不可用。

或者,您可以:

  • 通过容器内的DNS引用主机;
  • 创建一个docker网络并将两个容器绑定到该网络(从而也使用容器名称进行引用)
  • 或者-与以前的版本相同-使用Docker Compose。

答案 1 :(得分:0)

您也可以使用default docker bridge network.

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

response = requests.get('http://172.17.0.1', timeout=5)