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

リモート Docker ホストで開発する

リモートサーバー上にあるコンテナー内で Dev Containers 拡張機能を使用して開発したい場合があります。Docker は、ローカルファイルシステムをリモートの開発コンテナーにマウント (バインド) することをサポートしていません。そのため、ローカルソースコードを使用する Visual Studio Code のデフォルトの devcontainer.json の動作は機能しません。これはデフォルトの動作ですが、このセクションでは、リモートホストに接続して、Remote - SSH 拡張機能を使用してリモートホスト上のフォルダーをコンテナーで開いたり、実行中の任意のコンテナーにアタッチしたり、またはソケットを使用してリモート開発コンテナーを構成、作成、接続する方法としてローカルdevcontainer.json ファイルを使用したりできるようにする方法について説明します。

Remote - SSH 拡張機能を使用して接続する

Linux または macOS SSH ホストを使用している場合は、Remote - SSH と Dev Containers 拡張機能を組み合わせて使用できます。ローカルに Docker クライアントをインストールする必要さえありません。手順は次のとおりです。

  1. Remote - SSH 拡張機能のインストールと SSH ホストの設定手順に従ってください。
  2. オプション: パスワードを何度も入力する必要がないように、サーバーへの SSH キーベース認証を設定します。
  3. SSH ホストにDocker をインストールします。ローカルに Docker をインストールする必要はありません。
  4. Remote - SSH 拡張機能のクイックスタートに従って、ホストに接続し、そこでフォルダーを開きます。
  5. コマンドパレット (F1⇧⌘P (Windows、Linux Ctrl+Shift+P)) から Dev Containers: コンテナーで再度開く コマンドを使用します。

Dev Containers のクイックスタートの残りの部分はそのまま適用されます。Remote - SSH 拡張機能の詳細については、ドキュメントを参照してください

Remote - Tunnels 拡張機能を使用して接続する

Remote - Tunnels と Dev Containers 拡張機能を組み合わせて使用して、リモートホスト上のフォルダーをコンテナー内で開くことができます。ローカルに Docker クライアントをインストールする必要さえありません。これは上記の SSH ホストシナリオと似ていますが、代わりに Remote - Tunnels を使用します。手順は次のとおりです。

  1. Remote - Tunnels 拡張機能のはじめにの手順に従ってください。
  2. トンネルホストにDocker をインストールします。ローカルに Docker をインストールする必要はありません。
  3. Remote - Tunnels 拡張機能の手順に従って、トンネルホストに接続し、そこでフォルダーを開きます。
  4. コマンドパレット (F1⇧⌘P (Windows、Linux Ctrl+Shift+P)) から Dev Containers: コンテナーで再度開く コマンドを使用します。

Dev Containers のクイックスタートの残りの部分はそのまま適用されます。Remote - Tunnels 拡張機能の詳細については、ドキュメントを参照してください

Docker CLI を使用して接続する

このモデルに必要なのは、ローカルの Docker CLI が接続できるリモートホストで Docker Engine が実行されていることだけです。Remote - SSH および Remote - Tunnels 拡張機能を使用する方が簡単で、ローカルに Docker CLI をインストールする必要さえありませんが、このモデルは、コマンドラインから接続しているホストが既にある場合に役立ちます。このアプローチは、このリモートサーバー上で既に実行中のコンテナーにアタッチする場合にも役立ちます。

基本的なリモートの例

リモート Docker ホスト上のコンテナーにアタッチするように VS Code を設定するのは、Docker 拡張機能docker.environment プロパティを settings.json で設定し、VS Code を再起動 (またはウィンドウをリロード) するのと同じくらい簡単です。

例:

"docker.environment": {
    "DOCKER_HOST": "ssh://your-remote-user@your-remote-machine-fqdn-or-ip-here"
}

SSH を使用するには、サポートされている SSH クライアント、リモートホスト用に構成されたキーベース認証、およびキーがローカル SSH エージェントにインポートされていることが必要です。エージェントの構成とキーの追加の詳細については、Git での SSH キーの使用に関する記事を参照してください。

この時点で、リモートホスト上のコンテナーにアタッチできます。このセクションの後半で、設定と環境変数またはDocker コンテキストを使用して接続する方法の詳細について説明します。

devcontainer.json の場合、追加の手順が 1 つあります。構成済み (または自動構成済み) のバインドマウントを更新して、ローカルファイルシステムを指さなくなるようにする必要があります。

