💢

pythonもRもSQLもやりたい人のためのdocker-compose

2021/10/11に公開

TL;DR

  • docker-composeでjupyterlabとmysql用意してpython, R, SQLの学習環境作ったよ
  • github置いとくからgit cloneして使えると思うよ(README.md読んでね)

https://github.com/xianglishan/jupyterlab-mysql_by_dockercompose

はじめに


これは備忘録として書きますが環境作るだけなので中身はありません。環境作るの難しいだるいっていう勉強し始めの人たちが見てくれて簡単やんってなったらいいね。

モチベーションとして以下

  • 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入れます

https://www.docker.com/products/docker-desktop
ここからダウンロードしてインストールします。チュートリアルはやってみても何起きてるのかよくわからないのでやらないでいいです。
インストール出来たらcmdで

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
my.conf
[mysqld]
character-set-server=utf8
[client]
default-character-set=utf8
docker-compose.yml
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
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に初期データぶち込んでるだけなのでなくてもいいよ
私は以下からダウンロードして置いただけ
https://github.com/kakakakakku/mysql-world-database-dockerfiles/blob/master/5.5/world.sql.gz
docker-compose.ymlとdockerfileで指定した感じに環境が出来上がります。

公式のDocs見てもいいけど私のような者にはQiitaやこのZennがわかりやすいので好きです。

  • dockerについては以下がわかりやすい

https://qiita.com/etaroid/items/b1024c7d200a75b992fc

  • docker-composeについては以下

https://qiita.com/yuta-ushijima/items/d3d98177e1b28f736f04

  • dockerfileについては以下

https://qiita.com/yuta-ushijima/items/4633fb69c0540fc22ccb

  • docker-composeとdockerfileどっちも使うのはなぜかについては以下

https://qiita.com/sugurutakahashi12345/items/0b1ceb92c9240aacca02

  • それ以外のファイルやディレクトリについてはvolumes用で、こんな感じなら作業しやすいかな~って置いたものです。必要だったり必要じゃなかったりします。dockerについてとjupyterlab/mysqlについて調べるといいかも。

  • 今回はdocker-compose.ymlでvolumesとかportとかよく見る感じにしていて、dockerfileでsqlalchemyでmysqlに触れるようにpip install mysqlclientしてる。

3, docker-compose up -d --buildします

cmd
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コマンドについては以下がわかりやすい
https://qiita.com/nikadon/items/995c5705ff1171f7484d

4, 完成

  • githubのせときます
    .gitignoreとか.gitkeepとか慣れてないのでちゃんと整備できてないです。
    git cloneしたらjupyterlab-mysql_by_dockercompose/db/data01/readme.txtのテキストファイル消してからdocker-compose upしてください。

https://github.com/xianglishan/jupyterlab-mysql_by_dockercompose

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は変わっていくかも

GitHubで編集を提案

Discussion