Postgresqlをpodman-composeでDebian Bookworm 上で動かす。2025/04版
要約
Debian GNU/Linux bookwormで、docker.ioを追加して、PostgresqlのOffical Docker Imageを動かします。
はじめに
この記事を書いている、2025-04-21現在、Debian GNU/Linuxは、現行の12(コードネーム bookworm)から次のバージョン 13(コードネーム trixie)をリリースするためにパッケージのフリーズをしてバグ出しをしています。
2年単位でリリースされるDebian GNU/Linuxに収録されているDocker互換のpodmanとpodman-composeを使ってここまでできたという報告になります。
この記事を書いた動機
dockerは基本、rootで動くので、dockerが作成するファイルはownerがrootになりがちです。一般ユーザの領域にrootのファイルが置いてあると処置が面倒なんで、基本ユーザーで動くpodmanを使いたいと思っていました。
Debian GNU/Linuxに、PostgreSQLのパッケージは存在しますが、アプリケーション開発時にSQLiteの機能では足りないときに事実上Dockerコンテナを使うことが多々あるのと、ORMでコードをいっぱい書かないと実現できないことを、標準のSQLで確認する簡単に作って壊せる環境が欲しかったのもあります。
SQLを初心者だけでなく、中級者(caseとかを使いたくなった人向け)SQL関係の本を読みながら、手を動かすのにも良いので、記事にして、本と一緒に、これ読んで。と渡せるのが良いと考えています。
この記事はだれ向けか
2種類の人を想定しています。
- さくっと PostgreSQLを試したい。ちゃんとしたデータベースの設計(ハードウェアやパーティション、チューニング込み)は、それなりの必要が出てからでよいと思っている人です。
- Debian系のディストリビューションを使っており、Dockerだけにbidするのは、いまいちだな。と思って別の方法のノウハウを貯めておきたいと動き始めた人です。
この記事の読み方
この記事は、大別して2つトピックがあります。
- Debian GNU/Linux 12(bookworm)で、podmanをインストールしてdocker.ioからイメージを取得するようにする。
- podman-composeで、docker.ioに登録されているOffical PostgreSQL imageをdocker-compose.ymlを書いて起動し、その使い方の説明をする。
です。片方のトピックだけ興味がある場合は、片方だけ読むのもありだと思います。
本文
Debian GNU/Linux 12(bookworm)でpodman-composeをインストールする
私は、aptitudeを使っているので、podmanとpodman-composeを指定して、インストールしました。aptでなら、
sudo apt install podman podman-compose
でよいです。あとは、参考文献の1.にあるDebian Wikiを参考に確認していきます。
podmanのインストール後の動作確認として
podman search --limit 3 quay.io/podman
を実行しておきます。
ここまでのステップでdocker.ioを追加します。
mkdir -p $HOME/.config/containers
echo 'unqualified-search-registries=["docker.io", "quay.io"]' > $HOME/.config/containers/registries.conf
ちゃんと登録できたかを確認します。
podman search postgresql
で、結果を見ます。
PostgreSQLのOffical Imageをpodman-composeで使う
参考文献の2で示す、PostgreSQLをオンメモリで使う設定は、ちょこっとSQLの独習にはちょうどいい。
テストデータをちょこっと入れたりとかにもいい。
留意点は下記
- 正しく docker-compose.yml をコピペしよう。
- 間違えると、podman-compose up -dするときに
File "/usr/lib/python3/dist-packages/podman_compose.py", line 239, in <listcomp>
dst = [i.split("=", 1) for i in src if i]
^^^^^^^
AttributeError: 'dict' object has no attribute 'split'
みたいなエラーででて、困ることがある。新しいバージョンだともっとロバストになっている可能性はあるが、まずは間違えないことが重要です。
podman-composeに成功したら
下記のような表示がでて、サービスが起動します。
podman-compose up -d
['podman', '--version', '']
using podman version: 4.3.1
** excluding: set()
['podman', 'network', 'exists', 'podman_default']
podman run --name=podman_db_1 -d --label io.podman.compose.config-hash=123 --label io.podman.compose.project=podman --label io.podman.compose.version=0.0.1 --label com.docker.compose.project=podman --label com.docker.compose.project.working_dir=/home/yabuki/podman --label com.docker.compose.project.config_files=docker-compose.yml --label com.docker.compose.container-number=1 --label com.docker.compose.service=db -e POSTGRES_PASSWORD=example --net podman_default --network-alias db --shm-size 128mb --restart always postgres
✔ docker.io/library/postgres:latest
Trying to pull docker.io/library/postgres:latest...
Getting image source signatures
Copying blob 07db60713289 done
Copying blob 97cdd47d9131 done
Copying blob 8a628cdd7ccc done
Copying blob e4847368ad17 done
Copying blob 2817206b0512 done
Copying blob 3a6f8814136c done
Copying blob 0c942aac37b1 done
Copying blob 8c63b71925de done
Copying blob 97f28320a07a done
Copying blob 2a08aad74366 done
Copying blob 6cea4d95608f done
Copying blob c1b7de8085d1 done
Copying blob f15c43cffa70 done
Copying blob 6948dc7760c1 done
Copying config f49abb9855 done
Writing manifest to image destination
Storing signatures
0be0494caf057940ad75902d70e34338ae962f7022a38956ec1ae7c85878fe87
exit code: 0
['podman', 'network', 'exists', 'podman_default']
podman run --name=podman_adminer_1 -d --label io.podman.compose.config-hash=123 --label io.podman.compose.project=podman --label io.podman.compose.version=0.0.1 --label com.docker.compose.project=podman --label com.docker.compose.project.working_dir=/home/yabuki/podman --label com.docker.compose.project.config_files=docker-compose.yml --label com.docker.compose.container-number=1 --label com.docker.compose.service=adminer --net podman_default --network-alias adminer -p 8080:8080 --restart always adminer
✔ docker.io/library/adminer:latest
Trying to pull docker.io/library/adminer:latest...
Getting image source signatures
Copying blob dc6d32971fca done
Copying blob 115c7a04f6c0 done
Copying blob b1220d176a8d done
Copying blob 0d55cff53123 done
Copying blob 88d591373a19 done
Copying blob f18232174bc9 done
Copying blob ffeef6b41a56 done
Copying blob 6d95abe48138 done
Copying blob a80d3af78a9d done
Copying blob f3fe38446507 done
Copying blob c6d0aade0806 done
Copying blob 4f4fb700ef54 done
Copying blob e434f3dae19e done
Copying blob 8b847f2809a2 done
Copying blob 93b26376816c done
Copying blob 52e9abf80869 done
Copying config 8a5794f84c done
Writing manifest to image destination
Storing signatures
a63aacb8933f810b366895c7173cc7f141e5f0d80c28b720706e3875832d3558
exit code: 0
PHPのデータベース管理のインタフェースであるadminerにアクセスするには、http://localhost:8080/か、http://動いている環境のIP:8080/にアクセスします。
ドキュメントどおりなら、ユーザ名:postgres パスワードはdocker-compose.ymlに書いている database名はpostgresでアクセスできます。
一回動かしてしまえば、あとはドキュメントを読みながらちょこちょこと書き換えて試せます。
それじゃ、あとは動かして楽しんで!
2025-04-30 追記
ロケールをja_JP.utf8にする。およびタイムゾーンをAisa/Tokyoにする。
Dockerと同じであるが、
Dockerfileを下記にする。
FROM postgres:17
RUN DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y tzdata
# containerの中では、systemdは動かないので、timezoneの設定
# は別の方法ですること。
run echo 'Asia/Tokyo' > /etc/timezone
ENV TZ=Asia/Tokyo
#run apt-get update && apt-get install -y postgresql-15
RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
&& localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
ENV LANG ja_JP.utf8
version: '3'
services:
postgres:
container_name: sample-db
build: .
restart: always
ports:
- "5432:5432"
volumes:
- ./postgres/init:/docker-entrypoint-initdb.d
environment:
POSTGRES_USER: "postgres"
POSTGRES_PASSWORD: "postgres"
psqlは、podman exec -it sample_db bash
してから、psql -U postgres で接続するとか
手元に apt install postgresql-clientをいれて、psql -U postgres -h localhost -d データベース名
とする。Debian stableのpostgresqlは15なので、17をつかっているので警告はでるが事実上は問題ない。
./postgres/init/の内容については、参考文献の3を参照のこと。初期化のsqlを置くことができる。
接続文字列としては、だいたい下記のようになってる。
DATABASE_URL=postgresql://[user[:password]@][host][:port]/[dbname]
DATABASE_URL=postgresql://[postgres:postgrespassword@localhost/[接続したいデータベース名]
参考文献
- Podman - Debian Wiki
- postgres - Official Image | Docker Hub
- 【PostgreSQL】docker-composeで起動と初期データ投入 #Docker - Qiita
謝辞
さいごに
件名 | 日付 |
---|---|
記事を書きはじめた日 | 2025-04-21 |
記事を公開した日 | 2025-04-21 |
記事を変更した日 | 2025-04-30 |
上記は、この記事の鮮度を判断する一助のために書き手が載せたものです。
詳細な変更履歴は、
GitHub - yabuki/friendly-potato: zenn-contents
を参照してください。
記事に対するTypoの指摘などは、pull reqをしてもらえるとありがたいです。
受け入れるかどうかは、差分とPull reqの文章で判断いたします。
Discussion