Django 'failed connection' между двумя контейнерами
В настоящее время я пытаюсь установить связь между двумя моими контейнерами docker (запрашивающий контейнер, работающий под управлением Gunicorn/Django, и api контейнер, работающий под управлением kroki).
Я просмотрел другие ответы, но, похоже, не нашел решения, поэтому надеялся на небольшой толчок в правильном направлении.
Docker-compose:
version: '3.8'
services:
app:
build:
context: ./my_app
dockerfile: Dockerfile.prod
command: gunicorn my_app.wsgi:application --bind 0.0.0.0:8000 --access-logfile -
volumes:
- static_volume:/home/app/web/staticfiles
expose:
- 8000
environment:
- DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 kroki
env_file:
- ./.env.prod
depends_on:
- db
db:
image: postgres:13.0-alpine
volumes:
- postgres_data:/var/lib/postgresql/data/
env_file:
- ./.env.prod.db
nginx:
build: ./nginx
volumes:
- static_volume:/home/app/web/staticfiles
ports:
- 1337:80
depends_on:
- app
kroki:
image: yuzutech/kroki
ports:
- 7331:8000
volumes:
postgres_data:
static_volume:
settings.py
ALLOWED_HOSTS = os.environ.get("DJANGO_ALLOWED_HOSTS").split(" ")
Код запроса в django
url = 'http://kroki:7331/bytefield/svg/' + base64_var
try:
response = requests.get(url)
return response.text
except ConnectionError as e:
print("Connection to bytefield module, unavailable")
return None
Я могу успешно получить доступ к обоим контейнерам через браузер, однако инициирование кода для внутреннего вызова между ними выдает
requests.exceptions.ConnectionError: HTTPConnectionPool(host='kroki', port=7331): Max retries exceeded with url: /bytefield/svg/<API_URL_HERE> (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f286f5ecaf0>: Failed to establish a new connection: [Errno 111] Connection refused'))
Я пробовал получить доступ к url через localhost:7331 иamp; 127.0.0.1:7331, но ни то, ни другое не помогает
Когда вы обращаетесь к другим контейнерам внутри одного и того же network
, вам не нужно обращаться к ним, используя открытый порт в host
, а вместо этого использовать фактический порт, который прослушивает приложение внутри контейнера.
Я сделал действительно простой пример, чтобы вы могли понять, в чем ваша проблема:
version: '3.8'
services:
app:
image: busybox
entrypoint: tail -f /dev/null
kroki:
image: yuzutech/kroki
ports:
- 7331:8000
От хозяина
❯ curl -s -o /dev/null -w "%{http_code}" localhost:7331
200
Приложение
/ # wget kroki:7331
Connecting to kroki:7331 (172.18.0.3:7331)
wget: can't connect to remote host (172.18.0.3): Connection refused
/ # wget kroki:8000
Connecting to kroki:8000 (172.18.0.3:8000)
saving to 'index.html'
index.html 100% |************************************************************************| 51087 0:00:00 ETA
'index.html' saved