<===

ProNotes

2025-09-27 22:44:10
# Установка MariaDB в контейнере Podman: Путь к успеху (c) Grok ))

## Начало: Запуск контейнера
Я начал с запуска контейнера Alpine Linux через Podman, используя флаг `--net host` для совместного использования сетевого стека хоста и `--privileged` для большей свободы. Контейнер был настроен на выполнение скрипта `/run.sh`, если он существует, или на бесконечный сон для поддержания работы:

```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"
```

Внутри контейнера я обновил индекс пакетов и систему, чтобы подготовить чистую среду:

```sh
apk update
apk upgrade
```

С лёгким пакетным менеджером Alpine я установил MariaDB (совместимую с MySQL базу данных) и клиентские инструменты:

```sh
apk add mariadb mariadb-client
```

## Первое препятствие: Инициализация и запуск MariaDB
Для подготовки MariaDB я инициализировал директорию данных:

```sh
mysql_install_db --user=mysql --datadir=/var/lib/mysql
```

Затем запустил сервер с помощью `mysqld_safe`, который обеспечивает безопасные настройки по умолчанию:

```sh
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 запущен:

```sh
ps aux | grep mysqld
```

Процесс был активен, но `netstat` не показывал TCP-подключения. Это указывало на проблему с конфигурацией, вероятно, MariaDB использовала только сокеты или неправильно настроенный `bind-address`.

## Глубокое погружение: Конфигурация и сеть
Я проверил конфигурационные файлы MariaDB (`/etc/my.cnf` или `/etc/mysql/my.cnf`) и обнаружил, что, скорее всего, включена опция `skip-networking`, ограничивающая MariaDB только сокетами. Чтобы включить TCP, я создал конфигурационный файл:

```sh
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:

```sh
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:

```sh
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:

```sh
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, чтобы подключить директорию хоста:

```sh
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):

```sh
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!

---
← Previous Next →
Back to list