この設定には 2 つのバリエーションがあります。1 つ目は、最初にリモート開発コンテナーを作成し、次にソースコードを名前付きボリュームにクローンすることです。これにより、リモートホスト上のファイルシステムに直接アクセスする必要がなくなります。

この設定の基本的な devcontainer.json の例を次に示します。

{
  "image": "node", // Or "dockerFile"
  "workspaceFolder": "/workspace",
  "workspaceMount": "source=remote-workspace,target=/workspace,type=volume"
}

実際、コマンドパレット (F1) の Dev Containers: コンテナーボリュームにリポジトリをクローン... コマンドは、これと同じ手法を使用します。イメージまたは Dockerfile を参照する devcontainer.json ファイルが GitHub リポジトリに既にある場合、コマンドは自動的にバインドマウントの代わりに名前付きボリュームを使用します。これはリモートホストでも機能します。

2 番目のアプローチは、リモートマシン上のフォルダーをコンテナーにバインドマウントすることです。これにはリモートファイルシステムへのアクセスが必要ですが、リモートマシン上の既存のソースコードを操作することもできます。

上記の例の workspaceMount プロパティを更新して、代わりにこのモデルを使用してください。

"workspaceMount": "source=/absolute/path/on/remote/machine,target=/workspace,type=bind,consistency=cached"

どちらの場合でも、試してみるには、Dev Containers: コンテナーでフォルダーを開く... を実行し、.devcontainer.json ファイルが含まれているローカルフォルダーを選択します。

Docker Compose などの他のシナリオについては、既存または事前定義された devcontainer.json の変換を参照してください。

VS Code の設定またはローカル環境変数を使用して接続する

リモート Docker ホストが既に起動して実行されている場合は、ワークスペースまたはユーザーの settings.json で次のプロパティを使用してホストを指定できます。

SSH プロトコル

最近のバージョンの Docker (18.06 以降) では、リモート Docker ホストに接続するための SSH プロトコルのサポートが追加されました。これは、settings.json で 1 つのプロパティを設定するだけで使用できるため、簡単に構成できます。

まず、サポートされている SSH クライアントをインストールし、キーベース認証を構成してから、キーをローカル SSH エージェントにインポートします (これは多くの場合、Windows および Linux ではデフォルトで実行されていません)。エージェントの構成とキーの追加の詳細については、Git での SSH キーの使用に関する記事を参照してください。

次に、次のDocker 拡張機能docker.environment プロパティを settings.json に追加します (必要に応じて値を置き換えてください)。

"docker.environment": {
    "DOCKER_HOST": "ssh://your-remote-user@your-remote-machine-fqdn-or-ip-here"
}

VS Code を再起動 (またはウィンドウをリロード) すると、リモートホスト上の実行中の任意のコンテナーにアタッチできるようになります。また、特殊なローカル devcontainer.json ファイルを使用して、リモート開発コンテナーを作成/接続することもできます。

ヒント: これがうまくいかない場合でも、コマンドラインから SSH を使用してホストに接続できる場合は、認証キーを使用して SSH エージェントが実行されていることを確認してください。それでもすべて失敗する場合は、代わりにSSH トンネルをフォールバックとして使用できます。

TCP プロトコルの使用

SSH プロトコルには独自の組み込み認証メカニズムがありますが、TCP プロトコルを使用するには、多くの場合、settings.json で他のDocker 拡張機能のプロパティを設定する必要があります。それらは次のとおりです。

"docker.environment": {
    "DOCKER_HOST": "tcp://your-remote-machine-fqdn-or-ip-here:port",
    "DOCKER_CERT_PATH": "/optional/path/to/folder/with/certificate/files",
    "DOCKER_TLS_VERIFY": "1" // or "0"
}

SSH と同様に、設定を有効にするには、VS Code を再起動 (またはウィンドウをリロード) します。

settings.json の代わりに環境変数を使用する

settings.json を使用したくない場合は、代わりにターミナルで環境変数を設定できます。手順は次のとおりです。

  1. VS Code のすべてのインスタンスをシャットダウンします。
  2. VS Code がオペレーティングシステムの PATH に含まれていることを確認します。
  3. ターミナル/コマンドプロンプトで環境変数 (例: DOCKER_HOST) を設定します。
  4. 同じターミナル/コマンドプロンプトで code と入力して、設定された変数で VS Code を起動します。

Docker Contexts を使用して接続する

