データ分析の勉強してたら使ってみたい環境が出てきた。
jupyterってのがあるらしい
pythonはlinuxのシェルで動かすもんかなぁって思ってたらそうやない。
コマンドライン環境だけじゃなくて、グラフとかマークダウンのハデな取り扱いができる環境ってのがある。
データ解析の記事を読んでたらjupyterlabってのがあるそうな。
なんちゅう便利さ。
前はjupyter notebookで、jupyterlabが今は主流っぽい。
jupyterhubってのもあるらしいけど、複数人数利用のためのものっぽい。
学校とかが重宝するんかもしれんけど、自分はとりあえず使いたいのでjupyterlabでええ。
何年か前にlinux上でpythonはスクリプトを何度か見たけど、自分は去年にdjangoから入って、phpから改版したアプリ作ってdockerで動かして使ってる。
目的が決まってたからdjangoでええんやけど、最初の頃は配列の中が今はどうなってるんかなぁとか、どうやってweb画面にグラフ表示させるんかなぁって試行錯誤してた。
jupyter使えば一発で表示の練習はできる。
配列の中がどないな入り方してるのかとか見せてくれるし、マークダウン使えるみたいやから簡単なレポートなら作れるっぽい。
なんやねん、そんな便利なツールあるんや。
mariadbからデータ読み込ませたときに、行列ひっくり返さなあかんって、気づくのが早くなったかもしれんなぁ。
docker使ってやってる人おるなかって、探したらいた。
作者さんありがとう。
ソースはipynb
って種類のテキストファイルを維持してくらしい。
どんなふうに永続化したらええのかがわかったので、自分でもやってみた。
dockerfileの読み替え
作者さんのページは1年前のもの。
docker使うしちょっとだけ新しくしてみる。
参考にさせてもらったdockerfileはFROM python:3.9.7-buster
ってあった。
busterってのはdebianのコード名。1つ前のバージョン。
debianのlinuxはコード名にディズニー映画「トイ・ストーリー」の登場人物の名前をつけてはる。
今の最新はbullseyeでアンディが乗ってる馬の名前ね。
dockerhubに公開されてるpythonイメージのタグが一覧になってる。
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.yml
をdocker-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とかで展開してんのかなぁ。
最近増えたdocker scanって何なんやろ?
docker imageの脆弱性を調べてくれる?
それはまた別のときに調べるかな。
jupyter起動
イメージ作れたからコンテナ起動してもうちょっと調整。
docker-compose up -d
docker exec -it docker-sv_jupyter-1 bash
最後にpip list -o
でバージョンアップができそうなものを調べると表示されるけど、バージョン上げたら依存性のエラーが出るから上げるのやめ。
たとえば最初にある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で初めての種類のコンテナ動かしたとき、いっつもこの瞬間がわくわくする。
開くけど拡張機能の警告みたいなのが出た。
gitの機能はいらんからとりあえずDismissしとこ。
次はkernelを選べってか。
一回選んだら次はそれ覚えてくれてるみたい。
めっちゃ普通に開く。
ちょっと練習でコード入れてみよっか。
ちょっとだけ入力して、shift+enter押すと動かせる。
コードを右クリックするとOpen Variable Inspector
が選べる。
おお~、配列の中とか表示してくれるやん。
なんちゅう楽な環境。
グラフとか表示できるんか
参考にさせてもらったページ。
作者さんありがとう。
めっちゃmatplotlib使うんやな。
コピペすると半角空白だけの行が入ってまうから、エラー出るけどすぐ外す。
おお、表示できるやん。
円グラフもついでにやってみたら、これまた普通に表示できるやん。
2つ同時にとかもできるやん。
dockerコンテナだけ起動しといたらvscodeなしで、ブラウザだけで使える。
思いついたらタブレットで開いてチャチャっと書いたりできるってことやん。
勉強に使わせてもらいまっさ。