リモートの Docker ホストで開発する
リモートサーバー上のコンテナ内で開発するために、Dev Containers拡張機能を使用したい場合があります。Dockerはローカルファイルシステムをリモート開発コンテナにマウント(バインド)することをサポートしていないため、Visual Studio Codeのデフォルトのdevcontainer.json動作であるローカルソースコードを使用する方法は機能しません。これがデフォルトの動作ですが、このセクションでは、リモートホストに接続して、Remote - SSH拡張機能を使用してリモートホスト上のフォルダーをコンテナで開くか、実行中のコンテナにアタッチするか、またはローカルdevcontainer.jsonファイルをソケットを使用してリモート開発コンテナを設定、作成、接続する方法として使用する方法について説明します。
Remote - SSH拡張機能を使用して接続する
LinuxまたはmacOSのSSHホストを使用している場合、Remote - SSHとDev Containers拡張機能を一緒に使用できます。ローカルにDockerクライアントをインストールする必要さえありません。そのためには
- Remote - SSH拡張機能のインストールとSSH ホスト設定の手順に従ってください。
- オプション: パスワードを何度も入力する必要がないように、サーバーへのSSHキーベース認証を設定します。
- SSHホストにDockerをインストールします。ローカルにDockerをインストールする必要はありません。
- Remote - SSH拡張機能のクイックスタートに従ってホストに接続し、そこにフォルダーを開きます。
- コマンドパレット (F1, ⇧⌘P (Windows、Linux Ctrl+Shift+P)) から Dev Containers: Reopen in Container コマンドを使用します。
Dev Containersのクイックスタートの残りの部分はそのまま適用されます。Remote - SSH拡張機能の詳細については、そのドキュメントを参照してください。
Remote - Tunnels拡張機能を使用して接続する
Remote - TunnelsとDev Containers拡張機能を一緒に使用して、リモートホスト上のフォルダーをコンテナ内で開くことができます。ローカルにDockerクライアントをインストールする必要さえありません。これは上記のSSHホストのシナリオと似ていますが、代わりにRemote - Tunnelsを使用します。そのためには
- Remote - Tunnels拡張機能のはじめにの手順に従ってください。
- トンネルホストにDockerをインストールします。ローカルにDockerをインストールする必要はありません。
- Remote - Tunnels拡張機能の手順に従ってトンネルホストに接続し、そこにフォルダーを開きます。
- コマンドパレット (F1, ⇧⌘P (Windows、Linux Ctrl+Shift+P)) から Dev Containers: Reopen in Container コマンドを使用します。
Dev Containersのクイックスタートの残りの部分はそのまま適用されます。Remote - Tunnels拡張機能の詳細については、そのドキュメントを参照してください。
Docker CLIを使用して接続する
このモデルでは、ローカルのDocker CLIが接続できるリモートホスト上でDocker Engineが実行されていることだけが必要です。Remote - SSHおよびRemote - Tunnels拡張機能を使用する方が簡単で、Docker CLIをローカルにインストールする必要さえありませんが、このモデルは、コマンドラインからすでに接続しているホストがある場合に役立ちます。このアプローチは、このリモートサーバー上で既に実行中のコンテナにアタッチしようとしている場合にも役立ちます。
基本的なリモートの例
リモートDockerホスト上のコンテナにアタッチするようにVS Codeを設定することは、Container Tools拡張機能のsettings.jsonのcontainers.environmentプロパティを設定し、VS Codeを再起動(またはウィンドウをリロード)するだけで簡単に行えます。
例
"containers.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: Clone Repository in Container Volume...コマンドは、この同じ手法を使用します。GitHubリポジトリにイメージまたはDockerfileを参照するdevcontainer.jsonファイルがすでにある場合、このコマンドはバインドマウントの代わりに自動的に名前付きボリュームを使用します。これはリモートホストでも機能します。
2つ目のアプローチは、リモートマシン上のフォルダーをコンテナにバインドマウントする方法です。これにより、リモートファイルシステムにアクセスする必要がありますが、リモートマシン上の既存のソースコードを操作することもできます。
このモデルを使用するために、上記の例のworkspaceMountプロパティを更新します。
"workspaceMount": "source=/absolute/path/on/remote/machine,target=/workspace,type=bind,consistency=cached"
どちらの場合も、試すにはDev Containers: Open Folder in Container...を実行し、.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キーの使用に関する記事を参照してください。
次に、以下のContainer Tools拡張機能のcontainers.environmentプロパティをsettings.jsonに追加します(必要に応じて値を置き換えます)。
"containers.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で他のContainer Tools拡張機能のプロパティを設定する必要があることがよくあります。これらは次のとおりです。
"containers.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を使用しない場合は、代わりにターミナルで環境変数を設定できます。手順は次のとおりです。
- VS Codeのすべてのインスタンスをシャットダウンします。
- VS CodeがオペレーティングシステムのPATHにあることを確認します。
- ターミナル/コマンドプロンプトで環境変数(例:DOCKER_HOST)を設定します。
- 同じターミナル/コマンドプロンプトでcodeと入力し、変数が設定された状態でVS Codeを起動します。
Dockerコンテキストを使用して接続する
Dockerコンテキストを使用すると、異なるホストと対話できます。各ホストのコンテキストを設定し、それらを切り替えることができます。
docker context createで新しいコンテキストを作成します。現在のコンテキストはdocker context use <context>で変更できます。
Container Tools拡張機能には、DOCKER_HOSTやDOCKER_CONTEXTなどの環境変数を設定できるcontainers.environment設定が付属しており、Dev Containers拡張機能もこれを尊重します。
注: 上記の設定は、Container Tools拡張機能がインストールされている場合にのみ表示されます。Container Tools拡張機能がない場合、Dev Containersは現在のコンテキストを使用します。
既存または事前定義されたdevcontainer.jsonの変換
既存または事前定義されたローカルのdevcontainer.jsonをリモートのものに変換するには、次の手順に従ってください。
- 
VS Codeで、ファイルを変換したいローカルフォルダー(リモートではない)を開きます。 
- 
devcontainer.jsonを含むフォルダーを選択しなかった場合は、コマンドパレット(F1)からDev Containers: Add Container Configuration File...を実行して、事前定義されたものを選択できます。
- 
ソースコードマウントを変更するために、 .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-hereをdevcontainer.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 # ...異なるシナリオをサポートする必要がある場合は、Docker Composeの volumesに関するドキュメントを参照してください。
- 
コマンドパレット(F1)からDev Containers: Reopen in ContainerコマンドまたはDev Containers: Rebuild Containerを実行します。 
- 
バインドマウントの代わりにボリュームを使用した場合は、⌃⇧`(Windows、Linux Ctrl+Shift+`)を使用してコンテナ内にターミナルを開きます。ここから git cloneを実行してソースコードをプルダウンし、ファイル > 開く... / フォルダーを開く...を使用してクローンしたリポジトリを開くことができます。
次回、この同じコンテナに接続したいときは、Dev Containers: Open Folder in Container...を実行し、VS Codeウィンドウで同じローカルフォルダーを選択します。
オプション: リモートソースコードをローカルで利用可能にする
ソースコードをDockerボリューム内ではなくリモートホストのファイルシステムに保存する場合、ファイルをローカルでアクセスする方法がいくつかあります。
- SSHFSを使用してリモートファイルシステムをマウントする.
- rsyncを使用してリモートホストからローカルマシンにファイルを同期する.
- Docker Machineを使用している場合は、mountコマンドを使用します。
SSHFSまたはDocker Machineのmountコマンドを使用する方が便利なオプションであり、ファイルの同期は必要ありません。ただし、パフォーマンスはVS Codeを介して作業するよりも著しく遅くなるため、単一ファイルの編集やコンテンツのアップロード/ダウンロードに最適です。一度に多くのファイルに大量に読み書きするアプリケーション(ローカルソース管理ツールなど)を使用する必要がある場合は、rsyncの方が良い選択です。