Глава 2.3: Сети Docker (Bridge-сети).
Когда мы запустили наш стек из BookStack и базы данных, они сразу «из коробки» смогли связаться друг с другом. Как это произошло? Ведь мы не настраивали IP-адреса и не прописывали сложные сетевые маршруты.
Всё дело в том, что Docker обладает мощной встроенной подсистемой виртуализации сетей. Для новичка понимание того, как контейнеры общаются между собой — это ключ к построению безопасных и масштабируемых систем.
1. Что такое Bridge-сеть (Виртуальный мост)?
По умолчанию, когда вы запускаете проект через Docker Compose, он автоматически создает изолированную локальную сеть типа bridge (мост) специально для этого проекта.
Представьте, что Docker ставит внутрь вашего сервера Debian виртуальный сетевой роутер (коммутатор). Контейнеры BookStack и MariaDB подключаются к этому виртуальному роутеру невидимыми проводами. Они получают внутренние серые IP-адреса (например, 172.20.0.2 и 172.20.0.3) и могут свободно общаться друг с другом в полной изоляции от других контейнеров на сервере.
2. Магия встроенного DNS: Забудьте про IP-адреса
В реальных сетях, чтобы обратиться к серверу, нужно знать его IP. В Docker всё гораздо круче. Внутри каждой bridge-сети работает встроенный DNS-сервер Docker.
Он внимательно следит за именами сервисов, которые вы написали в файле docker-compose.yml. Помните строку в настройках BookStack?
environment:
- DB_HOST=bookstack-db # Мы указали имя сервиса вместо IP!
Благодаря DNS Docker, контейнеру BookStack не нужно знать, какой сейчас IP-адрес у базы данных. Он просто отправляет сетевой запрос на имя bookstack-db. Docker перехватывает этот запрос, понимает, о каком контейнере идет речь, и мгновенно перенаправляет трафик по адресу.
Это полностью избавляет от головной боли: даже если база данных перезапустится и получит новый внутренний IP-адрес, связка не сломается, так как имя сервиса остается неизменным.
3. Безопасность и изоляция портов
Обратите внимание на критически важную деталь в нашем docker-compose.yml: директива ports прописана только у контейнера BookStack:
# У веб-приложения порты открыты наружу:
ports:
- "8080:80"
# У базы данных блока ports ВООБЩЕ НЕТ!
Это золотой стандарт безопасности селф-хостинга. Поскольку база данных находится в одной приватной Docker-сети с веб-приложением, BookStack прекрасно видит её внутренний порт 3306 по имени bookstack-db.
Но при этом снаружи (из интернета или вашей домашней локальной сети) подключиться к базе данных напрямую невозможно. Порт 3306 не опубликован на вашем сервере Debian. Злоумышленник даже при всем желании не сможет запустить брутфорс паролей к вашей СУБД, потому что для внешнего мира её просто не существует.
Полезные команды для работы с сетями
Вы можете посмотреть, какие виртуальные сети сейчас созданы в вашем Docker, введя команду:
docker network ls
Вы увидите, что для вашей Wiki создалась сеть с именем вида bookstack_default.
А если вам ради любопытства или диагностики захочется заглянуть внутрь сети и посмотреть реальные IP-адреса работающих контейнеров, выполните команду инспекции:
docker network inspect bookstack_default
💡 Главный урок для новичка:
Никогда не выставляйте порты баз данных (MySQL, PostgreSQL, Redis) наружу через директиву ports, если в этом нет крайней технической необходимости. Контейнеры внутри одного `docker-compose.yml` отлично общаются по внутренним именам в своей приватной сети, оставаясь полностью защищенными от внешних угроз.
Теперь наша связка работает, данные сохраняются, а сеть защищена. Нам осталось освоить базовые инструменты управления этой красотой в повседневной жизни и научиться убирать за собой мусор. Переходим к Главе 2.4: Шпаргалка по управлению и очистка диска.
Нет комментариев для отображения
Нет комментариев для отображения