🦔

【Docker】postgresqlの構築

2022/02/25に公開

はじめに

Dockerpostgresqlを構築します。
Docker Hubで配布されているものを利用しています。詳細は、こちらを参照してください。

目標

  • postgresqlが構築できていること
  • サービス起動後、sqlを実行し以下のことができること
    • DB作成
    • スキーマ作成
    • ロールの作成
    • 権限の追加
    • テーブルの作成
    • テストデータの追加
  • postgresqlの設定を変更できること

(1)簡単に作ってみる

docker-compose.yml 作成

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以上) or POSTGRES_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で接続確認

(2)postgres構築後にSQLを実行する

postgres構築後に、SQLを実行して
新規DBの作成~テーブル作成・データ追加までを実行します。

このSQLは、初回起動(DBファイルが存在しない場合)のみ実行されます。
なので、2回目以降のコンテナ起動時は実行されません。

(1)で作成したymlを少し修正して、.sqlファイルが実行できるようにします。
内容は単純で、/docker-entrypoint-initdb.dのパスをローカルの.sqlファイルがあるディレクトリへマウントするだけです

docker-compose.yml 作成

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は以下のような感じです。

01_initialize.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;
02_create_table.sql
-- 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)

(3)postgresql.confの設定をカスタマイズする

(2)のymlをさらに修正して、postgresql.confの設定内容を変更できるようにします。ここまでをコマンド1つで構築できるようにしとけば、あとは独自の要件に合わせて設定を修正していくだけなので大抵のことには対応できるのではないかなと思います。

docker-compose.yml 作成

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の設定値を変更しています。

postgresql.conf
listen_addresses = '*' # この行は必須
max_connections = 200

確認

設定値を確認してみます。
デフォルトが100だったのが、設定した200に変わっていることが確認できました。

hogedb=> show max_connections;
 max_connections 
-----------------
 200
(1 row)

Discussion