🍏

PostgreSQLをDockerで環境構築しよう!

2024/11/27に公開
5

概要

本記事はDockerを使ってPostgreSQLの環境構築の手順を載せてます。
パソコンにPostgreSQLをインストールしなくてもPostgreSQLを実行できます。
Web系のエンジニアで知らない人は、ほぼいないくらい大事な技術です🥺

対象読者

  • PostgreSQLの環境構築にかなり苦戦している人
  • Dockerを知らない人
  • 自分の環境を汚したくない人

Dockerとは

  • 資料通りに進めているのに、上手くインストールできない。
  • 他の人と実行結果が異なってしまう。

こんな問題よくありますよね。
その原因の一つに互いに実行している環境が違う(環境差異) があります。
これを解決してくれるのがDockerなんです。

Dockerというのは
  1. 実行環境の仕様書を書いて (Dockerfile や compose.yml)
  2. 実行するだけで (docker compose up)
  3. 完成!!
    これだけで、完了しちゃうんです。
    これで生成される実行環境のことを"コンテナ"と言います!!

Dockerの概念図

必要なインストール

Docker Desktopのインストール

以下のサイトでDocker Desktopというアプリをインストールしましょう!!
インストールしてログインを行うだけで、Dockerを使うことができるようになります!!
※ Windowsの場合は大体AMD64を選んでおけば良いと思います...

https://www.docker.com/ja-jp/products/docker-desktop/

必要なDockerファイル

このセクションでは、PostgreSQLというデータベースを簡単に使えるようにするための設定方法を説明します。
Dockerを使うと、複雑な設定を自動化でき、データベース環境を素早く作成できます。


フォルダ構成

作業フォルダ(database-class)を作成し、以下のような構成でファイルを用意してください。
それぞれのファイルが、データベースを動かすための役割を持っています。

database-class
├── Dockerfile
├── compose.yml
└── init-scripts
    └── init.sql

Dockerfile

Dockerfileは、「どんなデータベースを使うか」と「初期設定をどこから読み込むか」を指定するファイルです。
ここでは、公式のPostgreSQLイメージを使い、初期スクリプト(init.sql)をデータベースに適用します。

FROM postgres:latest

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

compose.yml

compose.ymlは、「データベースをどのように動かすか」を定義するファイルです。
次のようなことを設定しています:

  • ポート番号: 自分のパソコン(5432番)とデータベースを接続する窓口
  • 初期ユーザーやパスワード: データベースにアクセスするための情報
  • 永続化: データベースのデータを保存する仕組み

これを使うと、コマンド1つでデータベースを立ち上げられます。

services:
  postgres:
    build: .
    ports:
      - "5432:5432" # データベースに接続するためのポート番号
    environment:
      POSTGRES_USER: 'guest' # 初期ユーザー名
      POSTGRES_PASSWORD: 'password' # 初期パスワード
      POSTGRES_DB: 'my-db' # データベースの名前
    volumes:
      - postgres_data:/var/lib/postgresql/data
volumes:
  postgres_data:

init.sql

init.sqlは、データベースに「最初に何を作るか」を定義するファイルです。
このファイルでは、以下の内容を設定しています:

  1. usersテーブルの作成
    • ユーザー情報を保存するための箱を作ります。
  2. 初期データの追加
    • サンプルのユーザーを登録します。

このファイルは、データベースが最初に起動するときに自動的に読み込まれます。

CREATE TABLE IF NOT EXISTS users (
    id SERIAL PRIMARY KEY,                     -- ユーザーのID
    username VARCHAR(50) NOT NULL,            -- ユーザー名
    email VARCHAR(100) NOT NULL UNIQUE,       -- メールアドレス
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 作成日時
);

INSERT INTO users (username, email) VALUES 
('admin', 'admin@example.com'),               -- サンプルデータ1
('testuser', 'testuser@example.com');         -- サンプルデータ2

実行

以下の手順に従って、データベースを立ち上げます。
これを実行すれば、PostgreSQLデータベースが起動し、初期データが設定されます。

1. 作業フォルダに移動する

ターミナルまたはコマンドプロンプトを開き、先ほど作成したフォルダ(database-class)に移動します。

cd database-class

2. コンテナを起動する

compose.ymlを使ってデータベースコンテナを起動します。

docker compose up -d
  • -dオプションは、コンテナをバックグラウンドで実行するためのものです。
  • 実行後、docker psコマンドでコンテナが動いているか確認できます。

