Вы можете общаться только между контейнерами в одной сети Docker.Docker Compose создает сеть default
для вас, и при отсутствии какой-либо конкретной декларации ваш контейнер redis
находится в этой сети.Но вы также объявляете отдельную сеть proxy
и присоединяете контейнер api
к этой другой сети.
Единственное простейшее решение - удалить все блоки network:
везде и просто использоватьdefault
сеть Docker Compose создаст для вас.Вам может потребоваться отформатировать переменную REDIS_URL
как фактический URL-адрес, например, redis://redis:6379
.
Если у вас нетехническое требование иметь отдельные сети, добавьте - default
в список сетей дляapi
контейнер.
В вашем docker-compose.yml
есть ряд других настроек, которые не особенно полезны.expose:
почти ничего не делает и обычно также предоставляется в Dockerfile.links:
- это устаревший способ совершать кросс-контейнерные вызовы, и, как вы заявили, он может совершать вызовы Redis на ваш сервер API.hostname:
не действует вне самого контейнера и обычно совершенно не нужен.container_name:
имеет некоторые видимые эффекты, но обычно имя контейнера Docker Compose просто подходит.
Это оставит вас с:
version: '3.2'
services:
redis:
image: 'bitnami/redis:latest'
api:
image: tufanmeric/api:latest
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- REDIS_URL=redis://redis:6379
depends_on:
- redis
deploy:
mode: global
labels:
- 'traefik.port=3002'
- 'traefik.frontend.rule=PathPrefix:/'
- 'traefik.frontend.rule=Host:api.example.com'
- 'traefik.docker.network=default'