🛳️

Dockerでpostgresqlを構築する

2023/10/18に公開

概要

DockerでPostgreSQLを立てて使う基本的な手順。

やってみる

1. Dockerをインストール

Docker Desktop 公式ページからインストール

2. 「docker-compose.yml」を作成

ローカル環境で動かしたい場合は、「docker-compose.yml」の作成のみでOK。

docker-compose.yml
version: '3'

services:
  db:
    image: postgres:14
    container_name: postgres_pta
    ports:
      - 5432:5432
    volumes:
      - db-store:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: 'user'
      POSTGRES_PASSWORD: 'postgres'
volumes:
  db-store:
  • 「docker-compose.yml」はプロジェクトのディレクトリ直下に作成。

■設定内容について

  • version : docker-composeで使用するバージョンを定義。
  • services : サービス (コンテナ) を定義。
  • image : Dockerイメージは、クラウド上のレジストリ「Docker Hub」からダウンロードして使うことができる他、自分で作って使うことも可能。
  • container_name : コンテナの名前を指定。
  • volumes : DBファイルのパス(/var/lib/postgresql/data)をvolumeにマウントして永続化。
  • environment : 環境変数の設定。
    • POSTGRES_PASSWORD : パスワード。※必須項目
    • POSTGRES_USER : ユーザ名。※指定しなかった場合、デフォルトpostgres。
    • POSTGRES_DB : DB名。※指定しなかった場合、デフォルトpostgres。

■「Dockerfile」を使用する場合

ローカル環境であれば「Dockerfile」は作成する必要はないが、「Dockerfile」を使用する場合は、「docker-compose.yml」は以下のように設定する必要がある

docker-compose.yml
version: '3'

services:
  db:
    # build: .でdocker-compose.ymlと同じフォルダにDockerfileがあることを示す
    build: .
    container_name: postgres_pta
    ports:
      - 5432:5432
    volumes:
      - db-store:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: 'user'
      POSTGRES_PASSWORD: 'postgres'
volumes:
  db-store:

3. 「Dockerfile」を作成する

Dockerfileとは、新規にDockerイメージを作成するための手順を記したテキストファイル。
Dockerfileを使用する理由は以下などがある

  • Dockerfileというテキストファイルを作成することで、Docker Imageを作ることが出来る
  • 一連の手順を自動化できる
  • ファイルで管理できる
  • 自分の好きなようにカスタマイズすることができる

■Dockerfileの作成方法

Dockerfile
FROM postgres:14

# Time ZoneAc
ENV TZ Asia/Tokyo

# Language
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
  • 「Dockerfile」はプロジェクトのディレクトリ直下に作成。

※「docker-compose.yml」「Dockerfile」作成後の格納場所イメージ
(「test_app」はプロジェクト名)

4. 接続確認

以下コマンドで、コンテナを作成・起動。

docker compose up -d

特にエラーが出ていなければ問題なし。
コマンドでコンテナが立ち上がっているかは以下コマンドで確認可能。

docker ps -l
確認結果
CONTAINER ID   IMAGE         COMMAND                  CREATED              STATUS              PORTS                    NAMES
d386540f5987   postgres:14   "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:5432->5432/tcp   postgres

※Dockerコンテナを停止する場合は、以下コマンド。

docker compose down 

5. Dockerでコンテナが立ち上がっていることを確認


※コンテナが起動していると、以下状態になる。
 - 赤枠の箇所のコンテナマークが緑色
 - "ACTIONS"が「■」(停止)を表示
 - "STATUS"がRunningを表示

6. DBの接続確認

今回は、DB接続確認のため、TablePlusを使用。
TablePlus 公式ページで「TablePlus」をインストール。

1. 「PostgreSQL」を選択。

2. DB接続設定は以下のように設定し、「test」を押下し、接続確認。

  • 「docker-compose.yml」に記載した、ユーザ名、パスワードを設定。
  • Host/Socketはローカル環境用のため、「127.0.0.1」を設定。
  • Databaseは任意。
  • PortはPostgresを使用するため、「5432」を指定。

    接続が成功すると、以下のように枠が緑色になる。
    「connect」を押下し接続する。

    エラーが出ずに、以下のような画面を表示することができればOK。

※DB接続確認時の注意事項

DB接続確認時に「test」を押下すると、以下のようなエラーが出た場合の対処法です。
※エラー内容
connection to server at "localhost" (::1), port 5432 failed: FATAL: password authentication failed for user "user_"

エラー画面


原因
  • 一度Dockerを立ち上げた後、認証情報(POSTGRES_USERやPOSTGRES_PASSWORD)を変更した場合に発生するエラー。
  • 認証情報は、初期起動時に設定されます。その後、認証情報を変えて起動しようとしても、当初設定した値と一致しないため、エラーになる。
対処法
  1. 以下コマンドで、Dockerコンテナを停止する。
docker compose down 
  1. Dockerを開き、左メニューの「Volumes」を押下。
  2. db volumeを削除する。(使用するコンテナ名の右側にあるゴミ箱マークを押下)
  3. 再度コンテナを起動する。
docker compose up -d

おわりに

DBのテーブル作成方法については、次回の記事で詳しく説明予定。

参考

https://www.kagoya.jp/howto/cloud/container/dockerpostgresql/
https://kinsta.com/jp/knowledgebase/what-is-docker/

Discussion