Примечание. Если вы здесь просто ищете советы по устранению неполадок, чтобы заставить что-то, работающее в контейнере Docker, иметь возможность общаться с базой данных — особенно с базой данных MySQL — в хост-системе, пропустите немного ниже.

Я не был готов к тому, что половина веб-приложений, которые у меня были запущены в моей домашней лаборатории, чтобы взломать их, когда Debian обновил PHP с 7.4 до 8.1.

Да, многие из них я запускал на «голом железе» — то есть они не были внутри контейнеров.

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

В любом случае, большинство этих сайтов уже работали за обратным прокси-сервером. Итак, я спросил себя, а что, если я научусь запускать Apache и PHP 7.4 внутри Docker и позволю моей «основной» установке с «голым железом» следовать пути обновления Debian?

Ура, мне удалось заставить это работать.

Заинтересованы? Репозиторий доступен на GitHub, GitLab и мой личный git-репозиторий.

Контейнер, основанный на Debian bullseye-slim, будет загружать любые сайты, настроенные в подкаталоге apache-sites, и обслуживать файлы в подкаталоге www. По умолчанию он доступен через порт 8180 (поскольку все используют 8080), и это легко изменить, отредактировав одну строку в docker-compose.yaml.

Он предназначен для того, чтобы его можно было бросить на место, так что вам в основном придется перемещать несколько вещей. Идея состоит в том, что это (потенциально) такая же небольшая конфигурация, как перемещение файла конфигурации, создание символической ссылки и ввод docker-compose up -d — build.

Образ Docker также использует скрипт, который загружает модули Apache и настраивает php.ini при первом запуске. Возможно, вам вообще не нужно его трогать, хотя он изменяет некоторые значения по умолчанию, которые мне регулярно нужны в моей домашней лаборатории. Я попытался сделать его максимально чистым, прокомментированным и очевидным, что и как он делает в README.md, Dockerfile и docker-compose.yaml, потому что, хотя все это где-то задокументировано, оно определенно НЕ все задокументировано в одном месте.

Точно так же самой сложной частью было выяснить, как заставить его общаться с (уже существующими) базами данных на хост-компьютере. Это была просто самая трудоемкая часть всей задачи, поэтому, если вы наткнулись на это в поисках этого решения, вот вам:

Разговор докеризованного приложения с MySQL на хосте

Я понял это для MySQL, потому что это то, что мне было нужно для веб-приложений, которые я использовал. Я предполагаю, что у PgSQL и других похожие проблемы, YMMV.

Проблемы возникают из-за того, что MySQL имеет свои собственные разрешения, отличные от разрешений UID/GID пользователя. Чтобы это работало, вы теоретически немного ослабляете свою безопасность. Поэтому вы должны убедиться, что порт 3306 (для MySQL) недоступен из-за пределов вашей локальной сети.

-

Ваш брандмауэр должен разрешать доступ с IP-адреса или диапазона IP-адресов контейнера Docker. Вы можете узнать, что это за IP-адрес, запустив docker inspect | grep IP-адрес во время работы контейнера. Обычно сетевая маска 172.*.*.*/16.

-

Менее безопасный, но гораздо более простой метод заключается в том, чтобы брандмауэр на сервере разрешал доступ к порту 3306 и полагался на брандмауэр вышестоящего маршрутизатора для блокировки доступа. Если вы используете UFW, вы можете добиться этого, разрешив sudo ufw любой порт 3306.

-

Вам нужно будет убедиться, что пользователь базы данных может подключиться с чего-то другого, кроме локального хоста. Синтаксис «подключения из любого места» для MySQL — «пользователь» @ «%», например:

СОЗДАТЬ ПОЛЬЗОВАТЕЛЯ ‘myuser’@’%’, ОПРЕДЕЛЕННОГО ‘mycomplicatedpassword’;

ПРЕДОСТАВИТЬ ВСЕ ПРИВИЛЕГИИ НА mydb.* ТОМУ ‘myuser’@’%’;
-

Наконец, вам, вероятно, придется изменить адрес, к которому привязывается MySQL. Инструкции в Stack Overflow по адресу https://stackoverflow.com/questions/16287559/mysql-adding-user-for-remote-access#37341046 отлично сработали.

Я довольно много узнал о том, как все эти части работают вместе, собирая это вместе. Даже если готовый проект вам не нужен, я надеюсь, что просмотр его частей поможет кому-то еще лучше понять Docker и то, как его части работают вместе, так же, как это помогло мне.

Репозиторий доступен на GitHub, GitLab и мой личный git-репозиторий.

Избранное фото пользователя Rubaitul Azad на Unsplash