В докере контейнеры не видят друг друга

У меня проблемы с докеризацией многомодульного 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 шт):

Автор решения: Andrey Tabakov

У вас ошибка в путях к контейнерам. Контейнеры могут обращаться друг к другу по имени сервиса, но не по 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 не гарантирует, что сам сервис запустился, он лишь проверяет, что запустился сам контейнер.

→ Ссылка