勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

Podmanでデータベース用コンテナを作成しWebサーバ用コンテナと接続する方法

Podmanでデータベース用コンテナを作成し、Webサーバ用コンテナからPHPでデータベースを使用したい。つまり、いつもLAMP環境でやっているPHP&MySQL(MariaDB)でプログラムを作るようなことをしたい。調べたところMariaDBの方がメモリ消費量の面で良さそう。以下に対応方法をメモ。

 

環境について

VPS

今回はKAGOYA CLOUD VPSのCPU1コア / メモリ1GBプランで作業した。SSH接続は公式案内の通り以下でログインできる。

  • 接続ポート -> 22
  • ユーザ名 -> root
  • パスワード or 秘密鍵 -> インスタンス作成時に選択したもの

ホスト(VPS)側 AlmaLinux / Apache

詳細なバージョンは以下の通り。

# AlmaLinuxのバージョン確認
cat /etc/redhat-release

# 実行結果
AlmaLinux release 8.10 (Cerulean Leopard)

# Apacheのバージョン確認
httpd -v

# 実行結果
Server version: Apache/2.4.37 (AlmaLinux)

Webサーバコンテナ

Webサーバコンテナへのメモリ割り当ては384MBにしている。OSとApacheは以下の通り。

# OSのバージョン確認
podman exec 【コンテナ名】 cat /etc/os-release

# 実行結果
PRETTY_NAME="Debian GNU/Linux 13 (trixie)"
NAME="Debian GNU/Linux"
VERSION_ID="13"
VERSION="13 (trixie)"
VERSION_CODENAME=trixie
DEBIAN_VERSION_FULL=13.6

# Apacheのバージョン確認(Debian系のためhttpdではなくapache2)
podman exec 【コンテナ名】 apache2 -v

# 実行結果
Server version: Apache/2.4.68 (Debian)

 

対応方法

データの永続化用ディレクトリを作成

データベース用コンテナの削除→再生成を行っても、それまでのデータを残すため永続用ディレクトリを以下で作成しておく。

mkdir -p /var/lib/mariadb_data

イメージの作成

Cockpit上で行う場合

「Cockpit > Podmanコンテナページ > イメージ欄右側にあるメニューアイコン(縦の三転リーダー、ケバブボタン)」をクリックし、新規イメージのダウンロードを選択する。

ダイアログが開くので以下の通り入力・選択の上、ダウンロードする。

  • 所有者 → システム
  • 検索 → docker.io/library/mariadbで検索して選択
  • タグ → 空のまま

CUIで行う場合

以下コマンドを実行する。

podman pull docker.io/library/mariadb

コンテナの作成

Cockpit上で行う場合

次に「Cockpit > Podmanコンテナページ > イメージ欄のにあるコンテナーの作成ボタン」をクリックする。

詳細タブ内を以下の通り、

  • 名前 -> 任意の名前を入力。今回は分かりやすく「mariadb-plus-1.0」
  • 所有者 -> システム
  • メモリー制限 -> チェックを入れて256MB(任意)
  • その他項目 -> デフォルトのまま

インテグレーションタブ内のボリュームを以下の通り、

  • ホストパス -> /var/lib/mariadb_data(事前に設定したデータ永続用ディレクトリ)
  • コンテナパス -> /var/www/mysql

環境変数を以下の通り設定する(環境変数はキー : 値のペア)。値側は適宜変更すること。

  • MARIADB_ROOT_PASSWORD : test_root_pass(ルート用パスワード)
  • MARIADB_DATABASE : test_database(初期に作成されるデータベース名)
  • MARIADB_USER : test_user(一般ユーザ名)
  • MARIADB_PASSWORD : test_user_pass(一般ユーザのパスワード)

以上の設定を行い「作成して実行する」ボタンを押下するとコンテナが作成される筈。

CUIで行う場合

以下コマンドを実行する。

podman run -d \
  --name mariadb-plus-1.0 \
  --memory=256m \
  -e MARIADB_ROOT_PASSWORD=test_root_pass \
  -e MARIADB_DATABASE=test_database \
  -e MARIADB_USER=test_user \
  -e MARIADB_PASSWORD=test_user_pass \
  -v /var/lib/mariadb_data:/var/lib/mysql:Z \
  docker.io/library/mariadb:11.4

ネットワーク設定

コンテナ間を接続するネットワークについてCockpitからは管理できないっぽい。少なくとも私の環境(cockpit-310.8-1.el8_10.x86_64)ではできなかったため、CUI上で以下設定を行う。

まずは以下でネットワークを作成する。「web-db-net」はネットワーク名となり、任意の文字でOK。

# ネットワークの作成
podman network create web-db-net

以下で作成済みネットワークの一覧と詳細が確認できる。

# 設定済みネットワークの一覧を確認
podman network ls

# 設定済みネットワークの詳細を確認
podman network inspect web-db-net

次に以下コマンドでコンテナをネットワークに接続する。

# コンテナをネットワークに接続する構文
# podman network connect 【ネットワーク名】 【コンテナ名】

# 「apache-php8.4-plus-1.4」「mariadb-plus-1.0」コンテナを「web-db-net」ネットワークに接続する
podman network connect web-db-net apache-php8.4-plus-1.4
podman network connect web-db-net mariadb-plus-1.0

以下で指定したコンテナのネットワーク接続状況を確認できる。

# 「mariadb-plus-1.0」コンテナのネットワーク接続情報を確認
podman inspect --format='{{.NetworkSettings.Networks}}' mariadb-plus-1.0

# 出力結果(podmanとweb-db-netというネットワークに接続中)
map[podman:0x387f7966f680 web-db-net:0x387f7966f7a0]

念のため、ネットワークへの接続を解除する場合やネットワーク自体を削除するコマンドは以下の通り。

# コンテナのネットワーク接続を解除する構文
podman network disconnect 【ネットワーク名】 【コンテナ名】

# コンテナのネットワーク自体を削除する構文
podman network rm 【ネットワーク名】

ここまでで問題無く設定できれば接続できている筈。

以下テスト用ファイルをアップロードし、ブラウザからアクセスして接続できているか確認すると良い。ホスト名はデータベース用コンテナ名(今回の場合はmariadb-plus-1.0)になる点にだけ注意。

<?php
$dbhost = ''; // コンテナ名
$dbuser = '';
$dbpass = '';
$dbname = '';

$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);

if ($mysqli->connect_error) {
    echo '接続失敗:' . $mysqli->connect_error;
} else {
    echo '接続成功';
}

接続できない場合は以下辺りを確認する。

  • ログイン用のアカウント情報に間違いがないか
  • 前述の指定したコンテナが指定したネットワークに接続しているか
  • pdoやmysqliを使用する場合、モジュールが導入されているか

補足

ポートマッピングについて

Webサーバ用コンテナの場合はポートマッピングで「8080:80」のように設定したがデータベースの場合は不要。未設定にすることで外部からの接続は不可となり、同じPodmanネットワーク上(今回だとweb-db-net)からのみ接続可能となる。

 - MySQL データベース サーバー

  関連記事

サーバ管理ツール「Cockpit」にファイルマネージャー用プラグインを導入する方法
サーバ管理ツール「Cockpit」にファイルマネージャー用プラグインを導入する方法

先日メモしたサーバ管理ツール「Cockpit」にブラウザ上からファイルの作成や編 ...

Podmanで導入したapache-phpに各種PHPモジュールを追加する方法
Podmanで導入したapache-phpに各種PHPモジュールを追加する方法

先日Podmanでapache-php8.4を導入したが、phpinfoで確認す ...

Podmanで作成したApache用コンテナにドメインを割り当て、ポート指定なしでアクセス可能にする方法
Podmanで作成したApache用コンテナにドメインを割り当て、ポート指定なしでアクセス可能にする方法

先日PodmanでWebサーバ用コンテナを作成したが、ブラウザからアクセスする際 ...

Podmanで作成したApache用コンテナにLet's Encryptを導入しHTTPS接続できるようにする方法
Podmanで作成したApache用コンテナにLet's Encryptを導入しHTTPS接続できるようにする方法

先日Podmanで作成したApache用コンテナに対してドメインを割り当てたが、 ...

サーバー管理をブラウザベース(GUI)で行えるCockpitの導入方法
サーバー管理をブラウザベース(GUI)で行えるCockpitの導入方法

以前にサーバ管理をブラウザ上で行えるWebminについてメモしたが、もっと機能を ...