Docker Contexts を使用すると、さまざまなホストと対話できます。ホストごとにコンテキストを設定し、それらを切り替えることができます。

新しいコンテキストは docker context create で作成します。現在のコンテキストは docker context use <context> を使用して変更できます。

Docker 拡張機能には、docker.environment 設定が付属しており、DOCKER_HOSTDOCKER_CONTEXT などの環境変数を設定できます。これらは Dev Containers 拡張機能でも有効です。

注: 上記の設定は、Docker 拡張機能がインストールされている場合にのみ表示されます。Docker 拡張機能がない場合、Dev Containers は現在のコンテキストを使用します。

既存または事前定義された devcontainer.json を変換する

既存または事前定義されたローカルの devcontainer.json をリモートのものに変換するには、次の手順に従ってください。

  1. ファイルを変換するローカルフォルダーを VS Code で開きます (リモートフォルダーではありません)。

  2. devcontainer.json が含まれているフォルダーを選択しなかった場合は、コマンドパレット (F1) から Dev Containers: コンテナー構成ファイルを追加... を実行して、事前定義されたものを選択できます。

  3. ソースコードのマウントを変更するために、.devcontainer/devcontainer.json または .devcontainer.json が参照するものに基づいて、次の手順に従ってください。

    Dockerfile またはイメージ:

    リモートホストへのログインアクセス権がない場合は、ソースコードに Docker "ボリューム" を使用します。.devcontainer/devcontainer.json を次のように更新します (必要に応じて remote-workspace を一意のボリューム名に置き換えてください)。

    "workspaceMount": "source=remote-workspace,target=/workspace,type=volume"
    "workspaceFolder": "/workspace",
    

    ログインアクセス権がある場合は、代わりにリモートファイルシステムのバインドマウントを使用できます。

    "workspaceMount": "source=/absolute/path/on/remote/machine,target=/workspace,type=bind,consistency=cached"
    "workspaceFolder": "/workspace",
    

    workspaceMount プロパティは、別のシナリオを想定している場合、Docker CLI --mount フラグと同じ値をサポートしています。

    Docker Compose:

    リモートホストへのログインアクセス権がない場合は、docker-compose.yml を更新 (または拡張) します。your-service-name-heredevcontainer.json"service" プロパティに指定された値に置き換え、remote-workspace を一意のボリューム名に置き換えます。

    version: '3'
    services:
      your-service-name-here:
        volumes:
            - remote-workspace:/workspace
        # ...
    
    volumes:
      remote-workspace:
    

    ログインアクセス権がある場合は、代わりにリモートファイルシステムのバインドマウントを使用できます。

    version: '3'
    services:
      your-service-name-here:
        volumes:
          - /absolute/path/on/remote/machine:/workspace:cached
        # ...
    

    別のシナリオをサポートする必要がある場合は、volumes に関する Docker Compose ドキュメントを参照してください。

  4. コマンドパレット (F1) から Dev Containers: コンテナーで再度開く コマンドまたは Dev Containers: コンテナーを再構築 を実行します。

  5. バインドマウントの代わりにボリュームを使用した場合は、⌃⇧` (Windows、Linux Ctrl+Shift+`) を使用して、コンテナー内でターミナルを開きます。ここから git clone を実行してソースコードをプルダウンし、ファイル > 開く... / フォルダーを開く... を使用して、クローンされたリポジトリを開くことができます。

次回、同じコンテナーに接続する場合は、Dev Containers: コンテナーでフォルダーを開く... を実行し、VS Code ウィンドウで同じローカルフォルダーを選択します。

オプション: リモートのソースコードをローカルで利用できるようにする

ソースコードを Docker ボリューム内ではなく、リモートホストのファイルシステムに保存する場合は、ローカルでファイルにアクセスする方法がいくつかあります。

  1. SSHFS を使用してリモートファイルシステムをマウントする.
  2. rsync を使用してリモートホストからローカルマシンにファイルを同期する.
  3. mount コマンドを使用する ( Docker Machine を使用している場合)。

SSHFS または Docker Machine の mount コマンドを使用する方法は、より便利なオプションであり、ファイルの同期は必要ありません。ただし、パフォーマンスは VS Code を介して作業するよりも大幅に遅くなるため、単一ファイルの編集やコンテンツのアップロード/ダウンロードに最適です。多数のファイルを一度に大量に読み書きするアプリケーション (ローカルソース管理ツールなど) を使用する必要がある場合は、rsync の方が適しています。