【すぐに使える!】DockerでPostgreSQLを環境構築する手順

2022年5月29日

PC

Dockerを使用すると開発環境の構築が簡単に行えて非常に便利です。
今回はDockerを使用してPostgreSQLの環境構築をする手順を説明します。

構築手順の流れ

1. ディレクトリを作成する
2. docker-compose.ymlを作成する
3. 初期データ登録用スクリプトを作成する
4. コンテナを起動してデータベースに接続する

作成するディレクトリ構成

今回作成するDocker+PostgreSQLのディレクトリ構成は以下のとおりです。
docker-compose.ymlに設定を全て記載しているため、Dockerfileは使っていません。

project
  ├─docker
  │  └─db
  │     ├─data           // PostgreSQLのデータをマウントして永続化しておくためのディレクトリ
  │     │
  │     ├─init           // コンテナ作成時に初期データを登録するスクリプトを格納する
  │     │  └─init.sql
  │     └─.gitignore
  │
  └─docker-compose.yml

docker-compose.ymlを作成する

Docker Hubにあるpostgresのオフィシャルイメージを使用します。
Docker Hub - postgres

version: '3'

services:
  db:
    image: postgres:14.0-alpine
    container_name: postgres14
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: admin
    volumes:
      - ./docker/db/data:/var/lib/postgresql/data
      - ./docker/db/init:/docker-entrypoint-initdb.d
    ports:
      - 10432:5432

各設定値の説明

docker-compose.ymlに指定した値を1つずつ見ていきましょう。

  • image
    • postgres:14.0-alpineイメージを使用してコンテナを作成します
  • container_name
    • 作成するコンテナの名前を設定します、分かりやすい名前にしておきます
    • 今回はPostgreSQL14を使用するため、postgres14としています
  • environment(POSTGRES_USER, POSTGRES_PASSWORD)
    • Postgresのスーパーユーザ名とパスワードを設定します(admin/admin)
  • volumes
    • ./docker/db/data:/var/lib/postgresql/data
      • コンテナ内のデータをホスト側にマウントしています
      • これにより、コンテナを削除してもデータを保存して永続化することができます
    • ./docker/db/init:/docker-entrypoint-initdb.d
      • docker-entrypoint-initdb.dにスクリプトをマウントすることで、コンテナ作成時に初期セットアップをすることができます
      • 今回はinit.sqlの処理が実行されます
    • posts(10432:5432)
      • ホストの10432ポートと、コンテナの5432ポートを対応付けています

初期データ登録用のスクリプトを作成する

コンテナを作成しただけでは、docker-compose.ymlのPOSTGRES_USERに指定したユーザと同名のデータベースのみ初期作成されます。
データベース作成直後のため、テーブルなどが1件も存在しない状態です。

コンテナ起動後に作成してもよいですが、開発用のDBユーザ・データベース・テーブルなどをあらかじめ作成できた方が便利ですよね。
初期データ登録用のスクリプト(init.sql)を docker/db/init ディレクトリ内に作成して、コンテナ作成時に実行されるようにしましょう。

--ユーザ作成
CREATE USER docker;
ALTER USER docker WITH PASSWORD 'docker';

--DB作成
CREATE DATABASE docker;

--ユーザにDBの権限をまとめて付与
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;

--データベースを切り替え
\c docker

-- テーブル作成と初期データ登録
CREATE TABLE user_info (
  user_id SERIAL NOT NULL,
  user_name TEXT NOT NULL,
  mail_address TEXT NOT NULL,
  delete_flg BOOLEAN NOT NULL DEFAULT false,
  create_id BIGINT,
  create_ts TIMESTAMP DEFAULT current_timestamp,
  update_id BIGINT,
  update_ts TIMESTAMP,
  PRIMARY KEY(user_id)
);

INSERT INTO user_info (user_name, mail_address) VALUES ('sample_user', 'sample@example.com');

-- テーブルの所有者をadmin->dockerに変更する
ALTER TABLE user_info OWNER TO docker;

-- テーブルとシーケンスの権限をdockerに付与する
GRANT ALL ON user_info TO docker;
GRANT USAGE ON SEQUENCE user_info_user_id_seq TO docker;

ここまでできれば事前準備は完了です。実際にコンテナを起動してみましょう。

コンテナを起動する

docker-compose.ymlが格納されているディレクトリで以下のコマンドを実行すると、コンテナを起動することができます。

docker-compose up -d

「docker-compose ps」コマンドでコンテナが起動していることを確認します。

% docker-compose ps
NAME                COMMAND                  SERVICE             STATUS              PORTS
postgres14          "docker-entrypoint.s…"   db                  running             0.0.0.0:10432->5432/tcp

データベースに接続してみる

実際に作成したデータベースに接続確認してみましょう。
「稼働しているコンテナの中に入り、psqlコマンドで接続する」流れで確認します。

「docker exec -it bash」のコマンドで、起動中のコンテナの中に入ることができます。

docker exec -it postgres14 bash

コンテナの中に入れたことを確認したら、psqlコマンドでデータベースに接続します。
\dtコマンドでテーブルが作成されていること、SELECT文でデータがINSERTされていることを確認しましょう。

docker=> \dt
          List of relations
 Schema |   Name    | Type  | Owner  
--------+-----------+-------+--------
 public | user_info | table | docker
(1 row)

docker=> select * from user_info;
 user_id |  user_name  |    mail_address    | delete_flg | create_id |         create_ts          | update_id | update_ts 
---------+-------------+--------------------+------------+-----------+----------------------------+-----------+-----------
       1 | sample_user | sample@example.com | f          |           | 2022-05-29 10:07:42.086553 |           | 
(1 row)

初期データ登録用スクリプトが実行され、セットアップができていることが確認できました。
これでDocker+PostgreSQLの環境構築は完了です。

SQLクライアントソフトから接続する

データベースを操作する時に、毎回「コンテナの中に入ってpsqlで接続して...」を繰り返すのはやはり手間ですよね。
SQLクライアントソフトからもコンテナ内のデータベースに接続できるように設定しておきましょう。
今回は「DBeaver」を使用しています。

DBeaverの接続設定方法

  • Host
    • localhostを指定します
  • Port
    • docker-compose.ymlに設定したとおり、今回は「ホスト10432:コンテナ5432」を対応づけています
    • ホスト側の10432ポートを指定して、コンテナにアクセスできるように設定します
  • ユーザ名、パスワード
    • POSTGRES_USER, POSTGRES_PASSWORD に指定したものか、init.sqlで作成したユーザの認証情報を設定します

「テスト接続」をして、「接続済み」と表示されれば設定は完了です。

DBeaverテスト接続完了メッセージ

dataディレクトリの.gitignore

コンテナを起動すると、dataディレクトリにはPostgreSQLのデータが保存されます。
データ自体はGit管理する必要がないため、.gitignoreを以下のとおり作成して格納しています。

/data

まとめ: Dockerを上手く活用して効率よく開発をしよう

Dockerを利用した開発は一般的になってきましたが、簡単に開発環境を構築できる便利なツールです。
データベースは案件によってRDBMSが異なったり、バージョンが異なったりすることもあります。
一度ベースを作って、効率的に環境構築や開発作業を行えるようにしましょう。