🚀 VS Codeでで入手しましょう!

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

Visual Studio CodeのRemote - SSH拡張機能を使用して、Dockerエンジンを実行しているリモートマシンに接続することをお勧めします。Remote - SSH拡張機能とDev 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.osx argsの値を使用してターミナル起動時にこのコマンドを実行するか、起動スクリプトを構成することをお勧めします。また、ログインごとに手動でこのコマンドを実行することもできます。

  3. ssh-add -lを使用して、エージェントがあなたのIDを利用できることを確認してください。2048 SHA256:abcdefghijk somethingsomething (RSA)のようなIDが1つ以上リストされるはずです。IDがリストされない場合は、接続できません。また、正しいIDである必要があります。Docker CLIが動作していても、エクスプローラーウィンドウが動作するとは限りません。エクスプローラーウィンドウはdockerode(さらにssh2を使用)を使用しますが、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の両方がリモートマシンコンテキストを使用するようになります。

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

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