リモート 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: コンテナーで再度開く コマンドを使用します。
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: コンテナーで再度開く コマンドを使用します。
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
を使用したくない場合は、代わりにターミナルで環境変数を設定できます。手順は次のとおりです。
- VS Code のすべてのインスタンスをシャットダウンします。
- VS Code がオペレーティングシステムの
PATH
に含まれていることを確認します。 - ターミナル/コマンドプロンプトで環境変数 (例:
DOCKER_HOST
) を設定します。 - 同じターミナル/コマンドプロンプトで
code
と入力して、設定された変数で VS Code を起動します。
Docker Contexts を使用して接続する
Docker Contexts を使用すると、さまざまなホストと対話できます。ホストごとにコンテキストを設定し、それらを切り替えることができます。
新しいコンテキストは docker context create
で作成します。現在のコンテキストは docker context use <context>
を使用して変更できます。
Docker 拡張機能には、docker.environment
設定が付属しており、DOCKER_HOST
や DOCKER_CONTEXT
などの環境変数を設定できます。これらは Dev Containers 拡張機能でも有効です。
注: 上記の設定は、Docker 拡張機能がインストールされている場合にのみ表示されます。Docker 拡張機能がない場合、Dev Containers は現在のコンテキストを使用します。
既存または事前定義された devcontainer.json を変換する
既存または事前定義されたローカルの devcontainer.json
をリモートのものに変換するには、次の手順に従ってください。
-
ファイルを変換するローカルフォルダーを VS Code で開きます (リモートフォルダーではありません)。
-
devcontainer.json
が含まれているフォルダーを選択しなかった場合は、コマンドパレット (F1) から Dev Containers: コンテナー構成ファイルを追加... を実行して、事前定義されたものを選択できます。 -
ソースコードのマウントを変更するために、
.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 # ...
別のシナリオをサポートする必要がある場合は、
volumes
に関する Docker Compose ドキュメントを参照してください。 -
コマンドパレット (F1) から Dev Containers: コンテナーで再度開く コマンドまたは Dev Containers: コンテナーを再構築 を実行します。
-
バインドマウントの代わりにボリュームを使用した場合は、⌃⇧` (Windows、Linux Ctrl+Shift+`) を使用して、コンテナー内でターミナルを開きます。ここから
git clone
を実行してソースコードをプルダウンし、ファイル > 開く... / フォルダーを開く... を使用して、クローンされたリポジトリを開くことができます。
次回、同じコンテナーに接続する場合は、Dev Containers: コンテナーでフォルダーを開く... を実行し、VS Code ウィンドウで同じローカルフォルダーを選択します。
オプション: リモートのソースコードをローカルで利用できるようにする
ソースコードを Docker ボリューム内ではなく、リモートホストのファイルシステムに保存する場合は、ローカルでファイルにアクセスする方法がいくつかあります。
- SSHFS を使用してリモートファイルシステムをマウントする.
rsync
を使用してリモートホストからローカルマシンにファイルを同期する.- mount コマンドを使用する ( Docker Machine を使用している場合)。
SSHFS または Docker Machine の mount コマンドを使用する方法は、より便利なオプションであり、ファイルの同期は必要ありません。ただし、パフォーマンスは VS Code を介して作業するよりも大幅に遅くなるため、単一ファイルの編集やコンテンツのアップロード/ダウンロードに最適です。多数のファイルを一度に大量に読み書きするアプリケーション (ローカルソース管理ツールなど) を使用する必要がある場合は、rsync の方が適しています。