DockerでのJupyter notebook環境の構築

投稿者: | 2021-01-03

AnacondaでのPython仮想環境の構築」で紹介したように利用目的に応じてPython環境を切り分けることができます。ただ、GPU環境を構築する場合にドライバやCUDAなど開発環境を含めて切り分けるにはDockerを使った方が便利です。そこで今回はDockerでJupyter notebook環境を構築する方法を紹介します。

お手軽なのはDocker hubで公開されている

の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変数

を変更する必要があります。

スポンサーリンク


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です