jupyterlab利用 – dockerで動かす

データ分析の勉強してたら使ってみたい環境が出てきた。

jupyterってのがあるらしい

pythonはlinuxのシェルで動かすもんかなぁって思ってたらそうやない。

コマンドライン環境だけじゃなくて、グラフとかマークダウンのハデな取り扱いができる環境ってのがある。

データ解析の記事を読んでたらjupyterlabってのがあるそうな。

なんちゅう便利さ。

図解!Jupyter Labを徹底解説!(インストール・使い方・拡張機能) - ビジPy
Jupyter Labの使い方を初心者向けに徹底的に解説した記事です。「Jupyter Labとは」から始まり、インストール、基本的な使い方、実行方法、拡張機能・コード補完など、押さえておくべきことを全て解説しています。

前はjupyter notebookで、jupyterlabが今は主流っぽい。

jupyterhubってのもあるらしいけど、複数人数利用のためのものっぽい。
学校とかが重宝するんかもしれんけど、自分はとりあえず使いたいのでjupyterlabでええ。

何年か前にlinux上でpythonはスクリプトを何度か見たけど、自分は去年にdjangoから入って、phpから改版したアプリ作ってdockerで動かして使ってる。

目的が決まってたからdjangoでええんやけど、最初の頃は配列の中が今はどうなってるんかなぁとか、どうやってweb画面にグラフ表示させるんかなぁって試行錯誤してた。

jupyter使えば一発で表示の練習はできる。
配列の中がどないな入り方してるのかとか見せてくれるし、マークダウン使えるみたいやから簡単なレポートなら作れるっぽい。

なんやねん、そんな便利なツールあるんや。
mariadbからデータ読み込ませたときに、行列ひっくり返さなあかんって、気づくのが早くなったかもしれんなぁ。

docker使ってやってる人おるなかって、探したらいた。

DockerでJupyterLabの環境を作ろう
今回は「DockerとJupyterLabを組み合わせて、カスタマイズ済みのJupyterLab環境を簡単に展開する方法」をご紹介します。

作者さんありがとう。
ソースはipynbって種類のテキストファイルを維持してくらしい。
どんなふうに永続化したらええのかがわかったので、自分でもやってみた。

dockerfileの読み替え

作者さんのページは1年前のもの。
docker使うしちょっとだけ新しくしてみる。

参考にさせてもらったdockerfileはFROM python:3.9.7-busterってあった。

busterってのはdebianのコード名。1つ前のバージョン。

debianのlinuxはコード名にディズニー映画「トイ・ストーリー」の登場人物の名前をつけてはる。

今の最新はbullseyeでアンディが乗ってる馬の名前ね。

dockerhubに公開されてるpythonイメージのタグが一覧になってる。

Docker

busterをbullseyeに変更してFROM python:3.12.0a3-bullseyeにしてみたらdocker buildでコケた。

FROM python:3.11.1-bullseyeにしてみたらまたコケた。

FROM python:3.10.9-bullseyeもダメでFROM python:3.9.16-bullseyeにするとうまく行った。

用意したdockerfileはこうなった。

FROM python:3.9.16-bullseye
MAINTAINER "nari"

 ###########################################################################################################
 # jupyterlabの環境作成
 ###########################################################################################################

 # パッケージの追加とタイムゾーンの設定
RUN apt-get update && apt-get install -y \
    tzdata \
