DockerでPostgreSQL環境を構築する手順【docker-compose対応】

当ページのリンクには広告が含まれています。
DockerでPostgreSQLの開発環境を構築し、docker-composeによる起動とデータ永続化を初心者向けに解説するアイキャッチ画像

「ローカルにPostgreSQLをインストールしたら他の開発環境と設定が干渉してしまった……」「OSが違うと手順がバラバラになってしまった……」ということ、ありますよね。

実はこの問題、Dockerを使うとほぼ解消できます。数行の設定ファイルを書くだけで、環境汚染なし・チーム間で再現性のある開発用PostgreSQL環境が数分で立ち上がりますよ。

筆者はもともとDockerを使ったことがありませんでした。この記事ではそんなDocker超初心者でも構築できた、インストールから接続確認まで順を追って解説します。

目次

この記事でわかること

  • DockerとDocker Composeの基本的な概念
  • docker-compose.yaml最小構成でPostgreSQL 16を立ち上げる手順
  • ターミナル・GUIツールからの接続方法
  • コンテナを削除してもデータが消えないVolume設定
  • よく使うDocker操作コマンド

Dockerなら数分で開発用PostgreSQL環境を作れる

Dockerを使うとローカルDB構築が圧倒的に簡単になる理由

PostgreSQLをローカルマシンに直接インストールする方法もありますが、Dockerを使うと次の点が大きく変わります。

  • OSにPostgreSQLの設定ファイルが散らばらない(環境が汚れない)。
  • docker compose up の一コマンドで起動・停止が完結する。
  • チームメンバーと同じdocker-compose.yamlを共有するだけで環境が揃う。
  • 「バージョンを変えたい」というときにイメージ名を書き換えるだけで対応できる。

不要になったらコンテナを削除するだけで済むので、ローカル環境をスッキリ保てるのも地味にありがたいです。

今回構築する「最小構成PostgreSQL環境」の全体像

項目内容
PostgreSQLバージョン16-alpine(公式イメージ)
接続ポート5432(ホスト) → 5432(コンテナ)
データ永続化Docker Volume(postgres16)
構成ファイルdocker-compose.yamlの1ファイルのみ

alpine とは超軽量なLinuxディストリビューションです。多くのDocker公式イメージがAlpineベース版を提供しています。イメージのダウンロードが速く・起動も速いため今回はAlpine版を選んでいます。

完成後にできること

  • コンテナを削除してもデータが消えない永続化設定
  • ターミナルからpsqlコマンドで直接接続
  • DBeaver・TablePlusなどGUIツールから接続
  • アプリケーション(Node.js、Python、Javaなど)からのDB接続

Docker初心者が最初に知っておくべき基本知識

Dockerを使うメリットやローカル環境との違いを先に整理したい方はこちらも参考になります。

Dockerとは何か(仮想マシンとの違い)

Dockerは「コンテナ型仮想化技術」を使ったアプリケーション実行環境です。仮想マシン(VMwareやVirtualBoxなど)と混同されることが多いのですが、動作の仕組みが根本的に違います。

比較項目仮想マシン(VM)Docker(コンテナ)
OSの扱いゲストOSを丸ごと起動ホストOSのカーネルを共有
起動速度数分かかることも数秒程度
リソース消費多い軽い
環境の再現性設定ファイルで管理が大変Dockerfileで完全再現

開発用DBを動かすくらいであれば、Dockerコンテナの軽さと手軽さがとてもよく合います。

コンテナ・イメージ・Docker Composeの関係

Dockerを使う上で最低限押さえておきたい概念が3つあります。

  • イメージ
    アプリケーションの「設計図」です。PostgreSQL公式イメージにはPostgreSQLが動くために必要なものがすべて詰まっています。
  • コンテナ
    イメージを実際に起動した「実行中の箱」です。イメージ1つから何個でもコンテナを作れます。
  • Docker Compose
    複数のコンテナをまとめて定義・管理するためのツールです。docker-compose.yamlに設定を書いておけば、コマンド一発で環境が立ち上がります。

「イメージ=プログラムのCD-ROM、コンテナ=そのCDを入れて起動したPC」というイメージで捉えると少し分かりやすいかもしれません。

