MariaDB   Podman(Docker)でMariaDBを使う
  (not ever)


Podman(Docker)でMariaDBを使う

以前PostgreSQLで試したのと同様、MariaDBもPodman(Docker) コンテナとして起動してみます。全く同様の手順もどうかと思い、こちらはDockerfileを作ることにしました。

●Dockerfileの作成
ホストOSはRHEL 9.2です。任意のOSユーザーで任意のディレクトリを作成し、Dockerfileを記述します。

cd ~/mariadb
mkdir podwork
nano Dockerfile
Dockerfileの内容です。
FROM mariadb:latest

COPY ./my.cnf   /etc/mysql/conf.d/my.cnf
COPY ./init.sql /docker-entrypoint-initdb.d/

VOLUME [ "/var/lib/mysql" ]
この中で引用している二つのファイルも作ります。まずmy.cnfです。
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
同様に init.sql です。
create database if not exists nkdb;
use nkdb;
CREATE TABLE ITEM_CATEGORIES(CATEGORY_ID INTEGER NOT NULL PRIMARY KEY, CATEGORY_NAME VARCHAR(100));
INSERT INTO ITEM_CATEGORIES(CATEGORY_ID, CATEGORY_NAME) VALUES (1, 'アイスクリーム');
設定方法の詳細は公式に書いてあります。
COPYで指定するこれらの2ファイルは主ファイル名は何でもよく、 指定のコピー先にそれぞれ.cnf, .sqlの拡張子で配置されたファイルが全て、 起動時に自動的に実行される仕組みになっています。

※VOLUMEについて
コンテナのストレージを他のコンテナやホストと共有するには、 匿名ボリューム、名前付きボリューム、バインドマウントの3つの方法があります。 DockerfileのVOLUMEはpodman runの-vと同様に、このディレクトリを外部のDockerボリュームかホスト側のディレクトリと結びつけることを明示しています。

●イメージの作成と初回起動
ではpodmanのコマンドを使ってイメージを作成します。

cd ~/mariadb/podwork
podman build -t mariadb-test-image .
podman images
イメージが作られたことを確認したら、早速コンテナを起動します。
podman run --name mariadb -e MARIADB_ROOT_PASSWORD=RootPassword -dp 3306:3306 \
 -e MARIADB_DATABASE=nkdb -e MARIADB_USER=nkdbuser -e MARIADB_PASSWORD=NkdbUserPassword mariadb-test-image
podman ps
公式の説明通り、多数の環境変数が指定できます。 MARIADB_ROOT_PASSWORDはrootユーザーのパスワード、 MARIADB_DATABASE、MARIADB_USER、MARIADB_PASSWORDは最初に作るアプリケーション用のデータベース、ユーザー、パスワードです。

コンテナが起動したら中に入ってみます。

podman exec -it mariadb /bin/bash
ここで
Error: can only create exec sessions on running containers: container state improper
というメッセージが表示された場合、初期設定で何らかのエラーがあることが考えられます。 とりあえずこのコンテナをpodman rmで削除後、今度はpodman runコマンドを-dを「付けずに」実行すると、 コンソールに何かが表示されると思います。 例えば、init.sqlに書いたCREATE TABLE文やINSERT文に文法エラーがあるとここでエラーになります。

podman exec -it mariadb /bin/bash
#
今度は入れました。では早速、コンテナ内部からmariadbコマンドでDBに接続してみると…
# mariadb -u root -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
おいおいおい。rootで入れないってどういうことよ。
と焦りますが、これは以前作成したvolumeが悪さをしているので、不要な物を消す必要があるようです。
podman volume ls
ただし「不要」ってどうやって分かるのよ。DockerfileでVOLUMEを指定してもpodman run -vでボリューム名を指定しない場合、 長い名前で表示されるので、どれがどれだか分かりません。そういうときにはVOLUME名を1個ずつ
podman volume inspect {VOLUME名}
とすると作成日時が分かるので、概ね思い出せるかもしれません。または
podman volume prune
とすると、コンテナに付属していないボリュームを削除してくれます。
podman stop mariadb
podman rm mariadb
podman volume prune
podman exec -it mariadb /bin/bash
# mariadb -u root -p
Enter password:
これでOKですね。無事接続できました。ちなみに単にPWが間違っている場合もこのエラーになるので、 Access denied = ミドルウェアのエラーとは限らないと思った方がいいです。

MariaDB[(none)]> use nkdb
MariaDB[nkdb]> select * from ITEM_CATEGORIES;
init.sqlで作成した ITEM_CATEGORIES 表が検索できることを確認します。
# mariadb -u nkdbuser -p
rootだけでなく、アプリケーションユーザーとして作成したユーザーnkdbuserでも接続できることを確認します。

●ホストOSからの接続
ホストOSからコンテナのMariaDBに接続してみます。

mariadb -h localhost -P 3306 -u nkdbuser -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
おろ?何かエラーになるんですけど。
これは、MariaDBは(MySQLも)localhostを指定した場合UNIXドメインソケットを使おうとするのですが、 ホストOSとコンテナはファイルシステムが分離されているので通信ができないため、このエラーになるのです。 解決策は
mariadb --host=127.0.0.1 -P 3306 -u nkdbuser -p
このように、localhostではなく127.0.0.1で接続することです。

  もくじ
MariaDB   (C) 2002-2023 MISUMI URANO (2024/01/04 - (not ever))