pythonもRもSQLもやりたい人のためのdocker-compose
TL;DR
- docker-composeでjupyterlabとmysql用意してpython, R, SQLの学習環境作ったよ
- github置いとくからgit cloneして使えると思うよ(README.md読んでね)
はじめに
これは備忘録として書きますが環境作るだけなので中身はありません。環境作るの難しいだるいっていう勉強し始めの人たちが見てくれて簡単やんってなったらいいね。
モチベーションとして以下
- docker-compose+dockerfileでなにかしたい
- 環境ごと学習履歴を残したい
- jupyterでなんでも勉強しようぜ
そして考えたのが以下
- 前やったAzureVMにjupyterlab建てるやつで使ったjupyter/datascience-notebook使おう
- MySQLもDockerで用意しよう
- あとはいい感じに繋げたらできそう
まとめると
- docker-composeでjupyterlabとmysql用意してpython, R, SQLの学習環境作ったよ
ちなみに技術的難易度はめちゃくちゃ低いと思います。
やることはなるべく全部書きますがめちゃくちゃ参考になるurl貼ってさぼるかもしれません。
やったこと
- windowsにdocker desktop入れます(wslいらないと思う)
- docker-compose.ymlとか書いたりディレクトリ作ったりします(エディターは何でもいいと思う)
- docker-compose up -d --buildします
- 完成&テスト
以下それぞれ詳細
1, docker desktop入れます
インストール出来たらcmdで
docker --version
してみるとバージョンを教えてくれます。多分だけどwslいらない。
ちょっと動作重いけどコンテナ/イメージ/ボリュームをGUI操作できるのでコンテナ放置とかイメージ消去忘れとか無くなりそうでとても好きです。
2, docker-compose.ymlとか書きます
以下のディレクトリ構成を作ります。
jupyterlab/
├─ db/ # db(mysql)のデータ永続化/volumes用
│ ├─ conf.d/ # 文字コードとかの設定ファイルをmy.cnfに書く
│ │ └─ my.cnf #
│ ├─ data01/ # mysqlのdataがたくさん
│ ├─ docker-entrypoint-initdb.d/ # 初期データ挿入用
│ │ └─ world.sql.gz # .sh, .sql, .sql.gzとか初期データ用sql文を置いておく
│ └─ work/ # .sqlファイルとか置いておく作業用
│
├─ notebook/ # jupyterlabのデータ永続化/volumes用
│ ├─ data/ # imageとか作業用
│ └─ work/ # ipynbとか作業用
|
├─ dockerfile/ # 後述
│ └─ dockerfile #
│
└─ docker-compose.yml # 後述
中身のあるファイルは以下です。折りたたんでます
my.conf
[mysqld]
character-set-server=utf8
[client]
default-character-set=utf8
docker-compose.yml
version: "3"
services:
notebook:
build:
context: .
dockerfile: ./dockerfile/dockerfile
ports:
- "8888:8888"
environment:
- JUPYTER_ENABLE_LAB=yes
volumes:
- ./notebook:/home/jovyan/notebook
# 以下2行はgitのための設定なのでそれぞれの環境に書き換ええる or 消してください
- /home/xiang/.ssh:/home/jovyan/.ssh
- /home/xiang/.gitconfig:/home/jovyan/.gitconfig
command: start-notebook.sh --NotebookApp.token=''
db:
image: mysql:5.7.16
volumes:
- ./db/data01:/var/lib/mysql
- ./db/conf.d:/etc/mysql/conf.d
- ./db/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
command: --default-authentication-plugin=mysql_native_password
cap_add:
- SYS_NICE
ports:
- "3306:3306"
restart: always
environment:
MYSQL_ROOT_PASSWORD: pass01
MYSQL_DATABASE: world
MYSQL_USER: user01
MYSQL_PASSWORD: pass01
dockerfile
FROM jupyter/datascience-notebook
USER root
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN apt-get update && \
apt-get -y install gcc libmariadb-dev
USER jovyan
WORKDIR /home/jovyan
RUN pip install mysqlclient
world.sql.gzはmysqlに初期データぶち込んでるだけなのでなくてもいいよ
私は以下からダウンロードして置いただけ
docker-compose.ymlとdockerfileで指定した感じに環境が出来上がります。
公式のDocs見てもいいけど私のような者にはQiitaやこのZennがわかりやすいので好きです。
- dockerについては以下がわかりやすい
- docker-composeについては以下
- dockerfileについては以下
- docker-composeとdockerfileどっちも使うのはなぜかについては以下
-
それ以外のファイルやディレクトリについてはvolumes用で、こんな感じなら作業しやすいかな~って置いたものです。必要だったり必要じゃなかったりします。dockerについてとjupyterlab/mysqlについて調べるといいかも。
-
今回はdocker-compose.ymlでvolumesとかportとかよく見る感じにしていて、dockerfileでsqlalchemyでmysqlに触れるようにpip install mysqlclientしてる。
3, docker-compose up -d --buildします
docker-compose up -d --build
するといい感じにbuildしてupします。たぶん出来上がるころにはdocker desktopでイメージ/コンテナ/ボリュームをこんな感じでGUI操作できるよ。
5分くらいかかるかも知れん。無事出来上がったら
http://localhost:8888
をブラウザで見てみる
こんな感じでjupyterlabできるはず
ちなみに使わないときはdocker-compose stopして使うときにdocker-compose startしたりして使えます。docker desktopでGUI操作可です。
docker-composeコマンドについては以下がわかりやすい
4, 完成
- githubのせときます
.gitignoreとか.gitkeepとか慣れてないのでちゃんと整備できてないです。
git cloneしたらjupyterlab-mysql_by_dockercompose/db/data01/readme.txtのテキストファイル消してからdocker-compose upしてください。
pythonとRはlauncherから開いたらかけるけどsqlはちょっとだけめんどくさいです。
pythonのmodule使ってsql叩く感じなのでpythonのノートブックで下画像の感じでやってください。上記githubにこのファイルあるので参考にしてください。
5, 感想/補足
- 今回はテスト用にworld.sql.gzで初期挿入データ作ったけど.sqlファイルあったら何でもよい気がする(docker-entrypoint-initdb.d/に入れといたらいいよ)。あくまで学習用の環境
- 今回はdbをローカルにdockerで用意したけど、dbサーバーがあってそれを分析したりする場合SQLAlchemyで今回と同様にすれば簡単にdataframeとして扱えそう。
- これまではdocker-compose書いてupするだけだったけど、たぶん本命の使い方は「Dockerhubからpullしたイメージからコンテナ作って、内部構成とかを(dockerfile書いてbuild)とかでカスタマイズして、ほんでできたイメージを仲間で共有したり環境ごと残して再利用したり破棄したりする」ってところでそれに一歩近づいた気がする。
おわり
outputすることに少しだけなれたかも
今回作った環境にちょくちょく必要そうなの追加したりして最高のjupyter環境にしていく予定なので上記のgithubは変わっていくかも
Discussion