えんじにあのじゆうちょう

勉強したことを中心にアウトプットしていきます。

Dockerを使ったローカルの開発環境(Jupyter)の作り方 for Mac

はじめに

開発環境なんてなんでも良いと言えばそのとおりなのですが、いつでもリセットできる方が何かと便利ですし、いくつか用途を分けて作りたくなることもあると思います。
個人的に気に入っている開発環境の作り方をせっかくなのでメモしておきます。

ちなみに、特にImageサイズを小さくする気もなくて自分が使いやすいようにしている点はご留意ください。

作り方

Virutalboxのセットアップ

Docker for macは死ぬほど遅いです。
pystanのインストールしようとしたときに30分以上かかった上にエラーで落ちるという苦行を何度も繰り返しちゃんと作り直すことにしました。
作り方は、以下記事が詳しいので参照してください。
qiita.com

要はVirtualbox上にUbuntuを導入して、その上にDockerをいれて使っていく感じです。
この設定どおりにやれば、後段でjupyterを作って8888であげたとすると、http://192.168.50.10:8888/でアクセス可能です。

Jupyterの入ったDocker Imageの作成

公式で用意されているイメージもあるので、それを使っても良いと思います。

github.com

私は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サーバの指定ができます。

f:id:marufeuillex:20200321155810p:plain

f:id:marufeuillex:20200321155822p:plain

その上でipynbファイルを開くと、以下のようにノートブックが利用できます。
(もしかすると、1回セルを実行しないと接続されないかもしれないかもしれません)

f:id:marufeuillex:20200321160738p:plain

おわりに

今回は自分がよくやる開発環境の作り方をメモ的に残しておきました。
いつでも潰せて、すぐに復元できて、そしてたくさん増やせるというのはコンテナの良いところですね。
Condaを使ったvirtual envも普通にいいのですが、python以外の環境もラップできるという点でこのやり方が私は好きです。
(今回の場合はあまりその点のメリットはないですけどね)