Начало: Запуск контейнера

Я начал с запуска контейнера 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]