PostgreSQLの練習環境をDockerで作り、WSL2からアクセスする
やること
- SQLの勉強のためにPostgreSQLを使うので、そのための環境を準備します。
- 環境がゴチャゴチャするのを最小限にしたいので、PostgreSQLのサーバ側(RDBMS)はDockerで構築します。
- SQL文を対話式シェルで実行するのと、
.sql
ファイルを用意してそのファイルを読み込ませて実行するのとを両方行いたいので、利便性のためにWSL2のシェルからpsql
を実行します。 - 作ったデータベースは使いまわしたいのでDockerのボリュームに保存するようにします。
- SQLの学習目的なので、必要最小限のオプションのみ設定します。
使用環境
- ホストOS: Windows10
- WSL2: Ubuntu 20.04
- Docker Desktop for Windows: Docker Engine Ver.20.10.8
- Dockerイメージ:
postgres:latest
環境構築手順
前提条件
前提として、WSL2のインストール&セットアップと、Docker Desktop for Windowsのインストールが完了しているものとします。
Dockerの準備
Dockerコンテナを起動するためのdocker-compose.yml
ファイルを用意します。
docker-compose.yml
の中身は以下のようにします。
version: '3.1'
services:
db:
image: postgres:latest
restart: always
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
volumes:
- "db.data:/var/lib/postgresql/data"
ports:
- "5432:5432"
tty:
true
volumes:
db.data:
Dockerコンテナの環境変数には、POSTGRES_USER
とPOSTGRES_PASSWORD
の2つを設定しています。このうち、POSTGRES_PASSWORD
のみが設定必須な環境変数です。POSTGRES_USER
はデフォルト値であるpostgres
をそのまま設定しています。この環境変数POSTGRES_USER
は必須変数ではないため、デフォルト値をそのまま使用する場合は設定する必要はありません。
パスワードにpostgres
を指定しているため、psql
によってデータベースにアクセスする際は毎回postgres
を入力しなければなりません。
パスワードの入力が面倒な場合は、環境変数POSTGRES_HOST_AUTH_METHOD
にtrust
を設定します。
ただし、この環境変数をtrust
に設定するのはセキュリティ上推奨されていません。[1]
WSL2の準備
CLIからデータベースにアクセスするにはpsqlというコマンドラインツールが必要になります。
WSL2にこれをインストールする必要があります。apt
コマンドを使ってインストールすることができます。
ここではクライアントのみをインストールします。
sudo apt install postgresql-client
インストール後、psql
コマンドが使用可能か確認します。psql
コマンドのオプションに-V
あるいは--version
を付けることで、psql
のバージョンを確認することができます。
psql --version
実際に使用する
Dockerコンテナの起動
Dockerの準備で記述したdocker-compose.yml
を使ってDockerコンテナを起動します。
Windows PowerShellを開き、次のコマンドを実行します。
docker compose up -d
-d
オプションを付けることにより、Dockerコンテナがバックグラウンドで起動します。
Dockerコンテナを終了するには次のコマンドを実行します。
docker compose down
psql
による対話型コマンドの実行
初回起動時(接続先データベースがまだできていない状態)
Dockerコンテナを起動したことにより、PostgreSQLにアクセスできるようになりました。
psql
コマンドを使用して対話形式でSQLを実行するには、WSL2端末上で次のコマンドを実行します。
psql -h localhost -p 5432 -U postgres
psql
コマンドの-h
オプションはホスト名の指定です。本記事における環境では、データベースはローカルホスト上に作成したものを使用するため、localhost
を指定します。
-p
オプションはデータベースのポート番号です。Dockerの準備で記述したdocker-compose.yml
の中でポート番号を5432
に設定しているので、5432
を指定します。
-U
オプションはロール名の指定です。本記事における環境ではデフォルトのロールであるpostgres
を使用するようにしているので、postgres
を指定します。
psql
でデータベースにアクセスするには-d
オプションで接続先データベースの名前を指定するのですが、初回起動時は接続先のデータベースがまだ存在していないため、-d
オプションを省略して実行します。
すると、PostgreSQLで最初から用意されているサンプルデータベースであるpostgres
にログインされます。
サンプルデータベースにログインした状態で、学習用のデータベースを作成します。
次のコマンドを実行して、hoge
という名前の学習用データベースを作成します。
CREATE DATABASE hoge;
このコマンドが成功すると、端末上に次のようなメッセージが表示されます。
CREATE DATABASE
学習用データベースの作成に成功したら、一旦サンプルデータベースからログアウトします。次のコマンドを実行すると、psql
を終了してデータベースからログアウトできます。
\q
これで、次回以降は今作成したデータベースにログインして作業を行うことができます。
ログインの仕方は次のセクションで説明します。
次回起動時以降(接続先データベースがある状態)
接続先のデータベースが存在している場合、次のコマンドでデータベースにログインします。
psql -h localhost -p 5432 -U postgres -d hoge
-d
オプションで接続先データベースの名前を指定します。ここではhoge
という名前のデータベースを指定しています。
このコマンドを実行すると、パスワードの入力を促されます。Dockerの準備で記述したdocker-compose.yml
ファイルで、パスワードにはpostgres
を指定したので、これを入力します。
するとデータベースにログインすることができ、対話形式でSQL文を実行することができます。
psql
による.sql
ファイルの実行
次に、拡張子.sql
のテキストファイルに書いたSQL文をpsql
コマンドを使用して実行します。
SQL文を書き込んだファイルとして、create_table.sql
という名前のファイルを用意し、以下のような内容を記述します。サンプル用なので特に意味はありません。
CREATE TABLE moge (
id CHAR(4) NOT NULL,
name VARCHAR(50) NOT NULL,
primary key (id)
);
このSQL文を実行するには、create_table.sql
ファイルがあるディレクトリで、次のコマンドを実行します。
psql -h localhost -p 5432 -U postgres -d hoge -f create_table.sql
-f
オプションは、指定したファイルをコマンドのソースとして使用するオプションです。ファイルの中にあるSQL文が順次実行され、全てのSQL文の処理が終了するとpsql
も終了します。
まとめ
Dockerコンテナで構築したPostgreSQLを、WSL2の端末操作上から操作することができました。
SQL文を好きなエディタで書いて好きなだけ実行することができるようになったので、少しでも学習が捗るようになると思います。
参考文献
- Postgres - Official Image | Docker Hub
- PostgreSQL 9.2.4文書
- SQL 第2版 ゼロからはじめるデータベース操作 第2刷, ミック, 翔泳社
-
学習用と割り切るなら問題ありません。 ↩︎
Discussion