Docker(Docker Compose)で PostgreSQL + pgAdmin を構築

2022/08/08

仕事で、ECサイトの DB が PostgreSQL で開発されていました。

Docker で PostgreSQL 環境を構築しようと試みたのですが、記事が中々ありませんでした。

あっても部分的にしかなかったので、今回、備忘録としてエントリーしたいと思います。

 

環境

Docker for Windows で Docker Compose を使います。

PostgreSQL は 9.3 で pgAdmin は 4 で構築します。

Docker の環境は Git Hub に公開しています。

また、コンテナ作成と同時にテストで DB の articles という TABLE も作成されます。

コンテナ実行後、http://localhost/test.php

にアクセスすると Postgres の接続テストができます。

pgAdmin は http://localhost:81 にアクセスすると pgAdmin のログイン画面にアクセスできます。

 

前提条件

Windows の方はすでに Docker for Windows をインストールしているものとします。

まだ Docker for Windows をインストールされていない方は以下をご参考ください。

 

ファイル構成


docker-postgres
┣ docker/
┃    ┣ app
┃    ┃┣ Dockerfile(※PDO PostgreSQL拡張ライブラリ設定済み)
┃    ┃┗ php.ini(※PDO PostgreSQL拡張ライブラリ設定済み)
┃    ┗ initdb
┃      ┗ articles.sql(動作確認用DBテーブル)
┣ src/ (ソースコード格納用ディレクトリ)
┃    ┗ test.php(PostgreSQL接続テストスクリプト)
┗ docker-compose.yml

 

手順

 

1)Git Hub から Docker 環境をダウンロード

Git Hub に Docker 環境を UP しています。

git clone をするか ZIP でダウンロードしてください。

honjou / docker-postgres

 

2)コンテナを起動

docker-compose を使ってコンテナを起動させます。


$ docker-compose up -d –-build

 

3)PostgreSQL接続テストをする

ブラウザを開いて

http://localhost/test.php

にアクセス。

以下のような画面になれば接続 OK です。

接続テストのスクリプト(test.php)では PDO を使ってデータベースに接続しています。

 

4)PostgreSQLコンテナにアクセス

前提として、PostgreSQL のコンテナが起動していることが条件になります。

起動しているかは docker-compose ps で確認できます。


# Docker上のPostgreSQLコテナに入る
# < 構文 > docker-compose exec サービス名 bash
$ docker-compose exec myapp-db bash

# PostgreSQLにログイン
$  psql -U sample-user -h myapp-db -d sampledb

PostgreSQL へのログイン情報は "docker-compose.yml" に記載しているものです。

 

実践画面

 

5)PostgreSQLの中身を見る(対話モード)

対話モード(psql)の中でデータベースの中身を参照するためによく使うコマンドは以下になります。

コマンドは冒頭に \(¥マークを一回クリック)ことに注意してください。

コマンド 内容 補足
\l DB一覧 list
\c DB名 DBに接続 change。プロンプトがDB名になる
\dt テーブル一覧(タイプ、オーナー) display table
\z テーブル一覧(アクセス権一覧) \dpと同じ(display privilage)
\s \コマンド実行結果の履歴 sequence
\q 対話モードの終了 quit
困ったら 「\?」 でコマンド一覧を表示することができます。

 

6)PostgreSQLの中身を見る(対話モードに入らないケース)

なお、psql の対話モードで実行する一部のコマンドは、対話モードに入らずとも実行することができます。

コマンド 内容
$ psql -? ヘルプ表示。--help と同じ
$ psql -l データベース一覧
$ psql -V PostgreSql バージョン表示
$ psql -d DB名 DBに接続

 

7)PostgreSQLコンテナ上でダンプ&リストア

ダンプのやり方

PostgreSQLコンテナを起動した状態で以下のコマンドを打ちます。


# 構文
$ docker exec コンテナ名 pg_dumpall -U ユーザ名 > ダンプファイル名.sql
# 実践
$ docker exec myapp-db pg_dumpall -U sample-user > 20220206_dump.sql

 

実践画面

以下のように生成されていればOKです。

 

リストアのやり方

# 構文
$ cat ダンプファイル名.sql | docker exec -i コンテナ名 psql -U ユーザ名 -d データベース名
# 実践
$ cat 20220206_dump.sql | docker exec -i myapp-db psql -U sample-user -d sampledb

 

実践画面

 

8)PostgreSQL永続化

PostgreSQL を永続化する場合は以下のように docker-compose.yml の volumes でマウントする箇所を変更してください。

Sampleのテーブル(articlesテーブル)を確認する場合

