Docker公式イメージを使って、PostgreSQL11のコンテナ環境を構築する手順


はじめに

本記事では、Docker公式イメージを使って、
PostgreSQL11のコンテナ環境を構築する手順を紹介します。

本記事の前提

  • Dockerをインストールしている
  • docker-composeをインストールしている

構築の流れ

以下の流れで構築を進めます。

  1. PostgreSQLイメージ用のdockerfileを作成する
  2. PostgreSQLの初期化用シェルスクリプトを作成する
  3. docker-composeファイルを作成する
  4. docker-composeでイメージとコンテナを作る
  5. コンテナの中に入る
  6. データベースが作成されているか確認する

1. PostgreSQLイメージ用のdockerfileを作成する

dockerfile
FROM postgres:11

ENV POSTGRES_USER="postgres" \
    POSTGRES_PASSWORD="postgres" \
    POSTGRES_INITDB_ARGS="--encoding=UTF-8 --locale=C"

COPY init.sh /docker-entrypoint-initdb.d/

dockerfileの解説をします。

1行目の「FROM postgres:11」でDocker Hubから
PostgreSQL11の公式イメージを取得します。

3行目の「ENV POSTGRES_USER="postgres"」で
PostgreSQLで使用するスーパーユーザ名を作成します。
※ユーザ名は任意ですが、慣習的にpostgresを使うようです。

4行目の「POSTGRES_PASSWORD="postgres"」で
スーパーユーザ名のパスワードを作成します。
※パスワードは任意です

5行目の「POSTGRES_INITDB_ARGS="--encoding=UTF-8 --locale=C"」で
コンテナ生成時に自動で作成されるデータベースクラスタのエンコードとロケール
を指定します。

7行目の「COPY init.sh /docker-entrypoint-initdb.d/」で
コンテナ生成時に実行したい初期化用シェルスクリプトをローカルから
コンテナ内の「/docker-entrypoint-initdb.d/」にアップロードします。
※「/docker-entrypoint-initdb.d/」にshやsqlの拡張子で終わるファイルを置くと、
 コンテナ生成時に自動で実行されます。

2. PostgreSQLの初期化用シェルスクリプトを作成する

init.sh
#!/bin/bash

set -x

psql -U postgres << EOSQL
CREATE DATABASE testdb;
EOSQL

1行目の「#!/bin/bash」で、
dockerfile実行時にシェルスクリプトを実行できるようにします、
※「#!/bin/bash」をシェバングと言います。

3行目の「set -x」で、dockerイメージをbuildする際に、コマンドが出力されるようになり、buildの途中経過がわかるようになります。書かなくても構いませんが、何かbuildに失敗したときに原因の分析がしやすくなります。

5〜7行目で、psqlコマンドを実行し、データベースを作成しています。
ここでは、testdbとしていますが、任意で構いません。

3. docker-composeファイルを作成する

docker-compose.yml
version: '3.7'
services:
  postgres:
    build: ./
    image: test_image
    container_name: test_container
    tty: true

1行目の「verion:3.7」で使用するdockerエンジンのバージョンと合った、
docker-composeのファイルフォーマットのバージョンを指定しています。

こちらのdocker公式サイトに対応表が載っていますで、ご自身のdocekr環境に合わせて、バージョンを選んでください。
dockrエンジンのバージョンは以下のコマンドで確認できます。

docker -v

筆者の環境だと、「docker version 19.03.4」でしたので、対応表と見比べて、
「3.7」としています。

2〜3行目でサービス名を「postgres」と定義しています。
このサービス名は起動するコンテナ名と考えてください。

4行目の「build: ./」でdocker-compose.ymlがある場所から見たdokcerfileの位置を記載しています。本記事では、docker-compose.ymlとdockerfileは同一の場所に配置しているため、「./」としています。

5行目の「image: test_image」で、イメージ名を定義しています。
イメージ名は任意です。

6行目の「container_name: test_container」で、コンテナ名を定義しています。
コンテナ名は任意です。

7行目の「tty: true」で、コンテナ作成後にコンテナが停止しないようにしています。

4. docker-composeでイメージとコンテナを作る

場所はどこでも構いませんので、「dockerfile」と「init.sh」と「docker-compose.yml」を同じ場所に配置してください。
その後、「docker-compose.yml」がある場所に移動してください。

ちなみに筆者は、「docker-test」というディレクトリを作り、そこに各ファイルを配置しています。

docker-compose build . -t postgresql-test
docker-compose up -d

5. コンテナの中に入る

docker-compose exec postgres bash

「docker-compose exec XXXX bash」のXXXXのところに
docker-compose.ymlで指定したサービス名を入れると、コンテナの中に入ることができます。
今回の場合だと、docker-compose.ymlの3行目で指定した「postgres」がサービス名となります。

6. データベースが作成されているか確認する

psql -U postgres

上記のコマンドでpsqlに入ることができます。
※psqlとは、postgreSQLを操作するためのクライアント向けのツールです。

\l

上記のコマンドを打った後、「testdb」が表示されていれば成功です。

\d

上記のコマンドでpsqlを抜けることができます。

もし、何かうまくいかない場合は、以下の手順を実施して、
作成したコンテナとイメージを削除して、最初からやり直してください

docker-compose down
docker rmi test-image