リモートのdockerコンテナ上でたてたJupyter notebookにローカルからアクセスできるようにしたい

はじめに

タイトルのように、リモートのDockerコンテナ上でたてたJupyter notebookにローカルのブラウザからアクセスしたいときにどうすればよいかについて書いていきます。DockerコンテナにはすでにJupyter notebookがセットアップされているとします。

今回の状況を簡単に図示すると、以下のようになります。

f:id:yuichinagapan:20210506155355p:plain

手順
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の入力が求められます。

f:id:yuichinagapan:20210506164505p:plain

ここには、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