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.ymldatabaseに 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.utf8initdb
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 postgrespostgres=# \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 downinitdbのSQLを変更し再度実行したい場合などは、-vオプションをつけてボリュームも合わせて削除しましょう。
まとめ
ローカル環境を清潔に保つことができ、環境差異をなくすことができるので Docker は本当に便利ですね。


コメント