nginx и Docker (офисное здание)
Не соперники и не соседи по одной цепочке — это разные слои: один принимает посетителей у двери, другой решает, как устроены рабочие места внутри.
На пальцах
Современный бизнес-центр сдаёт этажи разным компаниям. Здание собирают из готовых блоков-модулей: каждый блок — самодостаточная коробка, внутри которой уже проведено электричество, вода, стоит мебель. Блок можно вынуть из одного здания и поставить в другое — внутри всё то же самое. Это Docker: упаковывает программу со всеми зависимостями в одну стандартную коробку-контейнер, которая работает одинаково везде, где есть Docker. А у входа в здание сидит администратор: посетитель говорит «я в компанию "Обувь"» — администратор смотрит, на каком этаже «Обувь», и отправляет туда. Это nginx: принимает входящие запросы и решает, какому сервису их отдать. Здание может работать и без администратора (посетители будут стучаться в двери сами), а без модульных блоков компаниям пришлось бы каждый раз самим привозить мебель и настраивать коммуникации.
Что делает каждый
nginx — программа на входе сервера. Принимает входящие веб-запросы (HTTP/HTTPS), смотрит, что просят и по какому имени домена, и решает, какому внутреннему сервису передать запрос. Дополнительно расшифровывает HTTPS, раздаёт статику, может ограничивать скорость и балансировать нагрузку.
Docker — способ упаковать программу в контейнер: папку с кодом, библиотеками, настройками и всеми зависимостями — в одну стандартную коробку, которая запускается одинаково на любом сервере с Docker. Каждый контейнер изолирован от соседей: своя файловая система, свой сетевой стек, свои процессы.
В чём разница
| nginx | Docker | |
|---|---|---|
| Где стоит | на входе сервера, перед всеми сервисами | оборачивает каждый сервис вместо обычной установки на сервер |
| Что делает в момент работы | обрабатывает каждый входящий HTTP-запрос | держит запущенным контейнер с программой |
| Какую боль снимает | пользователи не попадают по нужному имени, нет HTTPS, всё лезет на один порт | «у меня работает, а на сервере — нет», конфликты версий библиотек между проектами |
| Что сломается без него | посетители не смогут найти сайт по привычному адресу, в браузере не будет зелёного замка | команды тратят дни на настройку окружения, перенос между машинами ломается |
| Когда выбирают | всегда, если сервер смотрит в интернет | когда несколько проектов на одной машине или когда нужно гарантировать одинаковую работу на любом сервере |
Что из этого следует
Чаще всего нужны оба. Типичная схема: nginx стоит на входе, за ним — несколько Docker-контейнеров (фронт, бэк, база данных). nginx решает, к какому контейнеру направить запрос; Docker отвечает за то, чтобы каждый сервис внутри своей коробки работал предсказуемо. Можно без nginx (тогда каждый сервис смотрит в интернет своим портом), можно без Docker (тогда сервисы ставятся прямо на сервер обычной установкой) — но в типичном веб-проекте они закрывают разные задачи и не заменяют друг друга.