なぜ開発用DBはDockerで動かすのが定番なのか

現場のSEやバックエンドエンジニアの間では、次の理由から開発用DBをDockerで動かすのがすっかり当たり前になっているようです。今まで使ってなかったやつがここにいますが。

  1. 環境の再現性が高い
    docker-compose.yamlさえあれば誰がどのPCで動かしても同じDB環境になります。
  2. 本番環境と切り離せる
    ローカルのDBを壊しても本番には一切影響しません。
  3. 複数バージョンの共存が簡単
    PostgreSQL 14と15を同時に動かすことも、コンテナを分ければ簡単です。

テーブルが用意できたら、時系列データの集計に挑戦してみるのもおすすめです。generate_seriesを使った時間間隔グルーピングは以下で解説しています。

開発環境の準備(Dockerのインストール)

Windows・MacでDockerをインストールする

DockerはWindows・Macともに「Docker Desktop」というアプリをインストールするのが最短ルートです。

  1. Docker公式サイトにアクセスします。
  2. OSに合わせたインストーラをダウンロードします。
  3. インストーラを実行し、指示に従ってDocker Desktopをセットアップします。
  4. Docker Desktopを起動します。
  5. タスクバーまたはメニューバーにクジラのアイコンが表示されれば起動完了です。

WindowsではWSL2(Windows Subsystem for Linux 2)が必要になる場合があります。インストーラが案内してくれるので、指示に従って有効化してください。

SQL Server の環境構築も同じ流れで進められます。Docker Desktop のセットアップが済んでいれば、以下の記事もあわせて参考にしてみてください。

Dockerが正常に動いているか確認する

インストール後ターミナル(PowerShellまたはTerminal.app)で以下のコマンドを実行し、バージョンが表示されれば準備完了です。

コマンド
docker --version
コマンド – 実行結果
Docker version 29.2.1, build a5c7197

エラーが出る場合はDocker Desktopが起動しているかを確認してみてください。

docker-compose.yamlでPostgreSQL環境を定義する

今回使用するdocker-compose.yaml(最小構成)

作業用ディレクトリを1つ作り、その中に以下の内容でdocker-compose.yamlを作成します。

docker-compose.yaml
services:
  postgres:
    image: postgres:16-alpine
    container_name: postgres16
    restart: unless-stopped

    environment:
      POSTGRES_USER: 【DBユーザー名】
      POSTGRES_PASSWORD: 【DBパスワード】
      POSTGRES_DB: 【DB名】
      TZ: Asia/Tokyo

    ports:
      - "5432:5432"

    volumes:
      - postgres16:/var/lib/postgresql/data

volumes:
  postgres16:

たったこれだけです。各設定の意味を一つずつ見ていきましょう。

docker-compose.yamlの各設定内容

image

Docker Hub上の公式PostgreSQLイメージを指定しています。postgres:16と書けばPostgreSQL 16系の最新パッチバージョンが自動的に使われます。postgres:latestと書いてしまうと将来的に意図しないメジャーバージョンアップが起きることがあるため、バージョンを明示するのがおすすめです。

今回選んだpostgres:16-alpine(Alpine Linuxベースの軽量版)と通常版の違いはこんな感じです。

postgres:16postgres:16-alpine
ベースOSDebianAlpine Linux
イメージサイズ約400MB約100MB前後
起動速度普通速い

container_name

コンテナに名前をつけておくとdocker stop postgres16のように名前で操作できて便利です。省略するとランダムな名前が自動生成されます。

restart

PCやDocker Desktopを起動したときにコンテナを自動再起動するかどうかの設定です。

挙動
no自動再起動しない(デフォルト)
always常に再起動する
unless-stopped手動停止時以外は再起動する
on-failureエラー終了時のみ再起動する

ports

ホスト側のポート:コンテナ側のポートの形式で書きます。"5432:5432"でホストの5432番ポートへのアクセスがコンテナ内のPostgreSQL(5432番)に転送されます。ローカルにすでにPostgreSQLがインストールされていてポートが競合する場合は"15432:5432"のように左側を調整してください。

