「AnacondaでのPython仮想環境の構築」で紹介したように利用目的に応じてPython環境を切り分けることができます。ただ、GPU環境を構築する場合にドライバやCUDAなど開発環境を含めて切り分けるにはDockerを使った方が便利です。そこで今回はDockerでJupyter notebook環境を構築する方法を紹介します。
お手軽なのはDocker hubで公開されている
- Jupyter notebook(jupyter/minimal-notebookなど)
- Anaconda(continuumio/anaconda3)
のDockerイメージを使うことですが、
- Jupyter notebook用のイメージ: 必要最小限の環境だが補完が効かない
- Anacondaのイメージ: 補完は効くが不要なパッケージも入っている
と帯に短し襷に長しな状況だったのでjupyter/minimal-notebookを参考にdockerイメージを構築しました。
ポイントは
- 必要最低限のパッケージのみインストール
- Jupyter notebookでコード補完が効く
- サーバの領域をコンテナ側にマウントしコンテナの作業結果をサーバ側に保存
- クライアントからコンテナのJupyter notebookに接続可能
としているところです。
前提
動作確認はMac(OS: Big Sur)とUbuntu 20.04で行っています。Windowsでも同様にできるのではと思いますが私の環境ではHyper-Vを有効にするとPCが不安定になり試せていません。
もしDockerが入っていなければDockerをインストールしておきます。
Macだと公式HPに行って
“Get Started”から”Docker Desktop”をインストールします。Ubuntu 20.04だと
$ sudo apt install docker.io
でインストールできます。Ubuntuではデフォルトではroot権限がないとdockerコマンドが実行できないので
$ sudo gpasswd -a $(whoami) docker $ sudo chgrp docker /var/run/docker.sock $ sudo reboot
としてsudoなしで実行できるようにしておきます。
DockerのバージョンはMacは20.10.0, Ubuntuは19.03.8でした。
使い方
まずGitHubに上げているDockerfileやスクリプトをダウンロードします。
$ git clone https://github.com/starpentagon/docker_image.git $ cd docker_image/jupyter_base/
Dockerイメージの概要
まずDockerfileでは
- Ubuntu 20.04をベースイメージとして利用
- Jupyter notebookのインストール
- Jupyter notebookの外部接続用パスワードの設定
- 外部接続用パスワードを生成するスクリプトのコピー
- ユーザの追加
- 作業ディレクトリの作成
- ポートの開放
を設定しています。
docker_build.shはその名の通りイメージのビルドし、もし外部接続用パスワードが設定されていない場合にはその設定方法を表示します。
docker_run.shでは
- 作業ディレクトリのマウント
- Dockerエンジン/コンテナ間のポートのマッピング
をしてDockerコンテナを起動します。
Jupyter notebook接続用のパスワードの設定
Jupyter notebook接続用のパスワードを事前に設定しておく必要があります。まず
$ ./docker_build.sh
を実行します。初回実行時はイメージをダウンロードするため少し時間がかかります。
一度、
$ docker run --rm -it jupyter_base
でコンテナに入ります。コンテナ内で
$ python3 ~/scripts/pass.py
を実行するとパスワードを聞かれるので入力すると
ARG JUPYTER_PASSWD='sha1:25e2bc817b10:917f1e38841d80dfa40535f60a88bc83c5228297'
などのハッシュ化されたパスワードが表示されるのでコピーしておきます。(sha1:以下は入力したパスワードに応じて変化します。)
コンテナ内での作業は終わりなので
$ exit
としてコンテナから抜けます。ホスト側でDockerfileを開いて
ARG JUPYTER_PASSWD=''
となっている部分を先ほどコピーした内容に書き換えます。
Dockerコンテナの起動
パスワードの設定が終わったら再度、イメージをビルドしてコンテナを以下で立ち上げます。
$ ./docker_build.sh $ ./docker_run.sh
コンテナ内でJupyter notebookが立ち上がりホスト側からブラウザで http://localhost:8888 にアクセスするとJupyter notebookに接続できます。
パスワードが求められるので先ほどのパスワードを入力すると接続できます。
ノートブックの保存先
ホスト側の./workディレクトリをコンテナ側の~/workディレクトリにマウントしておりJupyter notebookで保存したノートブックはホスト側に保存されます。
外部からの接続
外部からブラウザで http://(サーバのIPアドレス):8888 にアクセスするとJupyter notebookに接続できます。
カスタマイズ方法
ホスト側のポートを変更したい場合はdocker_run.sh内のHOST_PORT変数を変更してください。なお、コンテナ側のポートを変えたい場合は少し面倒で
- Dockerfile内のEXPOSE部
- Dockerコンテナ内の./jupyter/jupyter_notebook_config.pyのc.NotebookApp.port
- docker_run.sh内のGUEST_PORT変数
を変更する必要があります。