【すぐに使える!】DockerでPostgreSQLを環境構築する手順
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
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」を使用しています。
- Host
- localhostを指定します
- Port
- docker-compose.ymlに設定したとおり、今回は「ホスト10432:コンテナ5432」を対応づけています
- ホスト側の10432ポートを指定して、コンテナにアクセスできるように設定します
- ユーザ名、パスワード
- POSTGRES_USER, POSTGRES_PASSWORD に指定したものか、init.sqlで作成したユーザの認証情報を設定します
「テスト接続」をして、「接続済み」と表示されれば設定は完了です。
dataディレクトリの.gitignore
コンテナを起動すると、dataディレクトリにはPostgreSQLのデータが保存されます。
データ自体はGit管理する必要がないため、.gitignoreを以下のとおり作成して格納しています。
/data
まとめ: Dockerを上手く活用して効率よく開発をしよう
Dockerを利用した開発は一般的になってきましたが、簡単に開発環境を構築できる便利なツールです。
データベースは案件によってRDBMSが異なったり、バージョンが異なったりすることもあります。
一度ベースを作って、効率的に環境構築や開発作業を行えるようにしましょう。