🌐

リモートマシンのdocker環境にアクセスしたい

2024/11/23に公開

背景

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