DockerでJupyterサーバーを建てた時の備忘録

 大学の研究用GPUサーバーでJupyterノートブックを使う必要があったので、Dockerを使ってJupyterサーバーを立てた手順を備忘録としてメモっておきます。

 Docker自体は既にインストールされており、利用に必要な権限があることを前提にします。

 

1. Dockerイメージの取得

まずはDocker HubからJupyterサーバーのイメージを取得します

$ docker pull jupyter/tensorflow-notebook

 今回はtensorflow用のイメージをダウンロードしましたが jupyter/tensorflow-notebook (イメージ名) の部分は用途に合わせてに合わせて変更してください。

 

2. 作業データ保存用のディレクトリの作成

基本的にDockerコンテナーは終了すると保存していたデータが吹っ飛んでしまいます。数時間かけて学習させて保存したモデルの重みパラメータが突然消えてしまうようなことは必ず避けたいですよね。

データを保持する方法はボリューム(Volumes)やバインドマウント(Bind Mounts)等があります。

今回はバインドマウントを使いました。ホスト機にあるディレクトリとDocker環境内にあるディレクトリ同期させることによってDockerコンテナーを終了してもホスト機側のディレクトリに保存したデータが残る方法です。

$ mkdir jsdir

 

3. Dockerコンテナーの構築

$ docker run -d --gpus '"device=0,1,2"' -v [データ保存用ディレクトリのパス]:/home/jovyan/work -p 21799:8888 --name [任意のコンテナー名] jupyter/tensorflow-notebook

コマンドの各部分の説明

docker run : 新しいDockerコンテナーを作成して実行するコマンド

-d : コンテナをバックグラウンドで実行するためのオプション

--gpus '"device=0,1,2"' : 利用したいGPUデバイスの指定。全てのGPUを使いたければdevice=all。GPUを使わない場合は無くても問題なし。

-v [データ保存用ディレクトリのパス]:/home/jovyan/work : バインドマウントのオプション。Dockerコンテナー内の/home/jovyan/workが指定したディレクトリとほぼリアルタイムで同期されます。

-p 21799:8888 : Dockerコンテナのポート8888とホスト機のポート21799間のポート転送

--name [任意のコンテナー名] : 任意のコンテナー名

jupyter/tensorflow-notebook : Dockerイメージ名

 

4. Jupyterサーバーにアクセス

この時点でコンソール画面に前のコマンドで指定した任意のコンテナー名が出力されていたら正常にコンテナーが稼働しているはずです。

トークンの取得

Jupyterサーバーは稼働していてもアクセスするのにトークンが必要です。

$ docker logs [コンテナー構築時に指定したコンテナー名]

このコマンドはコンテナーのコンソール出力を表示します。


 上の画像にある赤枠に似た部分をコピー(2つとも同じです)

パスワードの設定

ブラウザーで http://[ホストサーバーのアドレス]:[コンテナー構築時に指定した転送ポート(21799)] を開きSetup a Password部分にスクロール。

 

Tokenのテキストボックスにコピーしたトークンを貼り付け、New Passwordのテキストボックスに任意のパスワードを入力し、Log in and set new password をクリック。

  

無事にログインすることが出来ました。

左側に表示されているworkフォルダーはコンテナー構築時に指定したホスト機のディレクトリと同期されていますがworkフォルダー外に保存するファイルやディレクトリはコンテナーを終了すると消えます。

 5. 再ログイン

これでコンテナーを終了(ホスト機をシャットダウン)しない限りJupyterサーバーか稼働し続きますが別デバイスからアクセスしたりCookieを削除したりすると、ログイン時にトークン/パスワードを問われます。その時は、手順4で設定したパスワードやトークンでログインできます。

 

 

最後に

以上、 DockerでJupyterサーバーを建てた時の備忘録でした。誰かのお役に立てれば幸いです。

 
 

コメント