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

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

  1. Remote - Tunnels拡張機能の入門(Getting Started)の手順に従います。
  2. トンネルホストにDockerをインストールします。ローカルにDockerをインストールする必要はありません。
  3. Remote - Tunnels拡張機能の手順に従ってトンネルホストに接続し、そこにあるフォルダーを開きます。
  4. コマンドパレット (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を設定するのは、settings.jsonContainer Tools拡張機能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つ目は、最初にリモートのdevコンテナーを作成し、その後で名前付きボリュームにソースコードをクローンする方法です。これは、リモートホスト上のファイルシステムに直接アクセスする必要がないためです。

これは、この設定の基本的な devcontainer.json の例です

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

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

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 ファイルを使用して、リモートのdevコンテナーを作成/接続することもできます。

ヒント: これが機能しないにもかかわらず、コマンドラインから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を使用しない場合は、代わりにターミナルで環境変数を設定できます。その手順は以下のとおりです。

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

Dockerコンテキストを使用して接続する

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

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

Container Tools拡張機能には、DOCKER_HOSTDOCKER_CONTEXTなどの環境変数を設定できる containers.environment 設定が付属しており、これらはDev Containers拡張機能でも尊重されます。

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

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

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

  1. ファイルを変換したい場所のローカルフォルダーをVS Codeで開きます(リモートではなく)。

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

  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: Reopen in Container(コンテナーで再度開く)またはDev Containers: Rebuild Container(コンテナーをリビルド)コマンドを実行します。

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

次回この同じコンテナーに接続したいときは、Dev Containers: Open Folder in Container...を実行し、VS Codeウィンドウで同じローカルフォルダーを選択します。

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

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

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

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

© . This website operates independently and is not affiliated with or endorsed by Microsoft. All brand names, logos, and trademarks are the property of their respective owners.