はじめに
開発環境なんてなんでも良いと言えばそのとおりなのですが、いつでもリセットできる方が何かと便利ですし、いくつか用途を分けて作りたくなることもあると思います。
個人的に気に入っている開発環境の作り方をせっかくなのでメモしておきます。
ちなみに、特にImageサイズを小さくする気もなくて自分が使いやすいようにしている点はご留意ください。
作り方
Virutalboxのセットアップ
Docker for macは死ぬほど遅いです。
pystanのインストールしようとしたときに30分以上かかった上にエラーで落ちるという苦行を何度も繰り返しちゃんと作り直すことにしました。
作り方は、以下記事が詳しいので参照してください。
qiita.com
要はVirtualbox上にUbuntuを導入して、その上にDockerをいれて使っていく感じです。
この設定どおりにやれば、後段でjupyterを作って8888であげたとすると、http://192.168.50.10:8888/でアクセス可能です。
Jupyterの入ったDocker Imageの作成
公式で用意されているイメージもあるので、それを使っても良いと思います。
私はdatascience-notebookを使っていました。ただ、なんかstanを使うとうまくいかなかったりしたので、この際最初から作ってやるーと思って以下のようなDockerfileを作りました。
FROM ubuntu:18.04 RUN apt -y update && apt -y upgrade RUN apt -y install gcc g++ build-essential python3.7-distutils python3.7 python3.7-dev curl RUN curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && python3.7 get-pip.py && rm -f get-pip.py RUN pip install numpy Cython RUN pip install pystan RUN pip install pandas scikit-learn scipy matplotlib Pillow ipython[all] statsmodels RUN pip install jupyter RUN mkdir -p /notebook/work COPY ./src/jupyter_notebook_config.py /notebook/ WORKDIR /notebook ENTRYPOINT ["jupyter-notebook", "--allow-root", "--notebook-dir=/notebook/work" ]
ツッコミどころは色々あると思います。特にrootでjupyter走らせるんかい!とかあると思うのですが、個人的にはちょっとパッケージ足して試すっていうこともしたりするので(そしてそれが問題なければ改めてDockerfileに付け足す)rootのほうが色々と都合がよいので・・
ちなみにCOPYコマンドでコピーしているconfigがjupyter公式から持ってきました。
github.com
とりあえず作ったらビルドします。
docker build -t TAGNAME .
これで準備は整いました。
起動&アクセス
起動は簡単ですね。
docker run -itd -p 8888:8888 --name IIKANJI_NO_NAMAE TAGNAME
そしたら(前の通りの用意であれば)http://192.168.50.10:8888/にアクセスすればJupyterのトップページにアクセスできます。
tokenは以下コマンドで取得可能です。
docker exec IIKANJI_NO_NAMAE jupyter-notebook list
おまけ: VisualStudio Codeからの利用
VisualStudioCodeから利用したい場合は、次のように進めます。
1. 利用するJupyterNotebookの指定
アクセスURLとtokenを事前に入手しておいてください。
その上でVisualStudioCodeを開いて、Cmd + Shift + Pを押してコマンドパレットを開いて、以下のようにすると利用するJupyterNotebookサーバの指定ができます。
その上でipynbファイルを開くと、以下のようにノートブックが利用できます。
(もしかすると、1回セルを実行しないと接続されないかもしれないかもしれません)
おわりに
今回は自分がよくやる開発環境の作り方をメモ的に残しておきました。
いつでも潰せて、すぐに復元できて、そしてたくさん増やせるというのはコンテナの良いところですね。
Condaを使ったvirtual envも普通にいいのですが、python以外の環境もラップできるという点でこのやり方が私は好きです。
(今回の場合はあまりその点のメリットはないですけどね)