🐘

PostgreSQLの練習環境をDockerで作り、WSL2からアクセスする

2021/11/15に公開

やること

  • 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の中身は以下のようにします。

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_USERPOSTGRES_PASSWORDの2つを設定しています。このうち、POSTGRES_PASSWORDのみが設定必須な環境変数です。POSTGRES_USERはデフォルト値であるpostgresをそのまま設定しています。この環境変数POSTGRES_USERは必須変数ではないため、デフォルト値をそのまま使用する場合は設定する必要はありません。

パスワードにpostgresを指定しているため、psqlによってデータベースにアクセスする際は毎回postgresを入力しなければなりません。
パスワードの入力が面倒な場合は、環境変数POSTGRES_HOST_AUTH_METHODtrustを設定します。
ただし、この環境変数を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.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文を好きなエディタで書いて好きなだけ実行することができるようになったので、少しでも学習が捗るようになると思います。

参考文献

脚注
  1. 学習用と割り切るなら問題ありません。 ↩︎

Discussion