Пару вопросов по использованию докера в продакшене?

Приветствую! Есть веб-приложение на ноде + mysql, которое локально разрабатывал в докере (docker-compose с двумя сервисами - mysql и node приложение из DockerFile). Сейчас необходимо развернуть сервис на удаленном сервере (ubuntu), подскажите по нескольким общим (возможно базовым) вопросам

1. Использовать докер в продакшене - нормальное решение?

2. Для первой сборки буду использовать docker-compose build, docker-compose up -d, для обновления кода в контейнере - git pull, docker-compose build, docker-compose up -d. Не упустил ли я какие-то важные команды, которые не используются при разработке, но нужны перед сборкой продакшена?

3. У меня был сервер на 50 гигов, на котором установлен только докер. За месяц пару десятков раз выполнял git pull, docker-compose build, docker-compose up -d, после чего память на сервере закончилась (причем крутится только один docker-compose с двумя сервисами - из docker file и mysql) -.- Докер собирается через docker-file
docker file
FROM node:18-alpine as builder
WORKDIR /usr/src/app

COPY package*.json ./
COPY yarn.lock ./
COPY tsconfig*.json ./
COPY .yarnrc ./

COPY ./src ./src

RUN yarn
RUN yarn build

# Production stage
FROM node:18-alpine
WORKDIR /usr/src/app

ENV NODE_ENV=production

COPY package*.json ./
COPY yarn.lock ./
COPY .env ./
COPY --from=builder /usr/src/app/dist ./dist

RUN yarn
CMD ["yarn", "start"]


Из-за чего могла закончиться память? Это точно не данные контейнеров, там почти пустая бд

4. Автоматический бекап базы данных - ответственность самого сервиса (в коде делать дамп), докера (использовать какой-то image для бекапов) или сервера (непосредственно на сервере настроить крон)?

5. Как не терять данные из бд при перезапусках контейнера? Не знаю как, но пару раз база сама очищалась после манипуляций с контейнером

6. Node.js приложение само пишет нужные мне логи и кладет в корень проекта. Но тк приложение работает в докере, я не могу выполнить nano app.logs для просмотра логов. Это можно как-нибудь решить?
  • Вопрос задан
  • 1133 просмотра
Пригласить эксперта
Ответы на вопрос 4
Mike_Ro
@Mike_Ro
Python, JS, WordPress, SEO, Bots, Adversting
1. Использовать докер в продакшене - нормальное решение?

Нормальное.
3. У меня был сервер на 50 гигов

Докер хранит все слои, образы и логи, периодически, необходимо чистить не используемые образы docker system prune.
4. Автоматический бекап базы данных

Я бы cron использовал для этого.
5. Как не терять данные из бд при перезапусках контейнера?

Не использовал, но слышал много хорошего про Docker volumes.
6. Node.js приложение само пишет нужные мне логи и кладет в корень проекта.

Docker volumes.
Ответ написан
Комментировать
Griboks
@Griboks
Использовать докер в продакшене - нормальное решение?

Да, но есть один нюанс... Судя по вашему вопросу, вы его точно не учли.

Не упустил ли я какие-то важные команды, которые не используются при разработке, но нужны перед сборкой продакшена?

Выкидываете build и git, создаёте docker registry, предварительно собираете образы (без гита, только полезные файлы в slim образе), пушите их в реестр, на проде прописываете нужные образы нужных версий. Поднимаете через compose + устанавливаете restart = unless stopped.

после чего память на сервере закончилась

Выкидываете git, делаете docker system prune раз в месяц, ставите в настройках демона ротацию логов.

Автоматический бекап базы данных - ответственность самого сервиса (в коде делать дамп), докера (использовать какой-то image для бекапов) или сервера (непосредственно на сервере настроить крон)?

Docker image не используется для бэкапов, потому что он не может изменять свои файлы. Файлы изменяются в контейнерах, volume или маунтах.
Поэтому бэкап - это задача сервера. Только бэкапить надо не рядом с базой, а на другой сервер.

Как не терять данные из бд при перезапусках контейнера?

Контейнер не теряет файлы при перезапуске. Скорее всего, вы его тупо удаляете, а затем пересоздаёте.

Но тк приложение работает в докере, я не могу выполнить nano app.logs для просмотра логов.

Писать логи в другое место/ docker attach / docker cp / экспорт логов и метрик в сервис мониторинга.

p.s.
Вот вам линтер для обучения.
Ответ написан
Комментировать
@vitaly_il1
DevOps Consulting
"Использовать докер в продакшене - нормальное решение?" - да, но есть несколько НО, если это действительно продакшен: нужно почитать любой "учебник" (статьи, youtube, ...) по Докер - как работать с логами, данными (если хотим запускать базу в докер), автоматически перезапускать, как докер использует диск и т.п.

И, разумеется, независимо от того, как запускаем базу - потренироваться в бэкапе и восстановлении, и настроить ав томатический бэкап.
Ответ написан
Комментировать
@darst
5. Как не терять данные из бд при перезапусках контейнера? Не знаю как, но пару раз база сама очищалась после манипуляций с контейнером


В докере есть такое значение valumes, которое пробрасывает папку внутрь контейнера. Вот там и нужно хранить данные от бд, чтобы при пересоздания контейнера не потерять, притом у вас должен быть один контейнер с бд для всех сервисов.

Некоторые предлагают использовать docker registry вместо git и build. Для понимания docker registry для хранения образов, а git для хранения кода.

Чтобы автоматизировать автодеплой посмотрите gitlab.

Для работы с локами используйте Graylog. В приложении реализуйте, вместо сбора из контейнеров.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы