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


Podman(Docker)でPostgreSQLを使う

Podmanは仮想コンテナエンジンDockerの親戚です。 ここではPostgreSQLの公式Dockerイメージを使用して、PodmanのコマンドでPostgreSQLコンテナを起動してみます。 pgよりも専らPodman(Docker)の説明じゃねーか!!という個所もありますが、 どちらも初心者なので仕方がない…

●公式イメージのpullと初回の起動
使用したOSはRHEL 9.2です。次のコマンドで公式PostgreSQLイメージのpullと初回のコンテナ起動を行います。

podman run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=SecretPassword postgres
公式に説明がある通り、 Dockerイメージpostgresの中には、ユーザーpostgresとデータベースpostgresがinitdbコマンドで作成済の状態から利用可能になっています。
では早速、コンテナの中に入ってpsqlコマンドで接続してみます。 コンテナの中はPostgresSQLサーバが入っているくらいですから、クライアントのpsqlも入っています。
podman exec -it postgres /bin/bash
# psql -U postgres
postgres=# (以下を入力)
create table scores (name varchar not null primary key, score integer not null);
insert into scores(name,score) values('Taro', 80);
insert into scores(name,score) values('Jiro', 75);
select * from scores;
exit
# exit
せっかくなので表を1個作ってみました。 スキーマを作っていないのでpublicスキーマで所有者(オーナー)がpostgresの表として作られます。

●ホストOSからコンテナのPostgreSQLに接続する
ホストOS側では、PostgreSQLイメージをpullしたからといってpsqlクライアントが同時に入るわけではないので、 別途インストールが必要です。余談ですがLinux系OSではどれでもクライアントのパッケージ名がpostgresql、 サーバのパッケージ名がpostgresql-serverとなっていると思います。

sudo dnf install -y postgresql
早速接続してみます。 コンテナ外⇒内のログインはネットワークアクセスになるので、パスワードの入力が必須です。
PGPASSWORD=SecretPassword psql -h localhost -p 5432 -U postgres
postgres=# (以下を入力)
select * from scores;
exit;
psqlの際のPWを設定する環境変数は POSTGRES_PASSWORD ではなく PGPASSWORD なので注意が必要です。

●コンテナ内の設定を見てみる

podman exec -it postgres /bin/bash
# env | grep PG
------
PG_MAJOR=15
PG_VERSION=15.4-1.pgdg120+1
PGDATA=/var/lib/postgresql/data
------
# cd $PGDATA
# more postgresql.conf
# more pg_hba.conf
postgresql.confの初期設定でネットワークアクセスをlistenしており、接続が可能になっていることが分かります。 またネットワーク接続と認証を管理する pg_hba.conf の内容は
local   all             all                                     trust
host    all             all             127.0.0.1/32            trust
(中略)
host all all all scram-sha-256
となっています。デフォルトで上記のように設定されているので、 という動作になります。
なお、この末尾の行も公式に説明があります。 podman run時の環境変数 POSTGRES_HOST_AUTH_METHOD で認証方式が変更でき、そのデフォルトが scram-sha-256 なので、 この1行が自動的に追記されている、というわけです。

ちなみに pg_hba.conf を編集したい場合、デフォルトではコンテナの中にはvimもnanoもテキストエディタらしきものは入っていないので、 自分でインストールする必要があります。コンテナのOSはDebianです。 コンテナの中に入って /etc/debian-version や /etc/issue を見ると分かります。 したがって、

# apt-get install nano vim
こんな感じで、yumやdnfではなくapt系コマンドを使ってインストールできます。

●ホストOSからのみPW不要で接続可能にする
Podmanでルートレスコンテナを起動した場合、コンテナ内から外(ホストOS側)を見るIPアドレスは 「100.0.2.100」になります。これはコンテナ内の/etc/hostsを見ると分かります。 これを使って、ホストOSからのみPW不要で接続可能にすることも可能です。開発時などには便利かもしれません。 pg_pba.conf を編集して、

host all all 10.0.2.100/32 trust
という行を scram-sha-256 の行の上に追加してコンテナを抜け、 podman restart postgresを実行すればOKです。
※ pg_pba.conf の設定は、上にある物程優先されます。

●再起動と停止
PostgreSQLプロセスの停止や再起動ってどうやるの?
コンテナの中に入って、標準のpg_ctlコマンドで試してみます。

# pg_ctl restart
pg_ctl: cannot be run as root
Please log in (using, e.g., "su") as the (unprivileged) user that will
ありゃ。rootでは実行できないようです。postgresユーザーに変更して実行すると、
# su postgres
$ pg_ctl restart
waiting for server to shut down....
restartを掛けると、自動的にコンテナのbashがexitして端末がホスト側に戻ります。 つまり、コンテナを停止するのとどちらも結局同じ事で、再起動にはならないようです。 再起動するには、ホストOS側でコンテナを再起動するのが一番いいみたいです。
podman restart postgres

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