pyhaya’s diary

プログラミング、特にPythonについての記事を書きます。Djangoや機械学習などホットな話題をわかりやすく説明していきたいと思います。

データベースの学習環境をDockerで作った話

データベースの勉強をするときに書いたクエリを実際に試すことはとても重要ですよね。しかし、私はこれまで書いたクエリを試すための環境構築が面倒で下のサイトを利用して SQL を実行していました。
www.db-fiddle.com

このサイトはとても便利なのですが、毎回 CREATE TABLE から始めなければならなくてこれはこれで面倒なのと、やはりローカルに入れて勉強した方が深いところまで学ぶことができるのではないかと感じたので試してみることにしました。

動作環境

動作確認は WSL 内で行っています。

  • Windows 10 Home
  • WSL2 (Ubuntu 18.04)
  • Docker 19.03.13
  • docker-compose 1.27.4

Docker image の取得

PostgreSQL は DockerHub に公式イメージが公開されているのでそれを使います。バージョンに特にこだわりはないのと、最近 PostgreSQL の大規模なバク修正があったと聞いたので latest を使います。

news.mynavi.jp

$ docker pull postgres:latest

docker-compose.yaml の作成

毎回コンテナを起動するときにいろいろ指定するのは面倒なので全部 docker-compose.yaml に書いておきます。

version: '3'

services:

  db:
    image: postgres
    container_name: db
    restart: always
    environment:
      POSTGRES_PASSWORD: your-password
    volumes:
      - ./data:/var/lib/postgresql/data
      - ./sql:/home

コンテナデータを永続化するためにホストのディレクトリ(./data)をコンテナ内でデータベース情報の入るディレクトリ(/var/lib/postgresql/data)にマウントします。また、SQLファイルを入れるディレクトリ(./sql)もマウントしています。

構築した環境を使う

準備はできたのでコンテナを起動します。

$ docker-compose up -d
$ docker-compose ps  # コンテナが無事起動しているか確認

Name              Command              State    Ports
-------------------------------------------------------
db     docker-entrypoint.sh postgres   Up      5432/tcp

コンテナが無事に起動出来たら学習用のデータベースを作りましょう。

$ docker exec -it db /bin/bash
root@92913b69db39:/# createdb -U postgres testdb
root@92913b69db39:/# psql -U postgres -d testdb
psql (13.1 (Debian 13.1-1.pgdg100+1))
Type "help" for help.

testdb=# \q
root@92913b69db39:/# exit
$ 

今回は単に学習用なのでユーザーは postgres を使ってしまいます。

次に、このデータベースにテーブルを作成する SQL を実行します。

create_table.sql

CREATE TABLE testtable (
    id INTEGER PRIMARY KEY,
    name VARCHAR(100) NOT NULL
);

テーブルを作成するには

$ docker exec -it db psql -U postgres -d testdb -f /home/create_table.sql

を実行します。CREATE TABLE という出力が出れば成功です。

最後に、SQL を実行するコマンドの効率化をしましょう。毎回実行するたびに上のコマンドを実行するのは面倒なのでシェルスクリプトを作ります。

runner.sh

#!/bin/bash                                                                                                                                                               
docker exec -it db psql -U postgres -d testdb -f /home/$1

chmod +x runnser.sh で実行権限を付与しておけば、

$ ./runner.sh create_table.sql

のように実行することができます。これで勉強がはかどりますね!


Docker/Kubernetes 実践コンテナ開発入門

Docker/Kubernetes 実践コンテナ開発入門