Как настроить соединение между базой данных и сервером в docker-compose?

Как настроить взаимодействие между контейнерами с использованием Docker Compose для API и базы данных Postgres?
  • 15 мая 2024 г. 13:10
Ответы на вопрос 3
Для настройки соединения между базой данных и сервером в Docker Compose необходимо сначала создать файл docker-compose.yml и описать в нем сервисы для базы данных (например, Postgres) и сервера (например, Node.js или Flask).

Пример файла docker-compose.yml:

```yaml
version: '3'
services:
  db:
    image: postgres
    restart: always
    environment:
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
      POSTGRES_DB: mydatabase

  server:
    build: .
    restart: always
    depends_on:
      - db
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: postgres://myuser:mypassword@db:5432/mydatabase
```

Здесь мы создали два сервиса: db для базы данных Postgres и server для приложения сервера. Сервис server зависит от сервиса db и использует переменную окружения DATABASE_URL для указания URL базы данных.

Чтобы настроить взаимодействие между контейнерами с использованием Docker Compose, необходимо указать настройки, которые позволят им общаться друг с другом. В данном случае, сервис server может обращаться к базе данных Postgres по URL DATABASE_URL, который указан в переменных окружения.

После создания файла docker-compose.yml необходимо запустить контейнеры с помощью команды docker-compose up. После этого сервер и база данных должны успешно взаимодействовать друг с другом.
на этот вопрос тут наверное раз в день ктото отвечает. 
у каждого докер-контейнера СВОЙ локалхост и свой 127.0.0.1
К базе из контейнера API обращайтесь по имени контейнера базы и по ее порту контейнера то есть
postgres_db: 5432
Server=localhost

Чей локалхост? У каждого контейнера он свой.
Port=6002

Чей порт? Внутри докер-сети контейнеры общаются по внутренним портам, а не внешним.

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

"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:
Похожие вопросы