В докере контейнеры не видят друг друга
У меня проблемы с докеризацией многомодульного Spring приложения. На localhost оно работает отлично. Из трех jar я сделал три контейнера плюс контейнеры с postgres, redis, keycloak. Мои кастомные контейнеры не видят друг друга плюс не видят вспомогательные контейнеры с postgres, keycloak и redis. Я не могу понять, что не так в моем compose файле.
version: '2.33'
networks:
docknet:
driver: bridge
services:
config-server:
build:
context: ./config-server
dockerfile: Dockerfile
container_name: config-server
networks:
- docknet
ports:
- "8888:8888"
depends_on:
- redis
- postgresql
- keycloak
healthcheck:
test: [ "CMD", "curl", "-f", "http://localhost:8888/actuator/health" ]
interval: 10s
timeout: 5s
retries: 5
api:
build:
context: ./api
dockerfile: Dockerfile
container_name: api
networks:
- docknet
ports:
- "8081:8081"
environment:
SPRING_DATASOURCE_URL: "jdbc:postgresql://postgres:5432/demo"
SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_ISSUER-URI: "http://news_keycloak:8082/realms/news"
SPRING_CONFIG_IMPORT: "http://config-server:8888"
SPRING_DATA_REDIS_HOST: "redis"
depends_on:
- config-server
- redis
- postgresql
- keycloak
manager-view:
build:
context: ./manager-view
dockerfile: Dockerfile
container_name: manager-view
networks:
- docknet
ports:
- "8080:8080"
environment:
NEWS_SERVICES_CATALOGUE_URI: "http://api:8081"
SPRING_DATASOURCE_URL: "jdbc:postgresql://postgres:5432/demo"
SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_KEYCLOAK_ISSUER-URI: "http://news_keycloak:8082/realms/news"
depends_on:
- api
redis:
image: redis:8.0-M03
container_name: redis
networks:
- docknet
ports:
- "6379:6379"
healthcheck:
test: [ "CMD", "redis-cli", "ping" ]
interval: 10s
timeout: 5s
retries: 5
volumes:
- redis_data:/data
postgresql:
image: postgres:13.3
container_name: postgres
networks:
- docknet
environment:
POSTGRES_DB: demo
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
ports:
- "5432:5432"
healthcheck:
test: [ "CMD-SHELL", "pg_isready -U postgres" ]
interval: 10s
timeout: 5s
retries: 5
volumes:
- postgres_data:/data
keycloak:
image: quay.io/keycloak/keycloak
container_name: news_keycloak
networks:
- docknet
ports:
- "8082:8080"
healthcheck:
test: [ "CMD", "curl", "-f", "http://localhost:8080/realms/news/.well-known/openid-configuration" ]
interval: 10s
timeout: 5s
retries: 5
command: start-dev --import-realm
volumes:
- ./config/keycloak/import:/opt/keycloak/data/import
- keycloak_data:/opt/keycloak/data
volumes:
redis_data:
postgres_data:
keycloak_data:
Запускаются только контейнеры postgres, keycloak, redis, а также config-server. api крашится, потом что при запуске обращается к config-server, а обращение не работает. manager-view обращется к keycloak и тоже крашится. И в общую сеть docknet ни один из контейнеров автоматически не добавляется.
Ответы (1 шт):
У вас ошибка в путях к контейнерам. Контейнеры могут обращаться друг к другу по имени сервиса, но не по container_name (хотя иногда это может работать, полагаться на service name надежнее) и не по localhost.
Например вы указываете news_keycloak
SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_ISSUER-URI: "http://news_keycloak:8082/realms/news"
Но ваш сервис называется keycloak, а не news_keycloak
keycloak:
image: quay.io/keycloak/keycloak
container_name: news_keycloak
Как вы проверили, что контейнеры не присоединились к сети? Вы запускали инспектор после деплоя? Если нет, то с помощью этой команды можно посмотреть информацию о сети:
docker network inspect docknet
P.S. depends_on не гарантирует, что сам сервис запустился, он лишь проверяет, что запустился сам контейнер.