リモートの 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拡張機能のGetting Startedの指示に従います。
- トンネルホストに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拡張機能のcontainers.environment
プロパティをsettings.json
で設定し、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 Contextsを使用すると、異なるホストと対話できます。各ホストのコンテキストを設定し、それらを切り替えることができます。
新しいコンテキストはdocker context create
で作成します。現在のコンテキストはdocker context use <context>
で変更できます。
Container Tools拡張機能には、containers.environment
設定があり、DOCKER_HOST
やDOCKER_CONTEXT
などの環境変数を設定でき、これらは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
を更新(または拡張)します。devcontainer.json
の"service"
プロパティで指定された値をyour-service-name-here
に、一意のボリューム名を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の方が良い選択肢です。