Невозможно получить доступ к локальному хосту из Docker контейнера - PullRequest
2 голосов
/ 19 февраля 2020

Проблема

У меня есть два Docker контейнера:

  • сервер работал с fastapi;uvicorn
  • клиентом, отправляющим GET запрос к http://0.0.0.0

Сервер работает нормально, так как bash curl -X GET http://0.0.0.0 работает как положено. Однако мой docker клиент, похоже, не может получить доступ.

После построения клиентского контейнера (файлы ниже), при выполнении docker run -it --name app_client_container app_client:latest я получаю следующую ошибку:

запросов .exceptions.ConnectionError: HTTPConnectionPool (host = '0.0.0.0', port = 80): Превышено максимальное количество попыток с помощью url: / (вызвано NewConnectionError (': не удалось установить sh новое соединение: Errno 111 Connection отказано') )

Настройка

Мой проект выглядит так

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

2 голосов
/ 19 февраля 2020

Попробуйте запустить клиент с docker run ... --net=host ...

Хотя сервер предоставляет хосту :80, сеть хоста по умолчанию не доступна для других контейнеров; т. е. хост :80 недоступен внутри других (включая клиентских) контейнеров.

В качестве альтернативы вы можете:

  • ссылаться на хост через его DNS в контейнере;
  • создайте docker сеть и привяжите к ней оба контейнера (таким образом, также используя имена контейнеров для ссылки)
  • или - в некоторой степени аналогично предыдущему - используйте Docker Compose.
0 голосов
/ 20 февраля 2020

Вы также можете использовать по умолчанию docker мостовая сеть.

Установить IP-адрес на: 172.17.0.1 (для ма c это docker .for.ma c .host.internal)
Это должно работать:

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