@Vadim1899
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
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 для просмотра логов. Это можно как-нибудь решить?
Решения вопроса 0
Ответы на вопрос 4
@Mike_Ro
1. Использовать докер в продакшене — нормальное решение?
Нормальное.
3. У меня был сервер на 50 гигов
Докер хранит все слои, образы и логи, периодически, необходимо чистить не используемые образы docker system prune
.
4. Автоматический бекап базы данных
Я бы cron использовал для этого.
5. Как не терять данные из бд при перезапусках контейнера?
Не использовал, но слышал много хорошего про Docker volumes.
6. Node.js приложение само пишет нужные мне логи и кладет в корень проекта.
Docker volumes.
@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
И, разумеется, независимо от того, как запускаем базу — потренироваться в бэкапе и восстановлении, и настроить ав томатический бэкап.
@darst
5. Как не терять данные из бд при перезапусках контейнера? Не знаю как, но пару раз база сама очищалась после манипуляций с контейнером
В докере есть такое значение valumes, которое пробрасывает папку внутрь контейнера. Вот там и нужно хранить данные от бд, чтобы при пересоздания контейнера не потерять, притом у вас должен быть один контейнер с бд для всех сервисов.
Некоторые предлагают использовать docker registry вместо git и build. Для понимания docker registry для хранения образов, а git для хранения кода.
Чтобы автоматизировать автодеплой посмотрите gitlab.
Для работы с локами используйте Graylog. В приложении реализуйте, вместо сбора из контейнеров.