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 でダウンロードしてください。
2)コンテナを起動
docker-compose を使ってコンテナを起動させます。
$ docker-compose up -d –-build
3)PostgreSQL接続テストをする
ブラウザを開いて
にアクセス。
以下のような画面になれば接続 OK です。
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
実践画面
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
:
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_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で指定できるのは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 のダンプコマンドを実行します。
実例
以上です。
Udemyを使ったLaravel学習方法
仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。