romash
@romash
web-разработчик

Как использовать одну базу данных для нескольких сайтов, запущенных в Docker?

На сервере запущено несколько сайтов. Автодеплой через гитлаб настроен следующим образом:
1. После билда образ загружается на сервер
2. В папку проекта (в которой есть файл .env, монтируемые папки и т.п.) загружается docker-compose.yml примерно такого вида (удалил то, что не относится к теме):
version: '3.2'
services:
  web:
    image: project-name
    environment:
    - DB_HOST=${DB_HOST:-db}
    - DB_DATABASE=${DB_DATABASE:-project-name}
    - DB_USER=${DB_USER:-project-name}
    - DB_PASSWORD=${DB_PASSWORD:-password}
  db:
    image: mariadb:10.3.8
    deploy:
      resources:
        limits:
          memory: ${LIMIT_DB_MEM:-80M}
    environment:
    - MYSQL_RANDOM_ROOT_PASSWORD=yes
    - MYSQL_DATABASE=${DB_DATABASE:-project-name}
    - MYSQL_USER=${DB_USER:-project-name}
    - MYSQL_PASSWORD=${DB_PASSWORD:-password}

3. Чтобы переменные окружения из .env загрузились:
docker-compose config > docker-stack.yml
4. И:
docker stack deploy -c docker-stack.yml project-name

Кластера как такового у меня нет, сервер один и docker stack используется исключительно для deploy-resources-limits, без которых мой маленький vps иногда захлёбывается.
Тем не менее для каждого из трёх проектов в итоге запущено три отдельных инстанса БД, каждой из которых на проде я в состоянии выделить в районе 100-150 МБ, что очень неприятно.
Поэтому хочется запустить одну БД (лучше тоже в докере) и все сайты подключить к ней, а их базы, прописанные в docker-compose.yml, при этом не запускать.
Но для разработчиков всё должно остаться, как было: docker-compose up --build и всё само поднимается, никакой возни с БД, сетью и т.п.

Мой вопрос: можно ли текущую конфигурацию переработать так, чтобы при определённых переменных в .env (например, при DB_HOST не равном db), сервис db не запускался? И как в таком случае сервисам web дать доступ к внешней базе данных силами docker-compose файла и переменных окружения (в докеровских networks я очень слаб)?
  • Вопрос задан
  • 1473 просмотра
Решения вопроса 1
@qq1
Мой вопрос: можно ли текущую конфигурацию переработать так, чтобы при определённых переменных в .env (например, при DB_HOST не равном db), сервис db не запускался?

Правильнее тут сделать отдельный docker-compose.prod.yml в котором не будет db сервиса.
И как в таком случае сервисам web дать доступ к внешней базе данных силами docker-compose файла и переменных окружения (в докеровских networks я очень слаб)?

База данных будет запускаться в отдельном стэке, со своим docker-compose.yml и в своей сети, которую нужно объявить в docker-compose.prod.yml как external:
https://docs.docker.com/compose/networking/#use-a-...
networks:
  default:
    external:
      name: db_default
...
services:
  web:
    image: project-name
    networks:
      - default
      - db_default
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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