environment

コンテナの初回起動時に、指定したユーザーとデータベースを自動で作成してくれます。手動でCREATE USERCREATE DATABASEを打つ必要がないのが便利なところですね。

変数名説明
POSTGRES_USER作成するロール(ユーザー)名。
POSTGRES_PASSWORDそのロールのパスワード。
POSTGRES_DB初期作成するデータベース名。
TZコンテナ内のタイムゾーン。Asia/Tokyoを指定しておくと日本環境で安心です。

volumes

ボリューム名:マウント先パスの形式で書きます。この設定がないとコンテナを削除した際にDBのデータも消えてしまいます。

Dockerが管理するボリューム(ここではpostgres16)にデータが保存されるため、コンテナを削除してもデータは残ります。マウント先の/var/lib/postgresql/dataは公式PostgreSQLイメージが参照するパスなので変更しないのが無難です。

PostgreSQLコンテナを起動する

docker compose upでDBを起動する

docker-compose.yamlがあるディレクトリで以下のコマンドを実行します。

コマンド
docker compose up -d
コマンド – 実行結果
[+] up 1/1
 ✔ Container postgres16 Created

-dオプションはバックグラウンド実行(detached mode)の指定です。初回はPostgreSQLのイメージをDocker Hubからダウンロードするため少し時間がかかります。2回目以降はキャッシュが使われるので数秒で起動しますよ。

コンテナが起動しているか確認する

コマンド
docker compose ps
コマンド – 実行結果
NAME         IMAGE                COMMAND                   SERVICE    CREATED         STATUS         PORTS
postgres16   postgres:16-alpine   "docker-entrypoint.s…"   postgres   3 minutes ago   Up 3 minutes   0.0.0.0:5432->5432/tcp, [::]:5432->5432/tcp

STATUS欄がUpと表示されれば起動しています。

よくある起動エラーと原因

Docker Desktopが起動していない

エラー内容
Error response from daemon: …

タスクバー(Windows)またはメニューバー(Mac)のDockerアイコンを確認しアプリを起動してから再実行してください。

ポート5432が使用中

エラー内容
Error starting userland proxy: listen tcp4 0.0.0.0:5432: bind: address already in use

ローカルにPostgreSQLがインストール済みですでに5432番ポートを使っている場合に発生します。docker-compose.yamlports"15432:5432"のように変更してください。

YAMLのインデントが崩れている

YAMLはインデント(スペースの数)に非常に敏感です。タブ文字は使えないため、スペース2つでインデントできているか確認してみてください。

DockerコンテナのPostgreSQLへ接続する

ターミナルからコンテナ内のpsqlで接続する

コンテナの中に直接入ってpsqlコマンドで接続する方法です。

コマンド
docker exec -it postgres16 psql -U 【DBユーザー名】 -d 【DB名】
コマンド
psql (16.13)
Type "help" for help.
【DB名】=#

DBeaverやTablePlusなどGUIツールから接続する

GUIツールから接続する場合は「新しい接続」または「New Connection」から「PostgreSQL」を選択し、以下の情報を入力します。

項目
Hostlocalhost
Port5432
Database【DB名】
Username【DBユーザー名】
Password【DBパスワード】

GUIツールはSQL補完や視覚的なER図表示ができて便利です。DBeaverA5:SQL Mk-2がよく聞くツールですね。

JavaアプリからPostgreSQLへ接続する場合はcurrentSchemaの指定方法も確認しておくと実務で詰まりにくいです。

データを永続化する仕組み(Volume)

コンテナ削除でもデータが消えない理由

Dockerコンテナはそのままでは「使い捨て」です。コンテナを削除するとその中のデータもすべて消えてしまいます。これを防ぐのがDocker Volumeの役割です。

docker-compose.yamlで指定したVolumeはコンテナとは独立したストレージ領域として管理されます。コンテナを削除してもVolumeは残るため、再度コンテナを作り直してもデータをそのまま引き継げます。

Docker Volumeの仕組み

docker-compose.yaml – volumes設定の該当箇所
volumes:
  - postgres16:/var/lib/postgresql/data

