Работали ли вы с базами данных в Docker-контейнерах?

Ответ

Да, в нескольких проектах на Node.js мы использовали Docker для изоляции сервисов баз данных, таких как PostgreSQL и Redis. Основные практики, которые я применял:

  1. Использование Docker Volumes для сохранения данных:

    docker run -d 
      --name postgres-db 
      -v postgres_data:/var/lib/postgresql/data 
      -e POSTGRES_PASSWORD=strongpassword 
      postgres:15-alpine
  2. Настройка сети и подключение Node.js приложения: В docker-compose.yml определял общую сеть, чтобы контейнер приложения мог подключиться к контейнеру БД по имени сервиса.

    services:
      app:
        build: .
        depends_on:
          - db
        environment:
          - DATABASE_URL=postgres://user:pass@db:5432/mydb
      db:
        image: postgres:15-alpine
        volumes:
          - postgres_data:/var/lib/postgresql/data
  3. Реализация health-check в приложении: Писал скрипт инициализации на Node.js, который проверял доступность БД через pg клиент перед запуском основного сервера, чтобы избежать ошибок подключения при старте системы.

Ответ 18+ 🔞

А, ну это ж классика, ёпта! В каждом втором проекте на Node.js так и делаем — засовываем базы в Docker, чтобы они не разбежались. Как будто на дворе 2002-й год и мы с флешками бегаем, но нет, это просто удобно, блядь.

Смотри, основные фишки, которые реально работают, а не просто для галочки:

Первое — чтобы данные не испарились, как твоя зарплата в пятницу. Тут без volumes — вообще никуда. Запускаешь Postgres, а он тебе как мартышлюшка — нахуярил данных и забыл. Чтобы такого не было, делаем так:

docker run -d 
  --name postgres-db 
  -v postgres_data:/var/lib/postgresql/data 
  -e POSTGRES_PASSWORD=strongpassword 
  postgres:15-alpine

Вот этот -v postgres_data:/var/lib/postgresql/data — это и есть наш спасательный круг. Без него после перезапуска контейнера получаешь чистую базу и волнение ебать на всю команду. Сам от себя охуеешь, когда поймёшь, что продакшн-данные накрылись медным тазом.

Второе — чтобы приложение с базой разговаривали, а не тыкались, как слепые котята. Тут без docker-compose.yml — вообще пиздец. Создаёшь общую сеть, и они друг друга по именам находят. Магия, блядь!

services:
  app:
    build: .
    depends_on:
      - db
    environment:
      - DATABASE_URL=postgres://user:pass@db:5432/mydb
  db:
    image: postgres:15-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data

Смотри, тут главный прикол — depends_on. Без него твоё приложение стартанёт раньше базы, полезет коннектиться, а там хуй с горы — ничего не готово. И будет оно тупить, падать, и доверия ебать ноль к такой архитектуре.

И третье, самое важное — health-check. Это вообще must have, чувак. Ты ж не хочешь, чтобы твой продакшн-сервер встал колом, потому что база на десять секунд опоздала? Вот и я не хочу.

Пишешь на Node.js скрипт инициализации, который тупо долбится в базу через pg клиент, пока та не отзовётся. Типа «Эй, PostgreSQL, ты живой?» — и ждёт ответа. И только когда база говорит «Да, хули, я тут», основной сервер запускается.

Без этого — чистая лотерея. Иногда повезёт, иногда приложение стартанёт, а база ещё миграции гоняет, и всё, приехали. Подозрение ебать чувствую к таким костыльным запускам.

В общем, схема простая, но работает, как швейцарские часы. Главное — не выёбывайся и делай по уму, а не как полупидор, который на скорую руку набросал. И тогда и данные целы, и нервы тоже.