【Docker】postgresqlの構築
はじめに
Docker
でpostgresql
を構築します。
Docker Hubで配布されているものを利用しています。詳細は、こちらを参照してください。
目標
-
postgresql
が構築できていること - サービス起動後、
sql
を実行し以下のことができること-
DB
作成 - スキーマ作成
- ロールの作成
- 権限の追加
- テーブルの作成
- テストデータの追加
-
-
postgresql
の設定を変更できること
(1)簡単に作ってみる
docker-compose.yml 作成
version: '3'
services:
db:
image: postgres:14
container_name: postgres
ports:
- 5432:5432
volumes:
- db-store:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=passw0rd
volumes:
db-store:
解説
-
postgresql
のバージョンは14を利用して作成しました。 - DBファイルのパス(
/var/lib/postgresql/data
)をvolumeにマウントして永続化しています。 - 環境変数について
-
POSTGRES_PASSWORD
必須項目です。スーパーユーザのパスワードになります。練習用なら、これだけ設定しとけば十分です。 -
POSTGRES_USER
スーパーユーザのユーザ名です。指定しなかった場合はデフォルトpostgres
になります。 -
POSTGRES_DB
デフォルトで作成されるDB名です。指定しなかった場合はデフォルトpostgres
になります。 -
POSTGRES_INITDB_ARGS
initdb
コマンドを実行するときに渡すパラメータを指定できます。 -
POSTGRES_INITDB_WALDIR
(10以上) orPOSTGRES_INITDB_XLOGDIR
(9.x)
ログの出力パスを指摘できます。postgresql
のバージョンによって、利用できる環境変数が違います。 -
POSTGRES_HOST_AUTH_METHOD
認証方法を変更できるようです。trust
とすると、パスワードなしで接続できてしまうので、推奨されていません。 -
PGDATA
DBファイルのパスを変更できます。
-
接続確認
docker-compose up -d
コンテナを作成・起動したら、接続確認します。
-
DB接続ツールで確認
-
コンテナに接続して、
psql
で確認します。
docker exec -it postgres /bin/sh #コンテナへ接続
psql -h localhost -U postgres #psqlで接続確認
SQL
を実行する
(2)postgres構築後にpostgres構築後に、SQLを実行して
新規DB
の作成~テーブル作成・データ追加までを実行します。
このSQLは、初回起動(DBファイルが存在しない場合)のみ実行されます。
なので、2回目以降のコンテナ起動時は実行されません。
(1)で作成したymlを少し修正して、.sql
ファイルが実行できるようにします。
内容は単純で、/docker-entrypoint-initdb.d
のパスをローカルの.sql
ファイルがあるディレクトリへマウントするだけです
docker-compose.yml 作成
version: '3'
services:
db:
image: postgres:14
container_name: postgres
ports:
- 5432:5432
volumes:
- db-store:/var/lib/postgresql/data
- ./script:/docker-entrypoint-initdb.d # この行を追加しただけ
environment:
- POSTGRES_PASSWORD=passw0rd
volumes:
db-store:
解説
docker-compose.yml
と同じ場所に、script
ディレクトリを作成してます。このディレクトリを/docker-entrypoint-initdb.d
にマウントさせてます。
このディレクトリに.sql
ファイルを配置するだけでSQL
を実行してくれます。
今回配置したSQL
は以下のような感じです。
-- DB作成
CREATE DATABASE hogedb;
-- 作成したDBへ切り替え
\c hogedb
-- スキーマ作成
CREATE SCHEMA hogeschema;
-- ロールの作成
CREATE ROLE hoge WITH LOGIN PASSWORD 'passw0rd';
-- 権限追加
GRANT ALL PRIVILEGES ON SCHEMA hogeschema TO hoge;
-- DB切り替え
\c hogedb
-- テーブル作成
CREATE TABLE hogeschema.sample (
col1 VARCHAR(10),
col2 VARCHAR(10),
col3 VARCHAR(10),
PRIMARY KEY (col1)
);
-- 権限追加
GRANT ALL PRIVILEGES ON hogeschema.sample TO hoge;
-- サンプルレコード作成
INSERT INTO hogeschema.sample VALUES('1111', '2221', '3331');
INSERT INTO hogeschema.sample VALUES('1112', '2222', '3332');
INSERT INTO hogeschema.sample VALUES('1113', '2223', '3333');
確認
docker-compose up -d
- DB接続ツールで確認します
- コンテナに接続して、
psql
で確認します。
$ docker exec -it postgres /bin/sh
$ psql -h localhost -U hoge -d hogedb
$hogedb=> SET search_path = hogeschema;
$hogedb=> select * from sample;
col1 | col2 | col3
------+------+------
1111 | 2221 | 3331
1112 | 2222 | 3332
1113 | 2223 | 3333
(3 rows)
postgresql.conf
の設定をカスタマイズする
(3)(2)のymlをさらに修正して、postgresql.conf
の設定内容を変更できるようにします。ここまでをコマンド1つで構築できるようにしとけば、あとは独自の要件に合わせて設定を修正していくだけなので大抵のことには対応できるのではないかなと思います。
docker-compose.yml 作成
version: '3'
services:
db:
image: postgres:14
container_name: postgres
command: -c 'config_file=/etc/postgresql/postgresql.conf' # 追加
ports:
- 5432:5432
volumes:
- db-store:/var/lib/postgresql/data
- ./script:/docker-entrypoint-initdb.d
- ./config/postgresql.conf:/etc/postgresql/postgresql.conf # 追加
environment:
- POSTGRES_PASSWORD=passw0rd
volumes:
db-store:
解説
docker-compose.yml
と同じ場所に、config
ディレクトリを作成してpostgresql.conf
を作成します。このファイルに/etc/postgresql/postgresql.conf
をマウントさせてます。
マウントしたpostgresql.conf
ファイルを読みこませるためにcommand: -c 'config_file=/etc/postgresql/postgresql.conf'
を追加しています。
(※ postgresql.conf
のテンプレートは、/usr/share/postgresql/postgresql.conf.sample
にあります)
今回作成した、postgresql.conf
は以下のような感じです。
とりあえずmax_connectionsの設定値を変更しています。
listen_addresses = '*' # この行は必須
max_connections = 200
確認
設定値を確認してみます。
デフォルトが100だったのが、設定した200に変わっていることが確認できました。
hogedb=> show max_connections;
max_connections
-----------------
200
(1 row)
Discussion