Примечание. Если вы здесь просто ищете советы по устранению неполадок, чтобы заставить что-то, работающее в контейнере 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