Начало: Запуск контейнера
Я начал с запуска контейнера Alpine Linux через Podman, используя флаг --net host для совместного использования сетевого стека хоста и --privileged для большей свободы. Контейнер был настроен на выполнение скрипта /run.sh, если он существует, или на бесконечный сон для поддержания работы:
podman run -d -it -v /tmp:/inter --net host --privileged --name mysql alpine /bin/sh -c "if [ -f /run.sh ];then /run.sh; else echo 'run.sh not found'; fi; sleep infinity"
Внутри контейнера я обновил индекс пакетов и систему, чтобы подготовить чистую среду:
apk update
apk upgrade
С лёгким пакетным менеджером Alpine я установил MariaDB (совместимую с MySQL базу данных) и клиентские инструменты:
apk add mariadb mariadb-client
Первое препятствие: Инициализация и запуск MariaDB
Для подготовки MariaDB я инициализировал директорию данных:
mysql_install_db --user=mysql --datadir=/var/lib/mysql
Затем запустил сервер с помощью mysqld_safe, который обеспечивает безопасные настройки по умолчанию:
mysqld_safe --user=mysql --datadir=/var/lib/mysql &
Проверка подключения через mariadb -u root прошла успешно, подтвердив, что MariaDB работает и доступна через Unix-сокет. Но моя цель была подключиться по TCP (127.0.0.1:3306), так как мне нужен был сетевой доступ.
Проблема с TCP: Ошибка подключения
Попытка подключиться через mariadb -u root -p -h 127.0.0.1 дала ошибку:
ERROR 2002 (HY000): Can't connect to server on '127.0.0.1' (115)
Код ошибки 115 (ECONNREFUSED) указывал, что MariaDB не слушает порт 3306. Проверка с помощью netstat -nltp подтвердила, что на порту 3306 ничего нет, хотя другие сервисы (например, порты 80, 443) работали на сетевом стеке хоста из-за --net host.
Я проверил, что процесс MariaDB запущен:
ps aux | grep mysqld
Процесс был активен, но netstat не показывал TCP-подключения. Это указывало на проблему с конфигурацией, вероятно, MariaDB использовала только сокеты или неправильно настроенный bind-address.
Глубокое погружение: Конфигурация и сеть
Я проверил конфигурационные файлы MariaDB (/etc/my.cnf или /etc/mysql/my.cnf) и обнаружил, что, скорее всего, включена опция skip-networking, ограничивающая MariaDB только сокетами. Чтобы включить TCP, я создал конфигурационный файл:
mkdir -p /etc/mysql
echo -e "[mysqld]\nbind-address=0.0.0.0\nskip-networking=0" > /etc/mysql/my.cnf
Это настроило MariaDB на прослушивание всех интерфейсов (0.0.0.0), включая 127.0.0.1, и явно отключило skip-networking. Я перезапустил MariaDB:
killall mysqld
mysqld_safe --user=mysql --datadir=/var/lib/mysql &
Проверка netstat -nltp | grep 3306 показала:
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN <pid>/mysqld
Успех! MariaDB теперь слушала порт 3306.
Победа: Подключение по TCP
С исправленной конфигурацией я снова попробовал подключиться по TCP:
mariadb -u root -p -h 127.0.0.1
И вот оно — я получил доступ к MariaDB:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 11.4.8-MariaDB Alpine Linux
Подключение сработало! Флаг --net host обеспечил корректное разрешение 127.0.0.1, и MariaDB стала доступна по TCP.
Финальные штрихи: Автоматизация и сохранение данных
Чтобы сделать настройку надёжной, я создал скрипт /run.sh для автоматической инициализации и запуска MariaDB:
echo -e '#!/bin/sh\nmysql_install_db --user=mysql --datadir=/var/lib/mysql\nmysqld_safe --user=mysql --datadir=/var/lib/mysql &' > /run.sh
chmod +x /run.sh
Это гарантировало запуск MariaDB при перезапуске контейнера. Я также заметил, что данные в /var/lib/mysql не сохранялись из-за временной природы контейнера. Для этого я запланировал обновление команды Podman, чтобы подключить директорию хоста:
podman run -d -it -v /host/mysql-data:/var/lib/mysql --net host --name mysql alpine /bin/sh -c "if [ -f /run.sh ];then /run.sh; else echo 'run.sh not found'; fi; sleep infinity"
Права доступа для директории на хосте я настроил под пользователя mysql (UID 101, GID 102):
chown 101:102 /host/mysql-data
chmod 750 /host/mysql-data
Уроки, которые я вынес
Этот процесс научил меня нескольким важным вещам:
- Особенности Alpine: MariaDB в Alpine по умолчанию может использовать только сокеты, требуя явной настройки TCP.
- Флаг
--net hostв Podman: Упрощает сетевую конфигурацию, но требует внимания к файрволу хоста. - Сохранение данных: Всегда подключайте директорию хоста для
/var/lib/mysql, чтобы избежать потери данных. - Инструменты отладки: Команды
netstat,ps auxи проверка логов (/var/log/mysql/) — неоценимая помощь в диагностике.
Заключение
Пройдя через трудности с конфигурацией и проблемами TCP-подключения, я успешно настроил MariaDB в контейнере Alpine Linux, доступную по 127.0.0.1:3306. Этот процесс напомнил мне о важности проверки конфигураций, сетевых привязок и сохранения данных в контейнерах. Теперь, когда MariaDB работает, я готов создавать базы данных, настраивать пользователей или даже включить удалённый доступ для следующего проекта. Это путешествие стало доказательством силы упорства и систематической отладки в мире DevOps!
---
[file-name 000243_2025-09-27_22-44-10.txt]