【问题标题】:Docker Compose FASTAPI microservices can't communicateDocker Compose FASTAPI 微服务无法通信
【发布时间】:2022-07-16 22:51:34
【问题描述】:

我有两个服务,predictpreprocess 应该通过 REST 进行通信。

我可以按如下方式使用 preprocess_service:

curl -X 'POST' \
  'http://0.0.0.0:3000/preprocess' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "feature_1": 1,
  "feature_2": 2
}'

我对这两个服务进行了 docker 化,并想在预测服务中调用预处理服务 - 这不起作用。

错误消息说:

requests.exceptions.ConnectionError: HTTPConnectionPool(host='0.0.0.0', port=3000): url: /preprocess 超出了最大重试次数(由 NewConnectionError(': Failed建立新连接:[Errno 111] Connection denied'))

我做错了什么?

项目结构:


项目:

  • 预测服务
    • main.py
    • requirements.txt
    • Dockerfile
  • 预处理服务
    • main.py
    • requirements.txt
    • Dockerfile
  • docker-compose.yml

predict_service 中的 Dockerfile:

FROM python:3.10

WORKDIR /app 

COPY requirements.txt .
RUN pip install --no-cache-dir --upgrade -r requirements.txt

COPY . .

EXPOSE 8000

CMD ["uvicorn", "main:app", "--host", "0.0.0.0"]

preprocess_service 中的 Dockerfile:

FROM python:3.10

WORKDIR /app 

COPY requirements.txt .
RUN pip install --no-cache-dir --upgrade -r requirements.txt

COPY . .

EXPOSE 3000

CMD ["uvicorn", "main:app", "--host", "0.0.0.0"]

docker-compose.yml:

version: "3"
services:
  predict_service:
    image: dockerplaygroundpredict:latest
    command: uvicorn main:app --host 0.0.0.0 
    ports:
      - "8000:8000"
  preprocess_service:
    image: dockerplaygroundpreprocess:latest
    command: uvicorn main:app --host 0.0.0.0
    ports:
      - "3000:8000"

最后,这是 predict_service 中应该与 preprocess_service 通信的 main.py:

app = FastAPI(
    title="SIMPLE FASTAPI POC",
    description="----> PREDICTION",
    version="0.1"
    )


@app.get("/")
def read_root():
    """Health check."""
    return {"message": HTTPStatus.OK.phrase, "status-code": HTTPStatus.OK,}

@app.post("/predict", tags=["Prediction"])
def predict(request: Request, sample: FeatureSample) -> Dict:
    """Predict output for sample input."""

    
    headers = {
    'accept': 'application/json',
    }

    json_data = {
        'feature_1': 1,
        'feature_2': 2,
    }

    preprocessing_response = requests.post('http://0.0.0.0:3000/preprocess', 

                                           headers=headers, json=json_data)


    return {"message": HTTPStatus.OK.phrase, "status-code": HTTPStatus.OK, "data": {"predictions": "Dummy_Prediction"}}

【问题讨论】:

    标签: rest docker-compose localhost microservices fastapi


    【解决方案1】:

    由于它们运行在不同的容器中,因此它们无法在本地 IP 0.0.0.0 上相互访问。您改为使用容器名称(predict_servicepreprocess_service)作为主机名,因此您应该发布到 'http://predict_service:3000/preprocess'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-12
      • 1970-01-01
      • 2019-07-24
      • 2021-01-24
      • 2023-01-03
      • 2019-10-22
      • 2021-11-21
      • 1970-01-01
      相关资源
      最近更新 更多