Ubuntu 18.04 Docker で動く Jupyter にリモートの Windows から接続する
前回の記事で、Ubuntu 18.04 Docker に TensorFlow Docker を導入し、Docker 上で TensorFlow GPU が動作する環境を構築しました。
また Ubuntu 18.04 のホストから Docker 内の Jupyter サーバーにアクセスすることまでできました。
これで十分に満足、、と思いきや、もう一つやりたいことがあります。
それはこの Ubuntu 18.04 Docker に、リモートの Windows から接続し、そこで操作をしたいのです。
なぜかというと、Keyhac というキーバインドを変更するツールで、全体的な操作を Emacs 風にできるようにしているのですが、これが Windows / Mac にしか対応していないからです。
Ubuntu にもキーバインドを変更するツールはあるようなのですが、Emacs 風にするのに時間がかかりそうなので、今回はリモートの Windows からの操作を目指しました。
やり方
SSH ポートフォワーディングという機能を使います。
これは SSH で Ubuntu に接続し、Ubuntu のあるポートを Windows にマッピングするような機能です。
なので、まずは Ubuntu と Windows それぞれで SSH を使えるようにする必要があります。
SSH セットアップ
Ubuntu
セキュリティのことを考えたらいろいろやることはありますが、今回は LAN 内で動作させるだけなので、簡単にやりました。
行ったことは以下と同じです。
$ sudo apt -y install openssh-server $ sudo nano /etc/ssh/sshd_config # 32行目:no に変更してrootログイン一切禁止 PermitRootLogin no $ sudo systemctl restart ssh
Windows
Windows 10 から、コマンドプロンプトや PowerShell で SSH コマンドが使えるようになったらしいです。
How to Enable and Use Windows 10’s New Built-in SSH Commandswww.howtogeek.com
参照先のサイトに従って、Windows の設定 -> アプリと機能 -> オプション機能 を開きます。
私の環境では、なぜかすでに Open SSH クライアント機能が追加されていました。
なければ「機能の追加」から追加できるようです。
機能追加後にコマンドプロンプトで 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
前回と同様に 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]
これで Windows の localhost:8888 が、Ubuntu の localhost:8888 にマッピングされました。