🚞

最小構成(PostgreSQL)で学ぶDocker/Podman

1. はじめに

みなさん、こんにちは。私の学習も兼ねて、PostgreSQLのみの最小構成のDocker/Podmanコンテナを作ってみました。コンテナを作る中でDocker/Podmanの知見が深まったので、お話しできたらと思います!構築に必要な資源をGitHubにアップしました。ぜひご覧ください!
https://github.com/Masa1984a/PostgreSQL_Minimum_Database_Container

2. コンテナ技術とは?

コンテナ技術とは、アプリケーションとその実行環境を一つのパッケージ(コンテナイメージ)にまとめ、様々な環境で一貫して動作させる技術です。代表的なツールとしてDockerがあり、本記事で扱うPodmanも同様の機能を提供しつつ、デーモンレスアーキテクチャやルートレスコンテナといった特徴を持ちます。

従来の仮想マシンがOS全体を仮想化するのに対し、コンテナはホストOSのカーネルを共有しプロセスレベルで分離するため、軽量・高速・高集約率・ポータビリティに優れています。

コンテナの主なメリットは、環境の標準化と再現性迅速なデプロイとスケーリングリソース効率の向上開発効率の向上、そしてマイクロサービスアーキテクチャとの親和性です。

「最小構成」から学ぶことで、複雑な設定ファイルに頼らずコンテナ技術の本質を理解し、コマンドライン操作に習熟でき、基礎から段階的に知識を積み上げることができるんじゃないかなと考えています!

3. PostgreSQL Minimum Database Container の概要

GitHubにアップした「PostgreSQL Minimum Database Container」について説明します。

「PostgreSQL Minimum Database Container」は、Podman CLIを使用して、シンプルかつ迅速にPostgreSQLデータベース環境を構築するオープンソースプロジェクトです。最小構成に徹しており、複雑な設定ファイルを必要とせず、数個のコマンドだけで利用可能なPostgreSQL環境が手に入ります。

技術スタックとしてPostgreSQL 16Podman CLIを採用しています。Podmanのデーモンレスアーキテクチャとルートレスコンテナ機能により、安全かつ効率的なコンテナ管理が可能です。

このプロジェクトの主な利点は、迅速な環境セットアップ初期化済みデータベース(mcp_ux)とサンプルデータの自動提供再現性の高い開発・テスト環境構築、コンテナ技術の基礎学習機会の提供、そしてリソースの効率的な利用です。

開発初期段階やテスト、SQLの学習など、手軽にPostgreSQL環境が必要な場面に特に適しています。

4. 環境構築してみる

ここからは、実際に「PostgreSQL Minimum Database Container」プロジェクトを使って、PostgreSQLコンテナ環境を構築する手順をステップバイステップで解説していきます。

前提条件

この環境構築を進めるにあたり、お使いのPC環境が以下の条件を満たしていることを確認してください。Readmeに記載の通り、Windows環境をベースに解説しますが、Podmanの基本的な操作は他のOSでも類似しています。

  • Windows PC: Windows 10 または Windows 11。MacやLinuxでもPodmanは利用可能ですが、本手順はWindows PowerShellでのコマンド実行を想定しています。
  • Podman CLI のインストール: PodmanがPCにインストールされている必要があります。Podman Desktopをインストールすると、Podman CLIも一緒にセットアップされることが多いです。公式サイト (https://podman.io/getting-started/installation) を参考に、ご自身の環境に合わせてインストールしてください。Windowsの場合、Podman Desktopのインストールが推奨されます。
  • WSL2 (Windows Subsystem for Linux 2) の有効化: Windows上でLinuxコンテナを実行するため、PodmanはWSL2を利用します。WSL2が有効化され、デフォルトのLinuxディストリビューションが設定されていることを確認してください。Podman DesktopのインストールプロセスでWSL2のセットアップが促されることもあります。

これらの準備が整っていない場合は、先に環境をセットアップしてください。

セットアップ手順

それでは、具体的なセットアップ手順に入りましょう。コマンドプロンプトやPowerShellを開き、以下のコマンドを順に実行していきます。

1. リポジトリのクローンまたはダウンロード

まず、プロジェクトのファイル一式をローカルPCに取得します。Gitがインストールされている場合は、以下のコマンドでリポジトリをクローンするのが最も簡単です。

git clone https://github.com/Masa1984a/PostgreSQL_Minimum_Database_Container.git
cd PostgreSQL_Minimum_Database_Container

Gitを普段使わない方や、手軽に試したい場合は、GitHubのリポジトリページ (https://github.com/Masa1984a/PostgreSQL_Minimum_Database_Container) からZIPファイルをダウンロードし、任意の場所に展開しても構いません。展開後、コマンドプロンプトやPowerShellでそのディレクトリに移動してください。

このリポジトリには、データベース初期化用のSQLスクリプトなどが含まれています。

2. 使用中のPodmanマシンの確認と起動

Podman (特にWindowsやmacOS版のPodman Desktop) は、Linuxコンテナを実行するために内部的に仮想マシン(Podmanマシン)を利用します。まず、現在アクティブなPodmanマシンを確認しましょう。

podman machine list

このコマンドを実行すると、利用可能なPodmanマシンの一覧が表示されます。以下のような出力が得られるはずです。

NAME                     VM TYPE     CREATED         LAST UP            CPUS        MEMORY      DISK SIZE
podman-machine-default*  wsl         3 weeks ago     Currently running  8           2.032GB     10.74GB

NAMEの横にアスタリスク * が付いているマシンが、現在Podmanコマンドの操作対象となっているアクティブなマシンです。LAST UP の状態が Currently running であれば、マシンは既に起動しています。

もしアクティブなマシンが存在しない場合や、起動していない場合(例えば NeverExited と表示される場合)は、Podmanマシンを初期化し、起動する必要があります。

# マシンが存在しない場合、または新規に作成する場合
podman machine init

# デフォルトマシンを起動する場合
podman machine start

# 特定のマシン名を指定して起動する場合 (例: podman-machine-default)
podman machine start podman-machine-default

podman machine init は、デフォルト設定で新しいPodmanマシンを作成します。作成には少し時間がかかることがあります。その後、podman machine start でマシンを起動します。マシンが起動すると、Podmanがコンテナを実行するためのLinux環境がバックグラウンドで準備されます。

3. データベース用の永続ボリュームを作成

次に、PostgreSQLデータベースのデータを永続的に保存するためのPodmanボリュームを作成します。コンテナは本来ステートレス(状態を持たない)なものとして設計されることが多いですが、データベースのようにデータを保持し続ける必要があるアプリケーションでは、データをコンテナの外部に保存する仕組みが必要です。その一つが名前付きボリュームです。

以下のコマンドで postgres_data という名前のボリュームを作成します。

podman volume create postgres_data

実行すると、ボリューム名 postgres_data が表示されれば成功です。このボリュームは、後ほどコンテナ内のPostgreSQLデータディレクトリ(/var/lib/postgresql/data)にマウントされ、コンテナを削除してもデータベースのデータが失われないようにします。

なぜボリュームが必要なのでしょうか?コンテナを停止・削除すると、コンテナ内部のファイルシステムへの変更は通常失われてしまいます。しかし、ボリュームを使用すると、データはPodmanが管理するホストOS上(正確にはPodmanマシン内)の特定の場所に保存され、コンテナのライフサイクルとは独立してデータを保持できます。これにより、コンテナをバージョンアップしたり、誤って削除してしまったりした場合でも、データは安全に保たれます。

4. Podman CLI でデータベースコンテナを起動

いよいよPostgreSQLコンテナを起動します。以下の podman run コマンドを実行してください。

LinuxやmacOSのターミナル、またはWSL内のBashで実行する場合:

podman run -d --name postgres-db \
  -e POSTGRES_USER=postgres \
  -e POSTGRES_PASSWORD=postgres \
  -e POSTGRES_DB=mcp_ux \
  -v postgres_data:/var/lib/postgresql/data \
  -v ./db/init:/docker-entrypoint-initdb.d \
  -p 5432:5432 \
  postgres:16

バックスラッシュ \ はコマンドが長くなるため、見やすく改行するためのものです。一行で入力しても問題ありません。

Windows PowerShellで実行する場合:

Windows PowerShellでは、行継続文字がバッククォート ` になります。

podman run -d --name postgres-db `
  -e POSTGRES_USER=postgres `
  -e POSTGRES_PASSWORD=postgres `
  -e POSTGRES_DB=mcp_ux `
  -v postgres_data:/var/lib/postgresql/data `
  -v ./db/init:/docker-entrypoint-initdb.d `
  -p 5432:5432 `
  postgres:16

このコマンドを実行すると、Podmanはまず postgres:16 というコンテナイメージをローカルに探します。もしローカルに存在しなければ、自動的にコンテナイメージレジストリ(デフォルトではDocker Hubなど)からダウンロードします。イメージのダウンロードには数分かかることがあります。

ダウンロード後、指定されたオプションに基づいてコンテナが作成され、バックグラウンドで起動します。成功すると、長い文字列(コンテナID)が表示されます。

このコマンドで行っている主な設定は以下の通りです。

  • -d: コンテナをバックグラウンドで実行(デタッチモード)。
  • --name postgres-db: コンテナに postgres-db という名前を付けます。
  • -e POSTGRES_USER=postgres: PostgreSQLのスーパーユーザー名を postgres に設定。
  • -e POSTGRES_PASSWORD=postgres: スーパーユーザーのパスワードを postgres に設定。
  • -e POSTGRES_DB=mcp_ux: mcp_ux という名前のデータベースを初期作成。
  • -v postgres_data:/var/lib/postgresql/data: 先ほど作成した postgres_data ボリュームを、コンテナ内のPostgreSQLデータディレクトリにマウント。
  • -v ./db/init:/docker-entrypoint-initdb.d: 現在のディレクトリ(リポジトリをクローンした場所)にある db/init ディレクトリを、コンテナ内の初期化スクリプト用ディレクトリにマウント。ここにある init.sql が初回起動時に実行され、テーブルやサンプルデータが作成されます。
  • -p 5432:5432: ホストOS(Podmanマシン)のポート5432を、コンテナ内のPostgreSQLがリッスンするポート5432にフォワーディングします。これにより、ホストOS側からコンテナ内のPostgreSQLにアクセスできるようになります。
  • postgres:16: 使用するコンテナイメージの名前とタグ(バージョン)です。公式のPostgreSQLイメージのバージョン16を指定しています。

5. コンテナが正常に動作していることを確認

コンテナが正しく起動し、実行中であることを確認しましょう。

podman ps

このコマンドは、現在実行中のコンテナの一覧を表示します。以下のような出力が表示されれば、postgres-db コンテナは正常に動作しています。

CONTAINER ID  IMAGE                            COMMAND               CREATED        STATUS                  PORTS                   NAMES
xxxxxxxxxxxx  docker.io/library/postgres:16  postgres -D /var...  2 minutes ago  Up 2 minutes (healthy)  0.0.0.0:5432->5432/tcp  postgres-db

STATUSUp ... (healthy) となっていれば、PostgreSQLサーバーが起動し、外部からの接続を受け付ける準備が整っていることを示します。PORTS0.0.0.0:5432->5432/tcp と表示されていれば、ポートフォワーディングも正しく設定されています。

もしコンテナが表示されない、または STATUS が期待通りでない場合は、podman logs postgres-db コマンドでコンテナのログを確認し、エラーの原因を調査してください。

6. Podmanマシンの接続用IPアドレスを確認

WindowsやmacOSでPodman Desktopを使用している場合、コンテナはPodmanマシン(WSL2上のLinux VMなど)のネットワーク内で実行されます。そのため、Windowsホストからコンテナ内のPostgreSQLに接続するには、localhost127.0.0.1 ではなく、このPodmanマシンのIPアドレスを指定する必要があります。

以下のコマンドで、PodmanマシンのIPアドレスを確認します。

# デフォルトマシン (名前に * がついているマシン) のIPアドレスを確認
podman machine ssh "ip addr show eth0 | grep 'inet '"

# もし複数のマシンがあり、特定のマシンのIPを知りたい場合 (例: podman-machine-default)
# podman machine ssh <マシン名> "ip addr show eth0 | grep 'inet '"

このコマンドは、PodmanマシンにSSH接続し、その内部で ip addr show eth0 コマンドを実行してネットワークインターフェース eth0 の情報を取得し、その中から inet で始まる行(IPアドレス情報が含まれる行)を抽出しています。

出力例:

    inet 172.27.123.45/20 brd 172.27.127.255 scope global eth0

この例では、172.27.123.45 がPodmanマシンのIPアドレスです。このIPアドレスを控えておいてください。データベースクライアントから接続する際に使用します。

注意: このIPアドレスは、Podmanマシンを再起動したり、ネットワーク環境が変わったりすると変更される可能性があります。接続できなくなった場合は、再度このコマンドでIPアドレスを確認してください。

データベース接続情報

ここまでの手順で、PostgreSQLコンテナが起動し、接続準備が整いました。データベースへの接続に必要な情報は以下の通りです。

  • ホスト: 上記手順6で確認したPodmanマシンのIPアドレス (例: 172.27.123.45)
  • ポート: 5432 ( podman run コマンドの -p オプションで設定したポート)
  • データベース名: mcp_ux ( podman run コマンドの -e POSTGRES_DB で設定した名前)
  • ユーザー名: postgres ( podman run コマンドの -e POSTGRES_USER で設定した名前)
  • パスワード: postgres ( podman run コマンドの -e POSTGRES_PASSWORD で設定したパスワード)
  • スキーマ名: mcp_ux (初期化スクリプト db/init/init.sql 内で作成されるスキーマ。このプロジェクトではデータベース名と同じ名前で作成されます)

重要な注意点 (Windowsユーザー向け): Windowsからこのコンテナ内のPostgreSQLに接続する場合、ホスト名として localhost127.0.0.1 を使用しないでください。必ず、手順6で確認したPodmanマシンのIPアドレスを使用する必要があります。これは、コンテナがWindowsホストの直接のネットワークではなく、WSL2内のPodmanマシンという別のネットワーク空間で動作しているためです。

データベースへの接続方法

上記の接続情報を使って、様々な方法でデータベースに接続できます。

psql (コマンドラインクライアント)

psql はPostgreSQL標準のコマンドラインクライアントです。コンテナ内で直接 psql を実行するのが最も手軽な方法の一つです。以下の podman exec コマンドを使用します。

podman exec -it postgres-db psql -U postgres -d mcp_ux
  • podman exec: 実行中のコンテナ内でコマンドを実行します。
  • -it: インタラクティブなTTY(端末)を割り当てます。これにより、psql のプロンプトと対話できます。
  • postgres-db: コマンドを実行するコンテナの名前。
  • psql -U postgres -d mcp_ux: psql コマンド本体です。-U postgres でユーザー名を、-d mcp_ux でデータベース名を指定しています。

実行すると、パスワード(postgres)の入力を求められる場合があります(PostgreSQLの認証設定によりますが、このイメージのデフォルトではローカル接続でパスワードなしで入れることもあります)。接続に成功すると、mcp_ux=# のようなプロンプトが表示され、SQLコマンドを入力できるようになります。

例えば、初期化スクリプトで作成されたテーブルの一覧を表示するには、\dt コマンドを実行します。

mcp_ux=# \dt

userstickets といったテーブル名が表示されれば、正常にデータベースとスキーマ、テーブルが作成されています。SELECT * FROM users; のようなSQLクエリも実行できます。
psql を終了するには、\q と入力してEnterキーを押します。

GUIクライアント (pgAdmin, DBeaverなど)

pgAdminやDBeaver、DataGripといったGUIのデータベース管理ツールを使用することももちろん可能です。これらのツールから新規接続を作成する際に、上記の「データベース接続情報」で確認した各項目(ホストIPアドレス、ポート、データベース名、ユーザー名、パスワード)を設定してください。

  • pgAdmin: PostgreSQL公式の管理ツールです。サーバー接続設定で、「Connection」タブにホストIP、ポート、DB名、ユーザー名、パスワードを入力します。
  • DBeaver: 多くのデータベースに対応した汎用SQLクライアントです。新しい接続を作成し、「PostgreSQL」を選択後、同様に接続情報を入力します。

GUIツールを使えば、テーブル構造の確認、データの閲覧・編集、SQLの実行などが視覚的に行えるため、開発効率が向上します。特に、mcp_ux スキーマ内にどのようなテーブルやデータが初期作成されているかを確認するのに便利です。

GUIクライアント (A5:SQL Mk-2)

データベースのツールで有名なA5:SQL Mk-2でも接続してみましょう。このアプリケーションは下記から最新版をダウンロードできます!
https://a5m2.mmatsubara.com/
インストールしたうえで起動すると、ワークスペースの設定が求められます。任意の名称を入力しましょう。

追加したワークスペースを選択した状態で「起動」ボタンを押下します。

「OK」ボタンを押下します。

「追加」ボタンを押下します。

「PostgreSQL(直接接続)」ボタンを押下します。

PostgreSQLの接続情報を入力します。その後、「テスト接続」ボタンを押下します。

「接続に成功しました。」と表示されればOKです!

こんな感じでクエリーを実行できます。

動作確認のために使用したSQL
select * from mcp_ux.tickets;

5. コンテナの管理と運用

PostgreSQLコンテナを無事に起動し、接続できるようになったところで、次は日常的な管理や運用に関するトピックを見ていきましょう。開発中やテスト中にコンテナを一時停止したり、問題が発生した際にログを確認したり、あるいはデータベースのスキーマを変更したくなったりと、様々な状況が考えられます。そうした場面で役立つPodmanコマンドや考え方を解説します。

コンテナの停止、再起動

開発作業が一段落した際や、PCのリソースを他の作業に割り当てたい場合など、起動中のコンテナを一時的に停止したいことがあります。

コンテナの停止

postgres-db コンテナを停止するには、以下のコマンドを実行します。

podman stop postgres-db

このコマンドは、コンテナ内のPostgreSQLプロセスに停止シグナルを送信し、安全にシャットダウン処理が行われるのを待ちます。成功すると、コンテナ名 postgres-db が表示されます。

停止後、podman ps コマンドを実行しても、postgres-db コンテナは表示されなくなります(実行中のコンテナのみ表示するため)。停止したコンテナも含めて全てのコンテナの状態を確認したい場合は、-a オプション(--all)を付けて実行します。

podman ps -a

STATUSExited (...) となっているのが確認できるはずです。

コンテナの再起動(開始)

一度停止したコンテナを再度起動(開始)するには、以下のコマンドを実行します。

podman start postgres-db

これにより、以前の状態(ボリュームに保存されたデータなど)を引き継いだまま、コンテナが再び起動します。起動後、再度 podman ps で状態を確認し、STATUSUp ... (healthy) になるのを待ちましょう。PodmanマシンのIPアドレスも変わっていなければ、以前と同じ接続情報でデータベースにアクセスできるはずです。

もしコンテナの設定を変更せずに単に再起動したいだけであれば、podman restart postgres-db というコマンドも利用できます。これは stopstart を連続して行うのとほぼ同等です。

ログの確認

コンテナが期待通りに動作しない場合や、PostgreSQLサーバー内部で何が起きているかを確認したい場合、コンテナのログを参照するのが最も基本的なトラブルシューティング方法です。

podman logs postgres-db

このコマンドは、postgres-db コンテナの標準出力および標準エラー出力を表示します。PostgreSQLの起動メッセージ、実行されたクエリ(設定による)、エラーメッセージなどが記録されています。

もしログが大量に出力されていて最新のログだけを見たい場合や、リアルタイムでログを監視したい場合は、-f オプション(--follow)を付けると便利です。

podman logs -f postgres-db

この状態でコンテナに何らかの操作を行うと、関連するログがリアルタイムで表示されます。監視を終了するには、Ctrl+C を押します。
また、 --tail オプションで表示する行数を指定することもできます。例えば、最新の100行だけを表示する場合は以下のようになります。

podman logs --tail 100 postgres-db

コンテナ起動時の問題や接続エラーの原因究明には、まずログを確認する癖をつけると良いでしょう。

接続トラブルシューティングのヒント

データベースに接続できない場合、いくつかの原因が考えられます。Readmeにも記載されている確認ポイントを元に、対処法を見ていきましょう。

  1. Podmanマシンが実行中か確認: WindowsやmacOSでPodman Desktopを利用している場合、Podmanマシン(WSL2など)が起動している必要があります。

    podman machine list
    

    LAST UPCurrently running になっているか確認します。停止していれば podman machine start で起動してください。

  2. コンテナの状態を確認: postgres-db コンテナが実行中であり、かつ健全な状態(healthy)であるか確認します。

    podman ps
    

    STATUSUp ... (healthy) となっているか確認します。もし Exited になっていたり、(unhealthy) と表示されていたりする場合は、podman logs postgres-db でエラー原因を調査し、必要であれば podman restart postgres-db でコンテナを再起動します。

  3. Podmanマシンの接続用IPアドレスを再確認: 特にPodmanマシンを再起動した場合など、IPアドレスが変更されている可能性があります。

    podman machine ssh "ip addr show eth0 | grep 'inet '"
    

    取得したIPアドレスが、データベースクライアントの設定と一致しているか確認してください。

  4. ポートフォワーディングの確認: podman ps の出力で、PORTS の項目が 0.0.0.0:5432->5432/tcp のようになっているか確認します。これが正しく設定されていないと、ホストOSからコンテナの5432ポートにアクセスできません。

  5. ファイアウォールの設定: ホストOSや、場合によってはWSL2環境内のファイアウォールが、ポート5432への通信をブロックしていないか確認してください。通常、Podman Desktopが適切に設定を行いますが、セキュリティソフトなどが影響することもあります。

  6. クライアント側の設定ミス: データベースクライアント(pgAdmin, DBeaverなど)の接続設定(ホストIP、ポート番号、データベース名、ユーザー名、パスワード)が正しいか、再度確認してください。特にホストIPは localhost ではなくPodmanマシンのIPアドレスです。

これらのポイントを順に確認していくことで、多くの接続問題は解決できるはずです。

データベースの永続化について(名前付きボリュームの利点と注意点、バックアップ・リストア方法)

podman volume create postgres_data コマンドを実行し、podman run 時に -v postgres_data:/var/lib/postgresql/data オプションを指定しました。これにより、PostgreSQLのデータは postgres_data という名前付きボリュームに保存され、コンテナを削除してもデータは保持されます。これは非常に重要な概念です。

名前付きボリュームの利点

  • データの永続性: コンテナを停止、削除、再作成しても、データベースのデータ(テーブル、レコードなど)は失われません。
  • Podmanによる管理: ボリュームはPodmanによって管理され、ホストOSのファイルシステムの詳細なパスを意識する必要が少なくなります。パーミッションの問題もPodmanがある程度吸収してくれます。
  • 移植性: ボリュームのデータをバックアップし、別の環境のPodmanボリュームにリストアすることも(手順は煩雑になる場合がありますが)原理的には可能です。

永続性の範囲と注意点 (Readmeより抜粋・補足)

重要なのは、この「永続性」がどの範囲で保証されるかです。

  • コンテナを podman rm postgres-db で削除し、再度同じオプションで podman run しても、postgres_data ボリュームが残っていればデータは引き継がれます。
  • Podmanマシン(WSL2環境など)を再起動しても、ボリューム内のデータは保持されます。
  • しかし、Podmanマシン自体を削除 (podman machine rm <マシン名>) すると、そのマシン内に作成されていたボリュームも一緒に削除されてしまいます。

したがって、本当に重要なデータを扱っている場合は、Podmanボリュームだけに頼るのではなく、定期的にデータベースのバックアップを取得することが強く推奨されます。

データベースのバックアップとリストア

PostgreSQLの標準的なツールである pg_dump を使って、コンテナ内のデータベースをバックアップできます。バックアップファイルはホストOSのファイルシステムに保存するのが一般的です。

バックアップの取得:

以下のコマンドは、postgres-db コンテナ内で pg_dump を実行し、mcp_ux データベースの内容をSQL形式で標準出力に出し、それをホストOS(コマンドを実行しているシェル)のカレントディレクトリにある backup.sql というファイルにリダイレクトして保存します。

podman exec -i postgres-db pg_dump -U postgres mcp_ux > backup.sql
  • -i オプションは pg_dump がパスワードプロンプトなどを表示する場合に備えて付けていますが、環境変数でユーザー・パスワードが設定されていれば不要なこともあります。
  • pg_dump -U postgres mcp_ux: postgres ユーザーで mcp_ux データベースをダンプします。
  • > backup.sql: 標準出力を backup.sql ファイルに書き込みます。

これで、backup.sql にデータベースの構造とデータがSQL文として保存されました。

リストア(復元):

バックアップからデータを復元するには、まず空のデータベース(または既存のデータをクリアしたデータベース)を用意し、そこに psql を使ってSQLファイルを流し込みます。ここでは、既存の mcp_ux データベースにリストアする例を示します。もし既存のデータを完全に置き換える場合は、事前にテーブルを削除したり、データベースを再作成したりする必要があるかもしれません。

cat backup.sql | podman exec -i postgres-db psql -U postgres -d mcp_ux
  • cat backup.sql: backup.sql ファイルの内容を標準出力に出します。
  • |: パイプ。左側のコマンドの標準出力を右側のコマンドの標準入力に渡します。
  • podman exec -i postgres-db psql -U postgres -d mcp_ux: コンテナ内の psql を起動し、標準入力から受け取ったSQLコマンドを実行します。

ボリュームの場所の確認 (参考):

Podmanボリュームが実際にPodmanマシン内のどこに保存されているかを確認するには、以下のコマンドを使います。

podman volume inspect postgres_data

出力の中に Mountpoint という項目があり、これがPodmanマシン内の実際のパスを示します(例: /var/lib/containers/storage/volumes/postgres_data/_data)。通常、このパスを直接操作する必要はありません。

データベーススキーマの変更方法

開発を進めていると、データベースのテーブル定義(スキーマ)を変更したくなることがあります。例えば、新しいカラムを追加したり、既存のカラムの型を変更したりする場合です。

このプロジェクトでは、./db/init/init.sql ファイルがコンテナの初回起動時にのみ実行され、データベースとテーブルを初期化します。つまり、一度コンテナが起動し、データボリュームに何らかのデータが書き込まれると、その後 init.sql を変更しても、既存のコンテナやボリュームには自動的には反映されません。

既存のコンテナでスキーマを変更し、init.sql の内容を再適用したい場合は、Readmeに記載されている通り、以下の手順でデータベースとボリュームを一度クリーンアップしてからコンテナを再作成する必要があります。

注意: 以下の手順を実行すると、postgres_data ボリューム内の既存のデータは全て消去されます! 事前に必要なデータは pg_dump などでバックアップしておいてください。

  1. コンテナを停止・削除:

    podman stop postgres-db
    podman rm postgres-db
    

    podman rm は停止したコンテナを削除します。

  2. データベースボリュームを削除・再作成:

    podman volume rm postgres_data
    podman volume create postgres_data
    

    これで、postgres_data ボリュームは空の状態に戻ります。

  3. ./db/init/init.sql ファイルを編集:
    ローカルPC上の PostgreSQL_Minimum_Database_Container/db/init/init.sql ファイルをエディタで開き、必要なスキーマ変更(テーブル定義の変更、新しいテーブルの追加など)を行います。

  4. コンテナを再作成:
    以前と同じ podman run コマンドでコンテナを起動します。

    # (PowerShellの場合の例)
    podman run -d --name postgres-db `
      -e POSTGRES_USER=postgres `
      -e POSTGRES_PASSWORD=postgres `
      -e POSTGRES_DB=mcp_ux `
      -v postgres_data:/var/lib/postgresql/data `
      -v ./db/init:/docker-entrypoint-initdb.d `
      -p 5432:5432 `
      postgres:16
    

    新しい空のボリュームと更新された init.sql が使われるため、PostgreSQLコンテナは新しいスキーマで初期化されます。

この方法は、開発初期段階でスキーマが頻繁に変わる場合には有効ですが、本番運用に近い環境や、すでに重要なデータが入っている場合には適していません。そうした場合は、FlywayやLiquibaseのようなデータベースマイグレーションツールを使用するか、ALTER TABLEなどのSQLコマンドを使って段階的にスキーマを変更していくアプローチが必要になります。

Podmanマシンの管理

最後に、Podmanマシン自体の管理コマンドも簡単に触れておきます。主にWindowsやmacOSでPodman Desktopを使っている場合に意識することになります。

  • Podmanマシンの停止:
    PCをシャットダウンする前や、しばらくPodmanを使わない場合など、Podmanマシンを停止しておくとリソースの節約になります。

    podman machine stop
    

    アクティブなPodmanマシンが停止します。

  • Podmanマシンの再開:
    停止したPodmanマシンを再度起動します。

    podman machine start
    

これらの管理操作を覚えておくことで、よりスムーズにコンテナ開発環境を利用できるようになります。

6. おわりに

いかがでしたか。「PostgreSQL Minimum Database Container」を題材に、Podman CLI を用いた PostgreSQL コンテナの最小構成での構築手順を追いながら、コンテナ技術の基礎的な概念について説明しました。皆さんにとって、この記事がコンテナ技術への理解を深める一助となれば幸いです!

7. 参考資料

本記事を作成するにあたり、また、読者の皆様がさらに学習を深める上で役立つ情報源を以下に示します。

  • PostgreSQL公式サイト

    • https://www.postgresql.org/
    • PostgreSQLに関するあらゆる公式情報(ドキュメント、ダウンロード、コミュニティ情報など)が集約されています。特に公式ドキュメントは、機能の詳細を理解する上で最も信頼できる情報源です。
  • Podman公式サイト

    • https://podman.io/
    • Podmanのインストール手順、チュートリアル、コマンドリファレンスなどが提供されています。Podmanのより詳細な使い方やトラブルシューティングについては、こちらを参照してください。
  • Docker Hub - Official PostgreSQL Image

    • https://hub.docker.com/_/postgres
    • 本記事で使用した postgres コンテナイメージの公式ページです。利用可能な環境変数、ボリュームマウントのポイント、各バージョンのタグ情報などが詳細に記載されています。他のバージョンや設定オプションを利用する際に非常に役立ちます。
  • A5:SQL MK-2

  • PostgreSQL Minimum Database Container (本記事で利用したGitHubリポジトリ)

Accenture Japan (有志)

Discussion