PostgreSQLをDockerで環境構築しよう!
概要
本記事はDockerを使ってPostgreSQLの環境構築の手順を載せてます。
パソコンにPostgreSQLをインストールしなくてもPostgreSQLを実行できます。
Web系のエンジニアで知らない人は、ほぼいないくらい大事な技術です🥺
対象読者
- PostgreSQLの環境構築にかなり苦戦している人
- Dockerを知らない人
- 自分の環境を汚したくない人
Dockerとは
- 資料通りに進めているのに、上手くインストールできない。
- 他の人と実行結果が異なってしまう。
こんな問題よくありますよね。
その原因の一つに互いに実行している環境が違う(環境差異) があります。
これを解決してくれるのがDockerなんです。
Dockerというのは
- 実行環境の仕様書を書いて (Dockerfile や compose.yml)
- 実行するだけで (docker compose up)
- 完成!!
これだけで、完了しちゃうんです。
これで生成される実行環境のことを"コンテナ"と言います!!
Dockerの概念図
必要なインストール
WSLのインストール (Windowsのみ)
WSLをインストールすると、WindowsでLinuxを動かす事ができるようになります。
基本的には以下のコマンドを実行して再起動で良さそうです。(Windows10以上)
powershellを管理モードで開き、以下を実行してください。
wsl --install
参考
Docker Desktopのインストール
以下のサイトでDocker Desktopというアプリをインストールしましょう!!
インストールしてログインを行うだけで、Dockerを使うことができるようになります!!
※ Windowsの場合は大体AMD64を選んでおけば良いと思います...
必要な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は、データベースに「最初に何を作るか」を定義するファイルです。
このファイルでは、以下の内容を設定しています:
-
usersテーブルの作成
- ユーザー情報を保存するための箱を作ります。
-
初期データの追加
- サンプルのユーザーを登録します。
このファイルは、データベースが最初に起動するときに自動的に読み込まれます。
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 | 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番が利用できないようです。
理由としては以下が挙げられます。
なので、compose.ymlで指定しているポート番号を変えてあげましょう!!
"自分の環境の5433番ポートをコンテナ内の5432番ポートに繋げる" という意味です。
FAQ② 初期SQLが読み込まれていない。
以下のようなエラーが出る場合は、最初に生成するSQLが実行されない事があるようです。
詳しい原因はわかりませんが、その場合は以下の対処法を試してみましょう。
ボリュームデータを削除
コンテナを再起動
FAQ③ Dockerfileが読み込まれない
以下のようなエラーが出る場合は、コンテナを起動する時に「Dockerfileがないぞ」と言われています。
理由としては以下が挙げられます。
Dockerfile
のスペルミスDockerfile
がない。 ->cd
コマンドで移動してあげよう!!Dockerfile.dockerfile
になっている (Windowsのファイル作成で作ると自動で拡張子付き、これは動きません。)Dockerfileを正しい名前にする(Windows)
Dockerfileを正しい名前にする(Mac / bash)