VS Codeのエージェントモードを拡張するには、を試してください!

SSH経由でリモートDockerに接続する

Dockerエンジンが動作しているリモートマシンに接続するには、Visual Studio CodeのRemote - SSH拡張機能の使用を推奨します。Remote - SSHDev Containers拡張機能を一緒に使用できます。Dev Containersドキュメントの手順を確認してください。

また、SSHトンネリングを使用してリモートDockerエンジンに直接接続することも可能です。これについては以下で詳しく説明します。

SSHトンネリングのセットアップ

  1. ssh-keygenなどを使用して、SSH認証用の公開鍵/秘密鍵ペアを取得・設定します。パスワード認証はDockerでサポートされておらず、DOCKER_HOSTベースの構成では使用できません。鍵ペアがすでに設定されている場合は、それを使用できます。

  2. 上記の秘密鍵ファイルを使って、ローカルシステムで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値を使って、またはスタートアップスクリプトを設定して、ターミナル起動時にこのコマンドを実行するように設定することをお勧めします。また、ログインごとに手動でこのコマンドを実行することもできます。

  3. ssh-add -lでIDがエージェントに利用可能であることを確認してください。2048 SHA256:abcdefghijk somethingsomething (RSA)のようなIDが1つ以上リストされているはずです。IDがリストされていない場合は、接続できません。また、正しいIDである必要があります。Docker CLIが動作していれば、コンテナーエクスプローラーも動作するはずです。コンテナーエクスプローラーウィンドウはDocker CLIを使用し、Docker CLIはsshコマンドを使用するため、自動的に推測された構成の恩恵を受けます。

  4. Dockerが動作しているリモートマシンを指すDockerコンテキストを作成します。Dockerエンドポイントとしてssh://username@host:portを使用します("host"はリモートマシンの名前、またはリモートマシンのIPアドレスに置き換えてください)。ターミナルウィンドウから以下のコマンドを発行します

    docker context create my-remote-docker-machine --docker "host=ssh://username@host:port"
    

    たとえローカルユーザー名と同じであっても、Dockerエンドポイントアドレスには常にユーザー名を含めてください。ポートを省略すると、デフォルトは22になります。

  5. コマンドパレット⇧⌘P(Windows、Linux Ctrl+Shift+P)を使用して、Docker Contexts: Useコマンドを発行し、リモートマシンを指すDockerコンテキストをアクティブにします。このコマンドにより、VS CodeとDocker CLIの両方がリモートマシンコンテキストを使用するようになります。

    このコマンドがない場合は、Container Tools拡張機能がインストールされていることを確認してください。

  6. 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"