リモートのdockerコンテナ上でたてたJupyter notebookにローカルからアクセスできるようにしたい
はじめに
タイトルのように、リモートのDockerコンテナ上でたてたJupyter notebookにローカルのブラウザからアクセスしたいときにどうすればよいかについて書いていきます。DockerコンテナにはすでにJupyter notebookがセットアップされているとします。
今回の状況を簡単に図示すると、以下のようになります。
手順
1. リモートPC上でDockerコンテナを立ち上げる
remoteuser@remotehost:~$ docker run -it -p [リモート側のポート番号]:[コンテナ側のポート番号] [イメージ名]
Jupyter Notebookではデフォルトのポート番号が8888
であるので、コンテナ側のポート番号は8888
にしておくと無難かもしれません。
2. Dockerコンテナ上でJupyter notebookを立ち上げる
root@[コンテナID]:/#$ jupyter notebook --ip 0.0.0.0 --port [コンテナ側のポート番号] --allow-root
ここで--ip 0.0.0.0
とするのは、0.0.0.0
がマシーン上のすべてのIPアドレスを表すため、任意の別ホストからでもアクセスすることを可能にするという意味を持ちます。これがないとコンテナ上のNotebookに外からアクセスすることはできません。
コンテナ側のポート番号は一つ前のステップで立ち上げた際に用いた番号と一致させます。一つ前で8888
とした場合には、このオプションを省くことができます。
コンテナ上でルートユーザーとなっている場合には--allow-root
オプションをつけてやりましょう。
3. ローカルPCからリモートPCへssh接続する
localuser@localhost:~$ ssh -N -f -L [ローカルの側のポート番号]:localhost:[リモート側のポート番号] remoteuser@remotehost
一応オプションについてコメントすると、
-N
:リモートコマンドを無効
-f
:バックグラウンドでの実行
-L
:クライアント→ホストのポート転送の際のアドレス・ポートを指定
4. ローカルPCのブラウザからアクセス
ローカルPCからhttp://localhost:[ローカルの側のポート番号]
にアクセスします。このとき以下のようにtokenの入力が求められます。
ここには、Docker上のコンテナでJupyter notebookを立ち上げたときに得られる出力上のtoken=c8de56fa...
の箇所をコピペしてログインします。
Currently running servers: http://localhost:8888/?token=c8de56fa... :: /Users/you/notebooks
これで、リモートのdockerコンテナ上で立てたJupyter notebookに手元のローカルPCからアクセスできるようになるはずです。
参考:
Running Jupyter on a remote Docker container using SSH | by Lucas Rodés-Guirao | Towards Data Science
リモートサーバのDocker上で起動したJupyter Notebookに他端末からアクセス - Qiita