Как соединить Docker и PostgreSQL?

Парни, нужна помощь. Я уже третий день пытаюсь разобраться с проблемой. 

Настроил Docker и PostgreSQL. Подключение к базе данных проходит нормально из вне Docker, но внутри контейнера - нет. Выдает следующую ошибку: 

<blockquote>
Is the server running on that host and accepting TCP/IP connections?<br/>
connection to server at "localhost" (127.0.0.1), port 5433 failed: Connection refused<br/>
Is the server running on that host and accepting TCP/IP connections?<br/>
</blockquote>

Я уже прочитал множество ответов на тему на Тостере и Stack Overflow, но ни одно из решений не помогло. Подключение всё равно не происходит. 

Вот мой Dockerfile для PostgreSQL: 
<blockquote>
FROM postgres:13<br/>
COPY postgresql.conf /etc/postgresql/postgresql.conf<br/>
</blockquote>

В файле postgresql.conf содержится только одна директива: 
<blockquote>
listen_addresses='*'<br/>
</blockquote>

Также прикладываю мой docker-compose файл: 
<pre><code>version: '3'
services:
  
  app:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ./app:/app
    environment:
      - ENV=dev
    env_file:
      - ./app/.env.local
    ports:
      - "8000:8000"
    command: poetry run uvicorn index:app --reload --host 0.0.0.0 --port 8000
    networks:
      - proxy-net
    depends_on:
      - db
      - redis
      - rabbitmq

  db:
    container_name: db
    build: ./.infrastructure/postgres
#    image: ${IMAGE_DB}
    restart: always
    volumes:
      - db_volume:/var/lib/postgresql/data/
    healthcheck:
      test: [ "CMD-SHELL", "sh -c 'pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}'" ]
      interval: 10s
      timeout: 3s
      retries: 3
    logging:
      driver: journald
    env_file:
      - ./app/.env.local
    command: postgres -c config_fil
</pre> 

Буду благодарен за любую помощь!
  • 24 октября 2024 г. 18:12
Ответы на вопрос 2
Проблема, с которой вы столкнулись, скорее всего связана с тем, что ваше приложение пытается подключиться к базе данных, используя `localhost`, что указывает на то, что оно ищет базу данных на самом контейнере приложения вместо того, чтобы подключаться к контейнеру PostgreSQL.

Вот несколько шагов и рекомендаций, которые могут помочь вам исправить ситуацию:

### 1. Измените адрес подключения
Убедитесь, что ваше приложение обращается к базе данных по имени сервиса в Docker Compose, а не по `localhost`. Если вы используете стандартный формат в Docker Compose, имя сервиса — это `db`. Например, если вы подключаетесь из вашего приложения, использование следующих параметров должно помочь:

- **Host:** `db` (имя сервиса из вашего docker-compose файла)
- **Порт:** `5432` (по умолчанию PostgreSQL использует этот порт, а не `5433`)
- **Пользователь:** используйте значение `POSTGRES_USER`, установленное в вашем `.env.local`
- **База данных:** используйте значение `POSTGRES_DB`, установленное в вашем `.env.local`

### 2. Проверьте настройки порта
В вашем Dockerfile и настройках у вас указан порт 5433, однако, по умолчанию PostgreSQL слушает на порту 5432. Если вы хотите использовать 5433, убедитесь, что он также указан и при конфигурации PostgreSQL, и в вашем приложении.

Если подключение должно происходить по порту 5432, вы можете удалить или установить правильный порт.

### 3. Проверка конфигурации
Убедитесь, что Docker запускает PostgreSQL с правильным конфигурационным файлом. В вашем `docker-compose.yml` в разделе `db`, у вас указана команда:

```yaml
command: postgres -c config_fil
```

Это может быть ошибкой, так как параметр `config_fil` выглядит неполным. Вам нужно указывать файл конфигурации следующим образом, если он существует:

```yaml
command: postgres -c config_file=/etc/postgresql/postgresql.conf
```

### 4. Логи PostgreSQL
Проверьте логи PostgreSQL, чтобы увидеть, какие ошибки или предупреждения могут быть связаны с подключениями. Можно получить доступ к логам с помощью команды:

```bash
docker logs db
```

### 5. Полный пример структуры
Вот пример, как может выглядеть ваш `docker-compose.yml` файл и часть `app`:

```yaml
version: '3'
services:
  
  app:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ./app:/app
    environment:
      - ENV=dev
    env_file:
      - ./app/.env.local
    ports:
      - "8000:8000"
    command: poetry run uvicorn index:app --reload --host 0.0.0.0 --port 8000
    networks:
      - proxy-net
    depends_on:
      - db
      - redis
      - rabbitmq

  db:
    container_name: db
    image: postgres:13
    restart: always
    volumes:
      - db_volume:/var/lib/postgresql/data/
    environment:
      POSTGRES_USER: your_user
      POSTGRES_PASSWORD: your_password
      POSTGRES_DB: your_db
    command: postgres -c config_file=/etc/postgresql/postgresql.conf
    networks:
      - proxy-net

volumes:
  db_volume:
```

### Заключение
После всех изменений не забудьте перезапустить ваши контейнеры. Вы можете сделать это с помощью следующей команды:

```bash
docker-compose down && docker-compose up --build
```

Попробуйте применить указанные рекомендации и проверьте, решает ли это вашу проблему. Если что-то не работает, пожалуйста, предоставьте дополнительные детали.
В докере нет localhost. Вместо localhost надо название контейнера с postgeres написать 
Ответы на тостере я уже прочитал... И на SO тоже....

по моему об этом в любом туториале про postgeres+docker написано
Похожие вопросы