&&  ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \
&&  apt-get clean \
&&  rm -rf /var/lib/apt/lists/*

ENV TZ=Asia/Tokyo

 # JupyterLab関連のパッケージ(いくつかの拡張機能を含む)
RUN python3 -m pip install --upgrade pip \
&&  pip install --no-cache-dir \
    black \
    jupyterlab \
    jupyterlab_code_formatter \
    jupyterlab-git \
    lckr-jupyterlab-variableinspector \
    jupyterlab_widgets \
    ipywidgets \
    import-ipynb

 # 基本パッケージ
 # Pythonでよく利用する基本的なパッケージ
RUN pip install --no-cache-dir \
    scikit-learn \
    numpy \
    pandas \
    scipy \
    pycaret \
    matplotlib \
    japanize_matplotlib \
    mlxtend \
    seaborn \
    plotly \
    requests \
    beautifulsoup4 \
    Pillow \
    opencv-python

djangoのときみたいに、グラフに全角文字使いたくなったら、コンテナに日本語フォント入れたくなるんやけど、apt-getは最初はそのままにしといた。

基本パッケージのscikit-learnは依存関係がややこしいみたいで、一番最初に移動させた。

他に使いたいのが出てきたらまた足す。

永続化領域の準備

何度かコンテナ作り直すはずやけど、pythonのコードは維持させたい。
mariadbとかdjangoとか、他にもコンテナ使ってるから追加してく。

自分のディレクトリ構造は/docker/nariDockerDatの中に永続化領域をsv_jupyterとして作って持ってみた。

/docker
|--docker-compose-current.yml               ★ここに追記
|--docker-compose.yml
|--dockerStart.sh                           ★起動スクリプト
|--dockerStop.sh                            ★停止スクリプト
/docker/nariDockerDat/sv_mariadb            ★mariadbの永続化領域
|--(中略)
/docker/nariDockerDat/sv_django-uwsgi-nginx ★djangoの永続化領域
|--(中略)
/docker/nariDockerDat/sv_jupyter            ★今回作成した領域
|--py3
|  |--root_jupyter
|  |  |--lab
|  |  |--migrated
|  |--sv_jupyter_Dockerfile                 ★今回用意したdockerfile
|--workspace                                ★ipynbのための領域でここを維持
|  |--.ipynb_checkpoints
|  |--1st
|  |  |--.ipynb_checkpoints
|  |  |--1st.ipynb
|  |--2nd
|  |  |--.ipynb_checkpoints
|  |  |--graph-bar.ipynb
|  |  |--graph-circ.ipynb
|  |  |--graph-twin.ipynb

docker-compose.ymlの用意

実際はdocker-compose-current.ymlに追記してる。

docker-composeで起動と停止してくれるdockerStart.sh/dockerStop.shが前処理と後処理をやってくれる。

dockerStart.shはdjangoコンテナ用のおまじないが入ってて、最後にdocker-compose-current.ymldocker-compose.ymlへ上書きコピーしてからコンテナを起動させるようにしてる。

他にもコンテナ動かしてるからmariadb起動終わってから動き出すようにdepends_on書いとく。

services:
  sv_jupyter:
    hostname: svjupyter
    build:
      context: ./nariDockerDat/sv_jupyter/py3
      dockerfile: sv_jupyter_Dockerfile
    entrypoint: >
      jupyter-lab
      --allow-root
      --ip=0.0.0.0
      --port=8888
      --no-browser
      --NotebookApp.token=''
      --notebook-dir=/workspace
    ports:
      - "21088:8888"
    volumes:
      - ./nariDockerDat/sv_jupyter/py3/root_jupyter:/root/.jupyter
      - ./nariDockerDat/sv_jupyter/workspace:/workspace
    depends_on:
      - sv_mariadb

ビルドしてみよか。

docker-compose build sv_jupyter

ビルドはうまく行くけど、その後のpip list install scilkit-learn --upgradeがうまく行かん。

ビルドにかかる時間は600秒ぐらいで、10分ぐらい待つ。
待ってる間別窓でcpuの利用率見てたら1コアだけ使ってるときがあったから、tar/zipとかで展開してんのかなぁ。

jupyterlab

最近増えたdocker scanって何なんやろ?
docker imageの脆弱性を調べてくれる?
それはまた別のときに調べるかな。

jupyter起動

イメージ作れたからコンテナ起動してもうちょっと調整。

docker-compose up -d 
docker exec -it docker-sv_jupyter-1 bash

最後にpip list -oでバージョンアップができそうなものを調べると表示されるけど、バージョン上げたら依存性のエラーが出るから上げるのやめ。

jupyterlab

たとえば最初にあるblisってのをバージョン上げるとこうなった。

root@svjupyter:/# pip3 install blis --upgrade 
Requirement already satisfied: blis in /usr/local/lib/python3.9/site-packages (0.7.9)
Collecting blis
  Downloading blis-0.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.8 MB)
 qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq 7.8/7.8 MB 39.6 MB/s eta 0:00:00
Requirement already satisfied: numpy>=1.15.0 in /usr/local/lib/python3.9/site-packages (from blis) (1.20.3)
Installing collected packages: blis
  Attempting uninstall: blis
    Found existing installation: blis 0.7.9
    Uninstalling blis-0.7.9:
      Successfully uninstalled blis-0.7.9
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
thinc 7.4.6 requires blis<0.8.0,>=0.4.0, but you have blis 0.9.1 which is incompatible.
spacy 2.3.8 requires blis<0.8.0,>=0.4.0, but you have blis 0.9.1 which is incompatible.
Successfully installed blis-0.9.1
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv

イマイチなんでこういうことになるんかわからん。

最初こんなふうに書いたら大量に出てきてわけわからんかった。

pip list -o | tail  -n +3 | awk '{ print $1 }' | xargs pip install --upgrade

エラーのエコーバック長すぎて読む気にならん。

たぶん元々入ってるバージョンが新しいから入らんって言うてるっぽい。
しゃあないから今はこのままにしとこ。

jupyter使ってみる

一発でつながるか?
dockerで初めての種類のコンテナ動かしたとき、いっつもこの瞬間がわくわくする。

jupyterlab

開くけど拡張機能の警告みたいなのが出た。
gitの機能はいらんからとりあえずDismissしとこ。

次はkernelを選べってか。

jupyterlab

一回選んだら次はそれ覚えてくれてるみたい。

めっちゃ普通に開く。

ちょっと練習でコード入れてみよっか。

ちょっとだけ入力して、shift+enter押すと動かせる。
コードを右クリックするとOpen Variable Inspectorが選べる。

jupyterlab

おお~、配列の中とか表示してくれるやん。

jupyterlab

なんちゅう楽な環境。

グラフとか表示できるんか

参考にさせてもらったページ。
作者さんありがとう。

めっちゃmatplotlib使うんやな。

Python Matplotlibのインストールから使い方を徹底解説!(plot、subplotなど) - ビジPy
PythonのMatplotlibにおける様々なグラフの作成方法を初心者向けに解説した記事です。折れ線・棒・積み上げ棒・円グラフ、散布図の描き方や、タイトル、ラベル、目盛線、凡例、マーカーなどの装飾方法など、押さえておくべきことを徹底的に解...

コピペすると半角空白だけの行が入ってまうから、エラー出るけどすぐ外す。

jupyterlab

おお、表示できるやん。

jupyterlab

円グラフもついでにやってみたら、これまた普通に表示できるやん。

jupyterlab

2つ同時にとかもできるやん。

jupyterlab

dockerコンテナだけ起動しといたらvscodeなしで、ブラウザだけで使える。
思いついたらタブレットで開いてチャチャっと書いたりできるってことやん。

勉強に使わせてもらいまっさ。

タイトルとURLをコピーしました