Docker コンテナ内で PostgreSQL を起動するサンプルです!
Docker Compose で PostgreSQL を起動する
Docker のインストール手順やdocker-compose
コマンドの基本操作等は、本記事では割愛します。
今回は以下のバージョンで動作確認をしています。
- macOS Monterey 12.6
- Docker 20.10.20
- Docker Compose 2.12.0
$ docker --version
Docker version 20.10.20, build 9fdeb9c
$ docker-compose --version
Docker Compose version v2.12.0
データベースサーバ単体をコンテナで起動するより、Web サーバと同時にコンテナを起動するケースが多いだろうと思い、Docker Compose でコンテナを操作できるようにしています。
PostgreSQL on Docker
サンプルコードは GitHub からダウンロード可能です。
ディレクトリ構成
ディレクトリ構成は以下のようにします。
root/
├── database/
│ ├── initdb/
│ │ ├── 01-up.sql
│ │ └── 02-samples.sql
│ ├── pg-data/
│ └── Dockerfile
└── docker-compose.yml
database
に PostgreSQL に関するファイルを格納するinitdb
には、PostgreSQL の初回起動時に実行する SQL を格納するpg-data
は、データを永続化させるため/var/lib/postgresql/data
をマウントさせます
Dockerfile
PostgreSQL 14 の Docker イメージである postgres:14-alpine を使用します。
FROM postgres:14-alpine AS database
ENV LANG ja_JP.utf8
initdb
PostgreSQL の初回起動時にセットアップをおこなう場合は、volumes
で/docker-entrypoint-initdb.d
に対して.sql
や.sh
ファイルをマウントします。
今回はテーブルを作成する01-up.sql
と、サンプルデータをインサートする02-samples.sql
を配置しました。
連番や yyyyMMddHHmmss などの日時のファイル名に含めると、昇順に実行されます。
create table if not exists users (
id bigserial not null primary key,
name varchar(100) not null
);
insert into users (name) values ('John Smith');
insert into users (name) values ('Jane Smith');
docker-compose.yml
docker-compose.yml を定義します。拡張子は.yaml
でも OK です。
version: "3.8"
services:
db:
container_name: postgres
build:
context: ./database
dockerfile: Dockerfile
target: "database"
ports:
- "5432:5432"
volumes:
- ./database/pg-data:/var/lib/postgresql/data
- ./database/initdb:/docker-entrypoint-initdb.d
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: sample_db
restart: always
volumes:
pg-data:
- ポートは
5432
同士を繋げます- ローカル環境に既存の PostgreSQL が起動している場合は
"5433:5432"
等に調整してください
- ローカル環境に既存の PostgreSQL が起動している場合は
volumes
は前述した通り、initdbを/docker-entrypoint-initdb.d
にマウントします- 環境変数で以下を定義します
POSTGRES_USER
でユーザー名を指定(デフォルト値はpostgres
)POSTGRES_PASSWORD
で上記ユーザーのパスワードを指定POSTGRES_DB
でデータベース名を指定(未指定の場合、POSTGRES_USER
と同名)
Docker Compose でコンテナを操作する
PostgreSQL を起動する
build からの up で起動します。
docker-compose build
docker-compose up
以下のコマンドでも OK です。
docker-compose up --build
デタッチドモードで起動する場合は-d
オプションを指定します。
initdb のクエリが成功しているか確認する
まずはコンテナ内にアクセスします。
docker-compose exec db bash
まずは、psql
コマンドで PostgreSQL のテーブル一覧を確認してみます。
psql -U postgres
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+------------+------------+-----------------------
postgres | postgres | UTF8 | ja_JP.utf8 | ja_JP.utf8 |
sample_db | postgres | UTF8 | ja_JP.utf8 | ja_JP.utf8 |
template0 | postgres | UTF8 | ja_JP.utf8 | ja_JP.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | ja_JP.utf8 | ja_JP.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
docker-compose.yml
で指定したsample_db
が作成されているので、sample_db
に切り替えてusers
テーブルのレコードを確認します。
postgres=# \c sample_db
You are now connected to database "sample_db" as user "postgres".
sample_db=# select * from public.users;
id | name
----+------------
1 | John Smith
2 | Jane Smith
(2 rows)
sample_db=# exit
bash-5.1# exit
exit
コンテナを停止する
docker-compose stop
コンテナを削除する
docker-compose down
initdb
のSQLを変更し再度実行したい場合などは、-v
オプションをつけてボリュームも合わせて削除しましょう。
まとめ
ローカル環境を清潔に保つことができ、環境差異をなくすことができるので Docker は本当に便利ですね。
コメント