「Dockerが管理するpostgres16というVolumeをコンテナ内の/var/lib/postgresql/data(PostgreSQLがデータを書き込む場所)にマウントする」という意味です。

Volumeの実体はホストマシン上のDockerが管理する領域に保存されます。場所を直接気にする必要はほとんどありませんがdocker volume inspect postgres16で確認できますよ。

Volumeを削除するとDBは初期化される

DBを完全に初期化したい場合はVolumeごと削除します。

コマンド
# コンテナとVolumeをまとめて削除する(データも消えます)
docker compose down -v

開発でよく使うDocker操作コマンド

操作コマンド補足
起動docker compose up -dバックグラウンドで起動
停止docker compose stopコンテナは残る
再起動docker compose restart設定変更後などに
削除(データ残す)docker compose downVolumeは残る
削除(データも消す)docker compose down -v完全初期化
ログ確認docker compose logs -f postgresリアルタイム確認
状態確認docker compose ps起動中かどうか確認

docker compose downだけであればVolumeは残ります。再度docker compose up -dすれば以前のデータのまま起動できます。

DockerでPostgreSQLを使うメリット・デメリット

メリット

  • 環境が汚れない
    PostgreSQLの設定ファイルや依存ライブラリがOS上に散らばりません。
  • 再現性が高い
    docker-compose.yamlを共有するだけでチーム全員が同じ環境を作れます。
  • バージョン切り替えが楽
    イメージ名を変えるだけで複数バージョンを使い分けられます。
  • 破棄が簡単
    docker compose down一発でDB環境ごと削除できます。

デメリット

  • Dockerの概念を覚える必要がある
    コンテナ・イメージ・Volumeなど、最初に学習コストがかかります。筆者のようにあたふたすることも。
  • Docker Desktop自体のリソースを消費する
    特にWindowsではメモリをそれなりに使います。
  • 本番との差異に注意
    本番環境がDockerでない場合、環境差異が生まれる可能性があります。

ローカルインストールとの違い

比較項目ローカルインストールDocker
セットアップの手間OSごとに手順が異なるdocker-compose.yamlで統一
環境の汚れ残る残らない
複数バージョン共存難しい簡単
データの永続化デフォルトで永続Volume設定が必要
チーム共有手順書が必要yamlファイルを共有するだけ

PostgreSQL以外のDBもDockerで構築したい場合はSQL Server版の手順も参考になります。

Q&A

PostgreSQL 17以降のイメージを使いたい場合は?

docker-compose.yamlimagepostgres:17-alpineのように書き換えるだけです。Docker Hub公式ページでタグ一覧を確認できますよ。

コンテナ起動時に自動でテーブルを作りたい場合は?

docker-compose.yamlvolumesでSQLファイルをマウントする設定を追加すると、コンテナ初回起動時にSQLを自動実行できます。初期データ投入にも使えるので便利です。

Dockerを使わずにPostgreSQLをローカルインストールした場合と接続方法は変わる?

アプリ側からの接続情報(ホスト・ポート・ユーザー・DB名・パスワード)は同じ形式です。Docker環境ではホストがlocalhost、ポートが5432(または変更した場合はそのポート)になります。別のコンテナからアクセスする場合はサービス名(postgres)をホストに指定してください。

Apple Silicon(M1/M2…)のMacでも動く?

動きます。postgres:16-alpinelinux/amd64linux/arm64の両方に対応しているので特別な設定は不要です。

まとめ:開発用PostgreSQLはDockerが最もシンプル

  • DockerはVMより軽量で、コンテナ単位でアプリを動かす技術だよ。
  • docker-compose.yamlimageportsenvironmentvolumesを定義するだけで環境が作れるよ。
  • docker compose up -dで起動、docker compose psで状態確認ができるよ。
  • ターミナルからはdocker exec -itでpsql接続、GUIツールはlocalhost:5432で接続できるよ。
  • Volumeを使えばコンテナを削除してもDBデータは消えないよ。
  • docker compose down -vでVolumeごと削除すればDBを完全初期化できるよ。

PostgreSQLやSQL ServerなどDB関連の記事をまとめて確認したい方はこちら。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次