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.utf8initdb
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"等に調整してください
 
- ローカル環境に既存の PostgreSQL が起動している場合は
- 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 postgrespostgres=# \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 downinitdbのSQLを変更し再度実行したい場合などは、-vオプションをつけてボリュームも合わせて削除しましょう。
まとめ
ローカル環境を清潔に保つことができ、環境差異をなくすことができるので Docker は本当に便利ですね。


 
	
コメント