子育てしながらエンジニアしたい

現在 7 歳 女の子の子育て中エンジニアによる、技術系 + 日常系ブログ。

Ubuntu 18.04 Docker で動く Jupyter にリモートの Windows から接続する

前回の記事で、Ubuntu 18.04 Docker に TensorFlow Docker を導入し、Docker 上で TensorFlow GPU が動作する環境を構築しました。
また Ubuntu 18.04 のホストから Docker 内の Jupyter サーバーにアクセスすることまでできました。

edosha.hatenablog.jp

これで十分に満足、、と思いきや、もう一つやりたいことがあります。
それはこの Ubuntu 18.04 Docker に、リモートの Windows から接続し、そこで操作をしたいのです。
なぜかというと、Keyhac というキーバインドを変更するツールで、全体的な操作を Emacs 風にできるようにしているのですが、これが Windows / Mac にしか対応していないからです。

sites.google.com

Ubuntu にもキーバインドを変更するツールはあるようなのですが、Emacs 風にするのに時間がかかりそうなので、今回はリモートの Windows からの操作を目指しました。

やり方

SSH ポートフォワーディングという機能を使います。
これは SSHUbuntu に接続し、Ubuntu のあるポートを Windowsマッピングするような機能です。
なので、まずは UbuntuWindows それぞれで SSH を使えるようにする必要があります。

SSH セットアップ

Ubuntu

セキュリティのことを考えたらいろいろやることはありますが、今回は LAN 内で動作させるだけなので、簡単にやりました。
行ったことは以下と同じです。

www.server-world.info

$ sudo apt -y install openssh-server
$ sudo nano /etc/ssh/sshd_config
# 32行目:no に変更してrootログイン一切禁止
PermitRootLogin no
$ sudo systemctl restart ssh

Windows

Windows 10 から、コマンドプロンプトPowerShellSSH コマンドが使えるようになったらしいです。

How to Enable and Use Windows 10’s New Built-in SSH Commandswww.howtogeek.com

参照先のサイトに従って、Windows の設定 -> アプリと機能 -> オプション機能 を開きます。
私の環境では、なぜかすでに Open SSH クライアント機能が追加されていました。

f:id:edosha:20200219091024p:plain
Windows OpenSSH Client

なければ「機能の追加」から追加できるようです。
機能追加後にコマンドプロンプトssh とうつと、以下のように表示されます。

f:id:edosha:20200219091129p:plain
SSH コマンドプロンプト

これで SSH 関連の準備は完了です。
さっそく以下のコマンドで Windows から Ubuntu に接続します。

$ ssh [User ID]@[Ubuntu IP Address]

[Ubuntu] Docker と Jupyter の起動

次に Ubuntu 側で Docker と Jupyter を起動します。
せっかくなので、さきほど接続した SSH クライアントで起動しました。
前回の記事 で使った tensorflow/tensorflow:2.0.0-gpu-py3-jupyter イメージを起動します。

$ docker run -it --gpus all --rm -p 8888:8888 tensorflow/tensorflow:2.0.0-gpu-py3-jupyter

f:id:edosha:20200219091704p:plain
Jupyter token

前回と同様に Jupyter が起動しました。
ここで最後に出てくる token=*** の部分をコピーしておきます。

ちなみに、Jupyter なしのイメージに自分で Jupyter を入れて起動する場合は、以下のように起動すれば良いようです。

$ jupyter notebook --ip 0.0.0.0 --port 8888 --allow-root --no-browser

こうすると同様に token の値が取れます。

[Windows] SSH ポートフォワーディング

次に Windows 側で、もうひとつコマンドプロンプトを起動します。
ここで行うのは SSH ポートフォワーディングです。
以下のようなコマンドを叩きます。

$ ssh -L 8888:localhost:8888 [User ID]@[Ubuntu IP Address]

これで Windowslocalhost:8888 が、Ubuntulocalhost:8888 にマッピングされました。

[Windows] Ubuntu Docker 上の Jupyter にアクセスする

Windows で Web ブラウザを開き、localhost:8888 にアクセスします。
すると以下のような Jupyter の画面が出ます。

f:id:edosha:20200221101658p:plain
Jupyter token 入力画面

ここで Password or token のところに、先程コピーした token=*** の値を入力します。
すると前回の記事と同様の Jupyter 画面が出ました。

f:id:edosha:20200218114341p:plain
Jupyter 画面

これで無事に Windows からリモートの Ubuntu Docker 上で動く Jupyter にアクセスできました。