SSH経由でリモートDockerに接続する
Dockerエンジンが動作しているリモートマシンに接続するには、Visual Studio CodeのRemote - SSH拡張機能の使用を推奨します。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.osxのargs
値を使って、またはスタートアップスクリプトを設定して、ターミナル起動時にこのコマンドを実行するように設定することをお勧めします。また、ログインごとに手動でこのコマンドを実行することもできます。
-
-
ssh-add -l
でIDがエージェントに利用可能であることを確認してください。2048 SHA256:abcdefghijk somethingsomething (RSA)
のようなIDが1つ以上リストされているはずです。IDがリストされていない場合は、接続できません。また、正しいIDである必要があります。Docker CLIが動作していれば、コンテナーエクスプローラーも動作するはずです。コンテナーエクスプローラーウィンドウはDocker CLIを使用し、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の両方がリモートマシンコンテキストを使用するようになります。
このコマンドがない場合は、Container Tools拡張機能がインストールされていることを確認してください。
-
containers.explorerRefreshInterval
設定を使用して、更新レートをデフォルトよりも長い値に変更することをお勧めします。SSH経由の接続は遅く、前回の更新が完了する前に再度更新を試みてしまう可能性があります。少なくとも3000 msを推奨します。
ヒント
-
Dockerエンドポイント文字列(
ssh://username@host:port
)の「host」部分は、グローバルに解決可能なDNSマシン名、またはIPアドレスである必要があります。Container Tools拡張機能は、SSH設定ファイルで定義されたホストエイリアスを使用できません。 -
リモートマシンのホストキーがすでにknown_hostsファイルに記憶されていることを確認してください。これを確実にする最も簡単な方法は、
ssh
クライアントプログラムを介してマシンに接続することです(コマンドラインからssh username@host:port
を実行します)。初回接続時に、ssh
プログラムはホストキーを表示し、承認を求め、known_hosts
ファイルを自動的に更新します。 -
Windows 10ビルド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ビルド1909以前は、Windows OSのアップデート後にSSHがIDを取得できなくなる問題の影響を受けます。回避策は、システム構成にダミーサービスエントリを追加することです。管理者PowerShellウィンドウから以下を実行します。
New-Service sshd -BinaryPathName "C:\Windows\System32\OpenSSH\ssh.exe"