Что это
«Коробка» для программы. Любой программе для работы нужно окружение: нужные версии библиотек, настройки, служебные файлы. Docker складывает программу и всё это окружение в одну коробку — контейнер. Коробку можно перенести на любой сервер, и там она заработает точно так же, как у нас: ничего не нужно заново устанавливать и настраивать руками. Похоже на морской контейнер: кран в любом порту умеет его поднять, и ему не важно, что внутри.
Зачем это бизнесу
переезд на другой сервер — это часы, а не недели; одна программа не ломает другую на том же сервере; если что-то упало, контейнер перезапускается сам. Почти в каждом проекте: бот, база данных и сайт живут в отдельных контейнерах. Compose — это «опись» всех коробок проекта, чтобы запускать их одной командой, Swarm — способ разложить их по нескольким серверам.
Где Docker нужен бизнесу
- На одном сервере живут сайт, бот и база, и правка одного не должна ронять остальное.
- Сервер нужно сменить, а заново ставить и настраивать всё руками не хочется.
- Проект передают другому разработчику или на сервер заказчика, и он должен заработать так же, как у нас.
- Упавшая программа должна подняться сама, а не ждать утра и администратора.
Как мы это используем
Почти каждый проект студии запускается в контейнерах, а их состав описан в docker-compose.
- Изоляция сайтов. На сервере сайтов у каждого сайта свой контейнер и своя docker-сеть, в ней только сайт и входной nginx. Базы данных подключены лишь к внутренним сетям своих проектов, поэтому взлом одного сайта не даёт дороги к базе соседа.
- Магазин одним стеком. Интернет-магазин — четыре контейнера: база, кэш, API и витрина. Схема базы применяется миграциями при старте API.
- Бот без открытых портов. Бот для полисов ОСАГО работает в контейнере только для чтения и без открытых портов: к Telegram он подключается сам.
- Данные переживают пересборку. В боте дней рождений файл базы лежит на диске хоста, у контейнера лимит памяти 256 МБ и ротация логов.
- Профили под задачу. В боте загрузки видео локальный Bot API для файлов до 2 ГБ включается отдельным профилем docker-compose.
Развёртывание в Docker входит в ботов, сайты и инфраструктуру.
Типичные проблемы
- Данные внутри контейнера исчезают при пересборке. База и загруженные файлы должны лежать в томе на диске хоста.
- Время по серверу, а не по Москве. Без явного
TZ=Europe/Moscow напоминания, логи и «тихие часы» считаются по часовому поясу хостинга. Поэтому часовой пояс задаём в каждом контейнере. - Логи съедают диск. Размер логов Docker ограничиваем, у входного nginx своя ротация.
- Сборка не помещается в память сервера. Образ сайта на Nuxt собираем на рабочей машине и загружаем готовым: на сервере для сборки мало памяти.
- Контейнер работает, но сервис мёртв. Нужна проверка здоровья, а не только «процесс запущен»: в «Переговорке» сторож перезапускает залипший контейнер, но не чаще трёх раз в час.
Когда это не нужно
Статические страницы без сервера обходятся без Docker: инструкции по подключению VPN — это пять HTML-файлов на GitHub Pages, без сборки и без .env. Одному скрипту, который раз в день запускается на рабочем компьютере, контейнер тоже не нужен.