3. データベースに接続する

コンテナが正常に起動したら、PostgreSQLに接続できます。
以下の方法でデータベースにアクセスしてください。

方法1: psqlコマンドを使用

ターミナルで以下を実行します。

docker compose exec postgres psql -U guest -d my-db

方法2: GUIツールを使用

DBeaverやTablePlusなどのデータベース管理ツールを使う場合、以下の情報を入力します:

  • ホスト: localhost
  • ポート: 5432
  • ユーザー名: guest
  • パスワード: password
  • データベース名: my-db

4. 動作確認

データベースに接続できたら、以下のSQLを実行して初期データを確認します。

SELECT * FROM users;

結果として、以下のデータが表示されれば成功です:

id username email created_at
1 admin admin@example.com (作成日時)
2 testuser testuser@example.com (作成日時)

5. 終わったら...

作業が終了したら、以下のコマンドを実行してコンテナを全て削除しましょう。
また作業するときは手順2で紹介したやり方でコンテナを起動して作業できます!!

PostgreSQLを閉じる。
exit;
コンテナを削除 (作成したデータは残るよ!!)
docker compose down --rmi all

まとめ

これで、Dockerを使ったPostgreSQLデータベースのセットアップが完了しました!
新しいテーブルやデータを追加して、自由に使ってみてください。

Discussion

うらっしゅうらっしゅ

FAQ① ポート番号が空いていない

以下のようなエラーが出る場合は、今回使おうとしているポート番号 5432番が利用できないようです。
理由としては以下が挙げられます。

  • 5432番の使用が許可されていない
  • 5432番が既に使われている
Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:5432 -> 0.0.0.0:0: listen tcp4 0.0.0.0:5432: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.

なので、compose.ymlで指定しているポート番号を変えてあげましょう!!
"自分の環境の5433番ポートをコンテナ内の5432番ポートに繋げる" という意味です。

ports:
      - "5433:5432"  # データベースに接続するためのポート番号

うらっしゅうらっしゅ

FAQ② 初期SQLが読み込まれていない。

以下のようなエラーが出る場合は、最初に生成するSQLが実行されない事があるようです。
詳しい原因はわかりませんが、その場合は以下の対処法を試してみましょう。

ボリュームデータを削除
docker compose down -v
コンテナを再起動
//コンテナを落とす
docker compose down --rmi all

//コンテナを起動
docker compose up -d
うらっしゅうらっしゅ

FAQ③ Dockerfileが読み込まれない

以下のようなエラーが出る場合は、コンテナを起動する時に「Dockerfileがないぞ」と言われています。
理由としては以下が挙げられます。

  • Dockerfileのスペルミス
  • 実行場所にDockerfileがない。 -> cdコマンドで移動してあげよう!!
  • Dockerfile.dockerfileになっている (Windowsのファイル作成で作ると自動で拡張子付き、これは動きません。)
failed to solve: failed to read dockerfile: open Dockerfile: no such file or directory
Dockerfileを正しい名前にする(Windows)
//拡張子がついているか確認
dir

//正しい名前に変更
rename Dockerfile.dockerfile Dockerfile
Dockerfileを正しい名前にする(Mac / bash)
mv Dockerfile.dockerfile Dockerfile
うらっしゅうらっしゅ

FAQ④ Docker認証がうまくいかない

以下のようなエラーが出るときはDockerを利用する際に認証情報が取得できないようです...

failed to solve: rpc error: code = Unknown desc = failed to solve with frontend dockerfile.v0: failed to create LLB definition: failed to authorize: rpc error: code = Unknown desc = failed to fetch oauth token: unexpected status: 40
1 Unauthorized

1. ターミナル上でログインをする。

docker login -u <username> -p <password>

usernameとpasswordは はDocker Desktopに登録したユーザ情報です

使用例

docker login -u urassh -p we-like-docker

Login Succeeded が出たら成功です!!
手順2 : コンテナを起動する から試してみてください!


2. Docker Desktop をサインアウトしてログイン

うらっしゅうらっしゅ

FAQ⑤ Dockerが起動していない

以下のようなエラーが出るときはDockerコマンドを実行しようとしているけど、Dockerのアプリが起動していないと言われています!

Cannot connect to the Docker daemon at unix:///Users/urassh/.docker/run/docker.sock. Is the docker daemon running?

1. Docker Desktopを起動しよう