Задать вопрос
Zuguki
@Zuguki
I'm working all the time!

Как подключить бд к серверу в docker-compose?

Всем привет, у меня не получается настроить взаимодействие контейнеров.
Как делал раньше, запускал Postgres, через DockerCompose, затем запускал APi, локально, строка подключения была такой:
"Postgres": "Server=localhost; Port=6002; Database=post; User ID=postgres; Password=passwd; Pooling=true"

Все работало, все хорошо.

Сейчас мне нужно сделать запуск API, тоже из compose файла, API и Postgres запускаются, но не получается обратиться из API, к Postgres.

ComposeFile:
networks:
  postgres-network:
    driver: bridge

services:
  gchain.posts.api:
    image: gchain.posts.api
    build:
      context: .
      dockerfile: GChain.Posts.Api/Dockerfile
    ports:
      - "80:8080"
    networks:
      - postgres-network
    depends_on:
      - postgres_db
    
  postgres_db:
    container_name: postgres_post
    image: postgres:latest
    environment:
      POSTGRES_USER: ${POSTGRES_USER:-postgres}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-passwd}
      POSTGRES_DB: post
    volumes:
      - postgres-data:/data/postgres
    ports:
      - "6002:5432"
    networks:
      - postgres-network
    restart: unless-stopped

volumes:
  postgres-data


Вывод ошибки, при обращении к бд через API:
Npgsql.NpgsqlException (0x80004005): Failed to connect to 127.0.0.1:6002
 ---> System.Net.Sockets.SocketException (111): Connection refused
   at Npgsql.Internal.NpgsqlConnector.Connect(NpgsqlTimeout timeout)
   at Npgsql.Internal.NpgsqlConnector.Connect(NpgsqlTimeout timeout)
   at Npgsql.Internal.NpgsqlConnector.RawOpen(SslMode sslMode, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken, Boolean isFirstAttempt)
   at Npgsql.Internal.NpgsqlConnector.<Open>g__OpenCore|213_1(NpgsqlConnector conn, SslMode sslMode, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken, Boolean isFirstAttempt)
   at Npgsql.Internal.NpgsqlConnector.Open(NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
   at Npgsql.UnpooledDataSource.Get(NpgsqlConnection conn, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
   at Npgsql.NpgsqlConnection.<Open>g__OpenAsync|42_0(Boolean async, CancellationToken cancellationToken)
   at Npgsql.NpgsqlConnection.Open()
   at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnection(Boolean errorsExpected)
   at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenInternal(Boolean errorsExpected)
   at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open(Boolean errorsExpected)
   at Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.NpgsqlDatabaseCreator.Exists(Boolean async, CancellationToken cancellationToken)
   at Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.NpgsqlDatabaseCreator.Exists(Boolean async, CancellationToken cancellationToken)
   at Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.NpgsqlDatabaseCreator.Exists()
   at Microsoft.EntityFrameworkCore.Storage.RelationalDatabaseCreator.EnsureCreated()
   at Microsoft.EntityFrameworkCore.Infrastructure.DatabaseFacade.EnsureCreated()


Подключиться через DataGrip, к бд удается.
  • Вопрос задан
  • 420 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 1
@q2digger
никого не трогаю, починяю примус
на этот вопрос тут наверное раз в день ктото отвечает.
у каждого докер-контейнера СВОЙ локалхост и свой 127.0.0.1
К базе из контейнера API обращайтесь по имени контейнера базы и по ее порту контейнера то есть
postgres_db: 5432
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Mike_Ro
@Mike_Ro
Python, JS, WordPress, SEO, Bots, Adversting
Server=localhost

Чей локалхост? У каждого контейнера он свой. Тогда какой указывать? Оптимально - по имени.
https://docs.docker.com/compose/networking/
Reference containers by name, not IP, whenever possible. Otherwise you’ll need to constantly update the IP address you use.

Port=6002

Чья туфля порт? Внутри докер-сети (Вы же указали: networks>postgres-network) контейнеры общаются по внутренним портам (рекомендуется).

Если резюмировать, то будет примерно так (поправить местами при необходимости):

"Postgres": "Server=localhost; Port=6002; Database=post; User ID=postgres; Password=passwd; Pooling=true"

"Postgres": "Server=postgres_db; Port=5432; Database=post; User ID=postgres; Password=passwd; Pooling=true"

docker-compose.yml:
version: '3.8'

networks:
  postgres-network:
    driver: bridge

services:
  gchain.posts.api:
    image: gchain.posts.api
    build:
      context: .
      dockerfile: GChain.Posts.Api/Dockerfile
    ports:
      - "80:8080"
    networks:
      - postgres-network
    depends_on:
      - postgres_db

  postgres_db:
    container_name: postgres_post
    image: postgres:latest
    environment:
      POSTGRES_USER: ${POSTGRES_USER:-postgres}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-passwd}
      POSTGRES_DB: post
    volumes:
      - postgres-data:/var/lib/postgresql/data
    ports:
      - "6002:5432"
    networks:
      - postgres-network
    restart: unless-stopped

volumes:
  postgres-data:
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы