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)からのみ接続可能となる。
関連記事
-
-
Podmanで導入したapache-phpに各種PHPモジュールを追加する方法
先日Podmanでapache-php8.4を導入したが、phpinfoで確認す ...
-
-
Cockpitでプログラムの自動実行(systemd timer)設定を行う方法
Cockpitでプログラムの自動実行設定を行いたい。調べたところCronは難しそ ...
-
-
CockpitとPodmanでWebサーバ用コンテナを作成しHello Worldページを表示する方法
Cockpitにはcockpit-podmanというPodman(Dockerの ...
-
-
PodmanにComposerを導入し、パッケージをインストールする方法
先日Podmanで導入したapache-phpに各種PHPモジュールを追加したが ...
-
-
Podmanで作成したApache用コンテナにドメインを割り当て、ポート指定なしでアクセス可能にする方法
先日PodmanでWebサーバ用コンテナを作成したが、ブラウザからアクセスする際 ...