日本の山岳一覧・百名山 API を開発しましたCLICK !

Docker | docker-compose で PostgreSQL を起動する

PostgreSQL on Docker
  • URLをコピーしました!

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.yml
  • databaseに 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.utf8

initdb

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"等に調整してください
  • 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 postgres
postgres=# \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 down

initdbのSQLを変更し再度実行したい場合などは、-vオプションをつけてボリュームも合わせて削除しましょう。

まとめ

ローカル環境を清潔に保つことができ、環境差異をなくすことができるので Docker は本当に便利ですね。

PostgreSQL on Docker

この記事が気に入ったら
フォローしてね!

  • URLをコピーしました!

コメント

コメントする

目次