SSH経由でリモートDockerに接続する
Visual Studio CodeのRemote - SSH拡張機能を使用して、Dockerエンジンを実行しているリモートマシンに接続することをお勧めします。Remote - SSH拡張機能とDev Containers拡張機能を一緒に使用できます。手順については、Dev Containersのドキュメントを参照してください。
SSHトンネリングを使用してリモートDockerエンジンに直接接続することも可能です。詳細については以下をお読みください。
SSHトンネリングの設定
-
ssh-keygenなどを使用して、SSH認証用の公開鍵/秘密鍵ペアを取得して構成します。パスワード認証はDockerではサポートされておらず、
DOCKER_HOST
ベースの構成では使用できません。キーペアがすでに設定されている場合は、それを使用できます。 -
上記の秘密鍵ファイルを使用して、ローカルシステムで
ssh-agent
を構成します。-
Windows (OpenSSH): 最新バージョンのWindows 10には、デフォルトでOpenSSHが含まれています。Windowsサービスである
ssh-agent
はデフォルトで無効になっており、再有効化して自動起動に設定する必要があります。管理者PowerShellプロンプトから、Set-Service ssh-agent -StartupType "Automatic"
とStart-Service ssh-agent
を実行します。次に、ssh-add <keyfile>
を実行します。 -
Windows (Pageant): OpenSSHの代わりにPageantを使用することもできます。その場合、環境変数
SSH_AUTH_SOCK=pageant
を設定する必要があります。それをユーザーまたはシステム環境変数にすることが最も簡単です。 -
Linux:
ssh-agent
はデフォルトで存在します。ssh-add <keyfile>
を実行します。Ubuntuでテスト済みです。他のディストリビューションでは異なる結果になる可能性があります。 -
macOS:
ssh-agent
はデフォルトで存在しますが、ssh-add
はログインをまたいで永続化されません。ssh-add <keyfile>
を実行します。VS Codeを設定して、terminal.integrated.profiles.osxargs
の値を使用してターミナル起動時にこのコマンドを実行するか、起動スクリプトを構成することをお勧めします。また、ログインごとに手動でこのコマンドを実行することもできます。
-
-
ssh-add -l
を使用して、エージェントがあなたのIDを利用できることを確認してください。2048 SHA256:abcdefghijk somethingsomething (RSA)
のようなIDが1つ以上リストされるはずです。IDがリストされない場合は、接続できません。また、正しいIDである必要があります。Docker CLIが動作していても、エクスプローラーウィンドウが動作するとは限りません。エクスプローラーウィンドウはdockerode(さらにssh2を使用)を使用しますが、Docker CLIはssh
コマンドを使用し、自動的に推測される構成の恩恵を受けます。 -
Dockerを実行しているリモートマシンを指すDockerコンテキストを作成します。Dockerエンドポイントとして
ssh://username@host:port
を使用します(「host」はリモートマシン名またはリモートマシンIPアドレスに置き換えてください)。ターミナルウィンドウから次のコマンドを発行しますdocker context create my-remote-docker-machine --docker "host=ssh://username@host:port"
Dockerエンドポイントアドレスには、ローカルユーザー名と同じ場合でも、必ずユーザー名を含めてください。ポートを省略すると、デフォルトで22になります。
-
コマンドパレット(⇧⌘P (Windows、Linux Ctrl+Shift+P))を使用して、Docker Contexts: Useコマンドを発行し、リモートマシンを指すDockerコンテキストをアクティブにします。このコマンドにより、VS CodeとDocker CLIの両方がリモートマシンコンテキストを使用するようになります。
このコマンドがない場合は、Docker拡張機能がインストールされていることを確認してください。
-
docker.explorerRefreshInterval
設定を使用して、リフレッシュレートをデフォルトよりも長くすることをお勧めします。SSH経由の接続は遅く、前のリフレッシュが完了する前に再度リフレッシュしようとする可能性があります。少なくとも3000ミリ秒をお勧めします。
ヒント
-
Dockerエンドポイント文字列(
ssh://username@host:port
)の「host」部分は、グローバルに解決可能なDNSマシン名またはIPアドレスのいずれかである必要があります。Docker拡張機能は、SSH構成ファイルで定義されたホストエイリアスを使用できません。 -
リモートマシンのホストキーがknown_hostsファイルにすでに記憶されていることを確認してください。これを確実にする最も簡単な方法は、sshクライアントプログラムを介してマシンに接続することです(コマンドラインから
ssh username@host:port
を実行します)。初回接続時に、ssh
プログラムはホストキーを表示し、承認を求め、known_hosts
ファイルを自動的に更新します。 -
Windows 10 build 1909以前に付属している
ssh-keygen
ユーティリティには、新しいSSHデーモン(たとえば、Ubuntu 20.04 LTS以降に付属しているもの)で適切に動作しないという問題があります。回避策は、SSH接続にRSAタイプのキーではなく、ECDSAタイプのキーを使用することです。次のコマンドを使用して、ECDSA SSHキーを生成し、SSHエージェントに追加できますssh-keygen -t ecdsa -b 521 ssh-add id_ecdsa
-
Windows 10 build 1909以前は、Windows OSアップデート後にSSHがIDにアクセスできなくなるという問題の影響を受けます。回避策は、ダミーのサービスエントリをシステム構成に追加することです。管理者PowerShellウィンドウから以下を実行します
New-Service sshd -BinaryPathName "C:\Windows\System32\OpenSSH\ssh.exe"