🍣

Dockerで「SQLデータ分析・活用入門」の動作環境セットアップ

2023/03/03に公開

TL;DR

以下の書籍に記載のSQLを実行するためのDockerによる環境構築手順をまとめます。

https://www.socym.co.jp/book/1226

本書は、データ分析向けのSQLについて非常に簡潔かつわかりやすくまとまっています。また具体的な活用例も数多く記載されており活用のイメージがつきやすい、良書だと思います。

SQLコード例が豊富にありますが、環境構築の記載がサラッとしているので、比較的容易に構築できるであろう手順をここにまとめます。

動作確認環境

  • OS: Windows 10
  • WSL2
  • Linux環境: Ubuntu 20.04
  • DB: PostgreSQL

インストール

以下に従ってインストールしてください。既にインストールしているものは不要です。

環境構築手順

  1. Docker composeファイル作成
  2. 公式ページよりsqlコードを入手
  3. DockerコンテナとしてPostgreSQL起動
  4. (Option) SQL Workbench/J でDB接続・確認

1. Docker composeファイル作成

今回は、PostgreSQLをDockerコンテナで起動します。そのために、WSL上のLinux環境で以下のcomposeファイルを作成し、

docker-compose.yml
version: '3'
services:
  postgres:
    image: postgres:latest
    restart: always
    ports:
      - 5432:5432
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: admin
    volumes:
      - ./postgres/data:/var/lib/postgresql/data
      - ./postgres/init:/docker-entrypoint-initdb.d

空のディレクトリと共に、以下の様に配置します:

├── docker-compose.yml
├── postgres
    ├── data
    └── init

このcomposeファイルを使用すると、それぞれのディレクトリは以下の様な役割を担います:

├── postgres
    ├── data (PostgreSQLのデータが格納される)
    └── init (このディレクトリ内の「*.sql」がコンテナ起動時に実行される)

2. 公式ページよりsqlコードを入手

SQLコードが公式ページ に公開されており、必要なデータをDBに取り込むコードも同梱されています。

ダウンロードしてzipファイルを解凍した上で、DDl-3.sqlddl-6.sqlなどddlがついたSQLコードを先程作成したpostgres/init ディレクトリの中にコピーします。

3. DockerコンテナとしてPostgreSQL起動

WSL上のLinux環境で、以下を実行し、コンテナを立ち上げます:

$ docker-compose up -d

以下で起動ログを参照できます:

$ docker-compose logs
Attaching to container
container  | The files belonging to this database system will be owned by user "postgres".
container  | This user must also own the server process.
container  | 
container  | The database cluster will be initialized with locale "en_US.utf8".
container  | The default database encoding has accordingly been set to "UTF8".
container  | The default text search configuration will be set to "english".
container  | 
container  | Data page checksums are disabled.
container  | 
container  | fixing permissions on existing directory /var/lib/postgresql/data ... ok
container  | creating subdirectories ... ok
container  | selecting dynamic shared memory implementation ... posix
container  | selecting default max_connections ... 100
container  | selecting default shared_buffers ... 128MB
container  | selecting default time zone ... Etc/UTC
container  | creating configuration files ... ok
container  | running bootstrap script ... ok
container  | performing post-bootstrap initialization ... ok
container  | syncing data to disk ... ok
container  | 
container  | 
container  | Success. You can now start the database server using:
container  | 
container  |     pg_ctl -D /var/lib/postgresql/data -l logfile start
container  | 
container  | initdb: warning: enabling "trust" authentication for local connections
container  | initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.
container  | waiting for server to start....2023-03-03 06:46:16.469 UTC [49] LOG:  starting PostgreSQL 15.2 (Debian 15.2-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
container  | 2023-03-03 06:46:16.473 UTC [49] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
container  | 2023-03-03 06:46:16.483 UTC [52] LOG:  database system was shut down at 2023-03-03 06:46:16 UTC
container  | 2023-03-03 06:46:16.491 UTC [49] LOG:  database system is ready to accept connections
container  |  done
container  | server started
container  | CREATE DATABASE
container  | 
container  | 
container  | /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/4-ddl.sql
container  | psql:/docker-entrypoint-initdb.d/4-ddl.sql:2: NOTICE:  table "user_browser" does not exist, skipping
container  | DROP TABLE
container  | CREATE TABLE
container  | INSERT 0 3
container  | DROP TABLE
...
container  | waiting for server to shut down...2023-03-03 06:46:17.299 UTC [49] LOG:  received fast shutdown request
container  | .2023-03-03 06:46:17.302 UTC [49] LOG:  aborting any active transactions
container  | 2023-03-03 06:46:17.304 UTC [49] LOG:  background worker "logical replication launcher" (PID 55) exited with exit code 1
container  | 2023-03-03 06:46:17.305 UTC [50] LOG:  shutting down
container  | 2023-03-03 06:46:17.313 UTC [50] LOG:  checkpoint starting: shutdown immediate
container  | 2023-03-03 06:46:17.449 UTC [50] LOG:  checkpoint complete: wrote 956 buffers (5.8%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.033 s, sync=0.095 s, total=0.145 s; sync files=276, longest=0.005 s, average=0.001 s; distance=4424 kB, estimate=4424 kB
container  | 2023-03-03 06:46:17.457 UTC [49] LOG:  database system is shut down
container  |  done
container  | server stopped
container  | 
container  | PostgreSQL init process complete; ready for start up.
container  | 
container  | 2023-03-03 06:46:17.535 UTC [1] LOG:  starting PostgreSQL 15.2 (Debian 15.2-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
container  | 2023-03-03 06:46:17.536 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
container  | 2023-03-03 06:46:17.537 UTC [1] LOG:  listening on IPv6 address "::", port 5432
container  | 2023-03-03 06:46:17.542 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
container  | 2023-03-03 06:46:17.553 UTC [79] LOG:  database system was shut down at 2023-03-03 06:46:17 UTC
container  | 2023-03-03 06:46:17.560 UTC [1] LOG:  database system is ready to accept connections
container  | 2023-03-03 06:51:17.575 UTC [77] LOG:  checkpoint starting: time
container  | 2023-03-03 06:51:22.322 UTC [77] LOG:  checkpoint complete: wrote 50 buffers (0.3%); 0 WAL file(s) added, 0 removed, 0 recycled; write=4.721 s, sync=0.009 s, total=4.747 s; sync files=14, longest=0.004 s, average=0.001 s; distance=252 kB, estimate=252 kB

4. (Option) SQL Workbench/J でDB接続・確認

GUIツールでDBと接続確認します。

SQLWorkbench.exe」を起動し、以下の様にプロファイルを書き換えて「OK」を押します:

profile

そして、次の左部のTABLE欄が空でなければ問題なく環境構築できているはずです。(以下では適当なクエリを実行していますが、適宜クエリを実行して動作確認してください)

gui

終了処理

以下でDockerコンテナを落とすと終了できます:

$ docker-compose down

PostgresSQL内のデータはpostgres/dataに格納されています。すべてのデータを消して初期化したい場合は、以下を実行します:

$ sudo rm -rf postgres/data

まとめ

「SQLデータ分析・活用入門 データサイエンスの扉を開くための技術 MySQL/PostgreSQL両対応」に記載のコードを実行するための環境構築手順をまとめました。

SQLでデータ分析をやりたい/やっている方にとって広く役立つ良書だと思います。本記事が何かの役に立てば幸いです。

Discussion