リモートマシンのdocker環境にアクセスしたい
背景
ssh接続でリモートのjupyter serverに接続したかったが、ポート番号の関係性がわからず、四苦八苦してたら2週間くらい接続に時間がかかった。
一応過去に挑戦してメモしたはずだが、苦戦したのと、どこに書いたか忘れたので備忘録としてここに記載する。
やること
ローカルPCからリモートPCの仮想環境(jupyter notebook)にwebブラウザからアクセスする。
使用しているPCのOSはどちらもwindows。リモートPCの仮想環境はWSL2でdockerを起動したものとする。(図ではWSL2は省略している)
なおリモートPCのssh接続(ファイアウォール・sshキーの作成など)の設定や、wslのユーザー設定や環境構築などは省略する。
概要
以下条件の場合、以下の設定で動いた
- (ローカルPC)webブラウザでのアクセス先: localhost:10000
- リモートPCの受信ポート番号: 11111
- リモートPCから仮想環境のアクセス先: localhost:9999
- 仮想環境の受信ポート番号: 8888
図にするとこんな↓感じ
-
リモートPCからWSL2のポートフォワーディング設定
-
ssh接続の設定
sshconfigの場合
Host remote-connect
HostName リモートPCのIPアドレス
User ログイン先のユーザー名
Port 11111
LocalForward 10000 localhost:9999
IdentityFile sshキーのフォルダのディレクトリ
ssh remote-connect
コマンドの場合
ssh -i sshキーのフォルダのディレクトリ -p 11111 -L 10000:localhost:9999 ログイン先のユーザー名@リモートPCのIPアドレス
- dockerの設定
docker-compose.yamlの設定
services:
kaggle-env:
image: dockerイメージ
container_name: コンテナ名
ports:
- "9999:8888"
volumes:
- ボリューム
command: >
jupyter notebook --port=8888 --ip=0.0.0.0 --allow-root --NotebookApp.token=''
上記の設定で接続がうまくいった
解説(主に自分のための)
(ローカルPC)webブラウザでのアクセス先: localhost:10000
まずなぜアクセス先がlocalhost:10000である必要があるのか。
google colaboratoryを使うのであればhttps://colab.research.google.com/ と入力すれば分析環境にアクセスできる。しかしこれはgoogleがcolab用にドメインを公開しているためである。
個人で分析環境(ここではjupyter server)を作成する場合、わざわざ公開ドメインを取得する必要も公開する必要もない。代わりの手段として自身のPC(localhost)にサーバーを立ててアクセスする方法がある。その中でどこにサーバーを立てるかのポート番号を指定する必要がある。
その中からここでは例としてポート番号10000※を指定する。
これを組み合わせると、localhost:10000がアクセス先となる。
anacondaをインストールする時に使用するjupyter notebookアプリケーションでは、このような指定作業はアプリケーションで自動的に行ってくれる。(なので1台のPCだけで行う分には気にする必要はない)
しかし今回はリモートPC上のjupyter serverに接続を行うため、リモートPC上でサーバーを作成する。
だがローカルのwebブラウザからリモートに接続する際には、ローカルPCでlocalhost:10000のように設定する必要がある。なぜこれが必要なのかというと、ローカルPCとリモートPCのJupyter Serverを紐づけるため。
(同じネットワーク内なら直接リモートのIPアドレスとポート番号を入力してアクセスするのが楽ではある。ここではssh接続を前提とする。)
※ localhostは自身のコンピュータ、ポート番号はウェルノウンポート以外であれば任意に指定できるが、不安であれば自由に設定できるポート番号49152~65535を設定する良い。
リモートPCの受信ポート番号: 11111
次にローカルPCからリモートPCのアクセスが必要。
リモートPCがssh接続を受信するためのポート番号の指定が必要。
ここの例では11111を利用。
リモートPCにアクセスするのに、11111のポート番号が必要なのに、なぜリモートPCの仮想環境にアクセスするときには、このポート番号が不要なのか。
これはssh接続の設定が関係する。
リモートPCから仮想環境のアクセス先: localhost:9999
ここではリモートPCに直接サーバーを作成せず、リモートPCの仮想環境にサーバーを作成する。
このため、リモートPCから「リモートPC上の仮想環境」のアクセスが必要。
リモートPCから「リモートPC上の仮想環境」に接続するには、リモートPCでどのポート番号を使って仮想環境にアクセスするかを指定する必要がある。
つまり、リモートPCのlocalhostのどのポート番号で仮想環境にアクセスするかを指定する必要がある。(ここでは9999を指定)
つまりlocalhost:9999となる。
仮想環境の受信ポート番号: 8888
最後に仮想環境の受信ポート番号を指定する。ここではjupyter serverのデフォルト(8888)を使用。
仮想環境のポート番号を指定するので、ポート番号の指定はdockerのコマンドで行う。ここではdocker-compose.yamlを使用している。デフォルトではポート番号の指定をする必要はないが、ここでは明示的に8888を指定している。
まとめ
ポート番号の関係性についてメモした。以下のポート番号を整理すれば混乱することは回避できるかも。
- リモートPCに接続するためのポート番号
- ここでは11111
- ローカルPC内のプログラム・サーバーにアクセスするための、localhost:ポート番号
- ここではlocalhost:10000とlocalhost:9999
- 転送するためのポート番号
- ここでは
LocalForward 10000 localhost:9999
9999:8888
- ここでは
Discussion