:
  # ----------------------------------
  # Postgresを動かすコンテナ
  # ----------------------------------
  myapp-db:
    container_name: myapp-db
    image: postgres:9.3
    environment:
      POSTGRES_DB: sampledb
      POSTGRES_USER: sample-user
      POSTGRES_PASSWORD: samplepassword
      TZ: "Asia/Tokyo"
    ports:
      - 5432:5432
    volumes:
      # SAMPLE用 DBテーブル(利用する場合は以下の永続化をコメントアウトする)
      - ./docker/initdb:/docker-entrypoint-initdb.d
      # PostgreSQLの永続化
      #- /tmp/postgresql-data:/var/lib/postgresql/data:z
:

 

PostgreSQL 永続化する場合

:
  # ----------------------------------
  # Postgresを動かすコンテナ
  # ----------------------------------
  myapp-db:
    container_name: myapp-db
    image: postgres:9.3
    environment:
      POSTGRES_DB: sampledb
      POSTGRES_USER: sample-user
      POSTGRES_PASSWORD: samplepassword
      TZ: "Asia/Tokyo"
    ports:
      - 5432:5432
    volumes:
      # SAMPLE用 DBテーブル(利用する場合は以下の永続化をコメントアウトする)
      #- ./docker/initdb:/docker-entrypoint-initdb.d
      # PostgreSQLの永続化
      - /tmp/postgresql-data:/var/lib/postgresql/data:z
:

【 POINT 】
PostgreSQLの場合、vloumeマウント、データの永続化をしようとすると「うまく行かない」ってことがあるかと思います。解決策としては上記のように docker-compose.yml の volume 指定時にzフラグを追加するだけで OK です。

 

9)pgAdmin4でアクセス

http://localhost:81/ にアクセスすると pgAdmin4 にアクセスできます。

【 ログイン情報 】
id : pgadmin@laraweb.net
pass : password
※docker-compose.yml に記述している情報になります。

 

10)PostgreSQLのダンプコマンド(pg_dump)

pg_dump コマンドは、データベースのバックアップを行う PostgreSQL のコマンドです。

個人的には本番環境とローカル環境の DB を同期させるときによく使います。

・pg_dumpコマンド … 一つのデータベースのバックアップを取得
・pg_dumpallコマンド … すべてのデータベースのバックアップやユーザー(=ロールという)を取得
(※ pg_dump は内部的に pg_dump を複数回、実行している形になります。)

# pg_dump のコマンドの基本形
[root@example ~]# pg_dump -U ユーザ名 --format=出力形式 --file=出力先 バックアップを取るDB名


### 実例
[root@example ~]# pg_dump -U postgres --format=p --file=/home/user/20220303.sql app_db

# format=p は省略可
[root@example ~]# pg_dump -U postgres --file=/home/user/20220303.sql app_db

# --file=フルパス or --file=相対パス どちらでもOK
[root@example ~]# pg_dump -U postgres --file=20220303.sql app_db

【 --format=p の箇所について】
formatで指定できるのは4パターンです。
① --format=p:SQL文のテキストファイルで出力される(データも含みます)※p=plain
② --format=c:カスタム形式(=簡単にいうと圧縮されたバックアップファイルのこと)
③ --format=t:tar形式
④ --format=d:ディレクトリ形式(テーブル単位でのカスタム形式)
 
※ ①がデフォルト値(formatを指定しない場合は=pと同じ意味になります。)
※ ④のみ--jobsというオプションを使うと並列バックアップが可能
【 拡張子について 】
① テキスト形式:「.sql」
② カスタム形式:「.dump」、「.custom」、「.backup」、「.dmp」
③ tar形式:拡張子をつけない、「.tar」
④ ディレクトリ形式:拡張子をつけない

 

実例

 

11)サーバにアクセスして PostgreSQL のダンプコマンド

DBを操作する際は、rootユーザや一般ユーザではなく、postgresユーザに切り替える必要があります。


# ユーザをpostgresへ切り替えて
su - postgres

# psql コマンド + DB名で DB へアクセス
psql DB名

# ¥マークdとすることで、testサーバ内にある、テーブルを一覧表示できます。
\d

# また、¥dの後ろにテーブル名を入力することで、そのターブルにあるカラムを一覧表示できます。
\d テーブル名

 

postgresユーザに切り替えたあと、PostgreSQL のダンプコマンドを実行します。

実例

 
以上です。

Docker学習 おススメ教材(by Udemy)
動画でプログラミング学習!ドットインストール、Schoo、Udemyのどれがいい?
 
Udemyを使ったLaravel学習方法

ゼロからはじめる Dockerによるアプリケーション実行環境構築

コンテナの実行方法を学び、Ruby on RailsやDjangoといったWebアプリケーションフレームワークを使用した環境構築について学びます。Docker MachineやSwarmといったDocker関連技術についても学びます。
4.2(3552)

 

本庄マサノリ

仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら

>> Twitter をフォローする

 

-環境構築