Dockerで「SQLデータ分析・活用入門」の動作環境セットアップ
TL;DR
以下の書籍に記載のSQLを実行するためのDockerによる環境構築手順をまとめます。
本書は、データ分析向けのSQLについて非常に簡潔かつわかりやすくまとまっています。また具体的な活用例も数多く記載されており活用のイメージがつきやすい、良書だと思います。
SQLコード例が豊富にありますが、環境構築の記載がサラッとしているので、比較的容易に構築できるであろう手順をここにまとめます。
動作確認環境
- OS: Windows 10
- WSL2
- Linux環境: Ubuntu 20.04
- DB: PostgreSQL
インストール
以下に従ってインストールしてください。既にインストールしているものは不要です。
- WSL2
- Docker for Desktop
- SQL Workbench/J (Download Linkの「Generic package for all systems including all optional libraries」を選択し、ダウンロードされたexeを実行)
環境構築手順
- Docker composeファイル作成
- 公式ページよりsqlコードを入手
- DockerコンテナとしてPostgreSQL起動
- (Option) SQL Workbench/J でDB接続・確認
1. Docker composeファイル作成
今回は、PostgreSQLをDockerコンテナで起動します。そのために、WSL上のLinux環境で以下のcomposeファイルを作成し、
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.sql
や ddl-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」を押します:
そして、次の左部のTABLE欄が空でなければ問題なく環境構築できているはずです。(以下では適当なクエリを実行していますが、適宜クエリを実行して動作確認してください)
終了処理
以下でDockerコンテナを落とすと終了できます:
$ docker-compose down
PostgresSQL内のデータはpostgres/data
に格納されています。すべてのデータを消して初期化したい場合は、以下を実行します:
$ sudo rm -rf postgres/data
まとめ
「SQLデータ分析・活用入門 データサイエンスの扉を開くための技術 MySQL/PostgreSQL両対応」に記載のコードを実行するための環境構築手順をまとめました。
SQLでデータ分析をやりたい/やっている方にとって広く役立つ良書だと思います。本記事が何かの役に立てば幸いです。
Discussion