在遠端 Docker 主機上開發
有時您可能想使用開發容器擴充套件在位於遠端伺服器上的容器中進行開發。Docker 不支援將您的本地檔案系統掛載(繫結)到遠端開發容器中,因此 Visual Studio Code 預設的 devcontainer.json
行為(使用您的本地原始碼)將無法工作。雖然這是預設行為,但本節將介紹如何連線到遠端主機,以便您可以使用 Remote - SSH 擴充套件在容器中開啟遠端主機上的資料夾、附加到任何正在執行的容器,或者使用本地 devcontainer.json
檔案作為配置、建立和連線到使用套接字的遠端開發容器的方式。
使用 Remote - SSH 擴充套件連線
如果您使用的是 Linux 或 macOS SSH 主機,您可以將 Remote - SSH 和開發容器擴充套件一起使用。您甚至不需要在本地安裝 Docker 客戶端。具體操作如下:
- 按照 Remote - SSH 擴充套件的安裝和 SSH 主機設定步驟進行操作。
- 可選: 設定 SSH 基於金鑰的身份驗證到伺服器,這樣你就不需要多次輸入密碼。
- 在您的 SSH 主機上安裝 Docker。您不需要在本地安裝 Docker。
- 按照 Remote - SSH 擴充套件的快速入門連線到主機並在那裡開啟一個資料夾。
- 從命令面板(F1,⇧⌘P (Windows, Linux Ctrl+Shift+P))使用 開發容器:在容器中重新開啟 命令。
其餘的開發容器快速入門照常適用。您可以在Remote - SSH 擴充套件的文件中瞭解更多資訊。
使用 Remote - Tunnels 擴充套件連線
您可以將 Remote - Tunnels 和開發容器擴充套件一起使用,在容器中開啟遠端主機上的資料夾。您甚至不需要在本地安裝 Docker 客戶端。這與上面的 SSH 主機場景類似,但使用的是 Remote - Tunnels。具體操作如下:
- 按照 Remote - Tunnels 擴充套件的入門說明進行操作。
- 在您的隧道主機上安裝 Docker。您不需要在本地安裝 Docker。
- 按照 Remote - Tunnels 擴充套件的步驟連線到隧道主機並在那裡開啟一個資料夾。
- 從命令面板(F1,⇧⌘P (Windows, Linux Ctrl+Shift+P))使用 開發容器:在容器中重新開啟 命令。
其餘的開發容器快速入門照常適用。您可以在Remote - Tunnels 擴充套件的文件中瞭解更多資訊。
使用 Docker CLI 連線
此模型只要求在遠端主機上執行 Docker Engine,並且您的本地 Docker CLI 可以連線到該引擎。雖然使用 Remote - SSH 和 Remote - Tunnels 擴充套件更容易,並且甚至不需要在本地安裝 Docker CLI,但此模型對於您已經透過命令列連線到主機的場景很有用。如果您希望附加到此遠端伺服器上已執行的容器,此方法也很有用。
一個基本的遠端示例
設定 VS Code 以附加到遠端 Docker 主機上的容器,可以像設定 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 代理中。有關配置代理和新增金鑰的詳細資訊,請參閱將 SSH 金鑰與 Git 結合使用一文。
此時,您可以附加到遠端主機上的容器。我們將在本節稍後介紹有關如何使用設定和環境變數或Docker 上下文進行連線的更多資訊。
對於 devcontainer.json
,還有額外一步:您需要更新任何已配置(或自動配置)的繫結掛載,使其不再指向本地檔案系統。
此設定有兩種變體。第一種是首先建立您的遠端開發容器,然後將原始碼克隆到命名卷中,因為這不需要您直接訪問遠端主機上的檔案系統。
這是一個此設定的簡單 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 的 GitHub 倉庫中已經有一個 devcontainer.json
檔案,該命令將自動使用命名卷而不是繫結掛載——這對於遠端主機也有效。
第二種方法是將遠端機器上的資料夾繫結掛載到您的容器中。這需要您訪問遠端檔案系統,但也允許您處理遠端機器上現有原始碼。
更新上面示例中的 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+)已新增對 SSH 協議的支援,以連線到遠端 Docker 主機。這很容易配置,您只需在 settings.json
中設定一個屬性即可使用它。
首先,安裝一個支援的 SSH 客戶端,配置基於金鑰的身份驗證),然後將金鑰匯入到您的本地 SSH 代理中(在 Windows 和 Linux 上,它通常預設不執行)。有關配置代理和新增金鑰的詳細資訊,請參閱將 SSH 金鑰與 Git 結合使用一文。
然後,將以下 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 Contexts 連線
Docker 上下文允許您與不同的主機進行互動 - 您可以為每個主機設定上下文並在它們之間切換。
您可以使用 docker context create
建立新上下文。可以使用 docker context use <context>
更改當前上下文。
Container Tools 擴充套件附帶 containers.environment
設定,其中可以設定 DOCKER_HOST
或 DOCKER_CONTEXT
等環境變數,這些變數也會被開發容器擴充套件遵守。
注意: 上述設定僅在安裝了 Container Tools 擴充套件時可見。如果沒有 Container Tools 擴充套件,開發容器將使用當前上下文。
轉換現有或預定義的 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 或 Docker Machine 的 mount 命令是更方便的選項,不需要任何檔案同步。但是,效能會比透過 VS Code 工作慢得多,因此它們最適合用於單檔案編輯以及上傳/下載內容。如果您需要使用一次性批次讀寫大量檔案的應用程式(如本地原始碼控制工具),rsync 是一個更好的選擇。