0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Docker で PostgreSQL を使いたい

Last updated at Posted at 2024-05-24
  • 概要
    • PostgreSQL のコンテナを作成し psql でログインする手順です
    • data/ ディレクトリにデータを保存して永続化します
  • 補足
    • 環境は Ubuntu, bash です
    • コピペで動作します
  • 使用する Docker Image

Step 1. bash

コンテナを立ち上げ psql でローカルからコンテナの PostgreSQL サーバにログインします。

bash
# PostgreSQL のデータを保存するディレクトリを作成する。
mkdir data/

# Docker
docker container run \
  --interactive \
  --tty \
  --rm \
  --user $(id -u):$(id -g) \
  --volume ${PWD}/data:/var/lib/postgresql/data \
  --publish 5432:5432 \
  --name my-postgres \
  --env POSTGRES_DB=my-postgres \
  --env POSTGRES_USER=my-postgres \
  --env POSTGRES_PASSWORD=my-postgres \
  postgres:16


# PostgreSQL
PGPASSWORD="my-postgres" psql \
  --host "localhost" \
  --username "my-postgres" \
  --dbname "my-postgres"
補足

これが無いと data/ ディレクトリ配下のファイルの所有者が root で作成されてしまい設定ファイルをいじるとき面倒になります。

  --user $(id -u):$(id -g) \

データを永続化させる方法もいろいろ種類があるそうです。リンク先を参照してください。

  --volume ${PWD}/data:/var/lib/postgresql/data \

指定されたデータベースやユーザが存在しなかった場合は作成するみたいな動作をしていると思われます。initdb コマンドを実行してくれているのだと思います。

  --env POSTGRES_DB=my-postgres \
  --env POSTGRES_USER=my-postgres \
  --env POSTGRES_PASSWORD=my-postgres \

Step 2. psql

テーブルを作成する。

psql
\d

CREATE TABLE Person (
    name VARCHAR(100),
    age INT
);

\d
\q

Step 3. bash

コンテナを再起動し psql でコンテナの PostgreSQL サーバにログインする。

bash
docker container stop my-postgres

docker container run \
  --interactive \
  --tty \
  --rm \
  --user $(id -u):$(id -g) \
  --volume ${PWD}/data:/var/lib/postgresql/data \
  --publish 5432:5432 \
  --name my-postgres \
  postgres:16

PGPASSWORD="my-postgres" psql \
  --host "localhost" \
  --username "my-postgres" \
  --dbname "my-postgres"
補足

データベースとユーザは作成されているので以下のオプションは不要になります。

  --env POSTGRES_DB=my-postgres \
  --env POSTGRES_USER=my-postgres \
  --env POSTGRES_PASSWORD=my-postgres \

Step 4. psql

Person テーブルが残っているのが確認できるはず...
プロジェクトルートの data/ ディレクトリ配下でデータを保存して永続化しています。

psql
\d

そのほか

◯ コマンド

# 1. コンテナにログイン
docker exec -it my-postgres bash

# 2. コンテナから psql で PostgreSQL サーバにログイン
docker exec -it my-postgres psql my-postgres my-postgres

2 番目のコマンドでパスワードがなくても PostgreSQL にログインできるのは data/pg_hba.conf でローカルからの接続は trust になっているからです。セキュリティにはご注意ください。

◯ はまりどころ

psql でログインするときはローカルホストであっても -h を省略せず -h localhost を指定してください。省略すると以下のようにハマります。

◯ まとめ

  • PosqgreSQL のデータは /var/lib/postgresql/data に保存されます
  • /var/lib/postgresql/data をローカルのディレクトリにマウントすればデータを永続化できます
  • docker container run ... postgres:16/var/lib/postgresql/data が空っぽの場合、自動で初期化してくれます。Ubuntu のイメージから PostgreSQL をインストールした場合はこの作業を Dockerfile に書かないといけません
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?