在遠端 Docker 主機上開發
有時您可能想要使用 Dev Containers 擴充功能在遠端伺服器上的容器內開發。Docker不支援將本機檔案系統掛載(繫結)到遠端開發容器中,因此 Visual Studio Code 預設的 devcontainer.json
行為(使用本機原始碼)將無法運作。雖然這是預設行為,但在本節中,我們將介紹如何連線到遠端主機,以便您可以使用 Remote - SSH 擴充功能在容器中開啟遠端主機上的資料夾、附加到任何正在執行的容器,或使用本機 devcontainer.json
檔案作為一種方式,透過 socket 設定、建立和連線到遠端開發容器。
使用 Remote - SSH 擴充功能連線
如果您使用 Linux 或 macOS SSH 主機,您可以將 Remote - SSH 和 Dev Containers 擴充功能一起使用。您甚至不需要在本機安裝 Docker 用戶端。若要執行此操作
- 依照 Remote - SSH 擴充功能的安裝和 SSH 主機設定步驟進行。
- 選用:設定 SSH 金鑰式驗證到伺服器,這樣您就不需要多次輸入密碼。
- 在您的 SSH 主機上安裝 Docker。您不需要在本機安裝 Docker。
- 依照 Remote - SSH 擴充功能的快速入門連線到主機並在那裡開啟資料夾。
- 從命令選 palette (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 擴充功能的步驟連線到通道主機並在那裡開啟資料夾。
- 從命令選 palette (F1, ⇧⌘P (Windows, Linux Ctrl+Shift+P)) 使用 Dev Containers: 重新在容器中開啟 命令。
Dev Containers 快速入門的其餘部分照常適用。您可以從其文件中瞭解更多關於 Remote - Tunnels 擴充功能的資訊。
使用 Docker CLI 連線
此模型僅要求遠端主機上執行 Docker Engine,而本機 Docker CLI 可以連線到該主機。雖然使用 Remote - SSH 和 Remote - Tunnels 擴充功能更簡單,甚至不需要在本機安裝 Docker CLI,但如果您已經有從命令列連線到的主機,此模型可能會很有用。如果您希望附加到此遠端伺服器上已在執行的容器,此方法也很有用。
基本遠端範例
設定 VS Code 以附加到遠端 Docker 主機上的容器,可以像在 settings.json
中設定 Docker 擴充功能 docker.environment
屬性並重新啟動 VS Code (或重新載入視窗) 一樣簡單。
例如
"docker.environment": {
"DOCKER_HOST": "ssh://your-remote-user@your-remote-machine-fqdn-or-ip-here"
}
使用 SSH 需要支援的 SSH 用戶端、您已為遠端主機設定金鑰式驗證,以及金鑰已匯入到您的本機 SSH 代理程式。請參閱關於將 SSH 金鑰與 Git 搭配使用的文章,以瞭解有關設定代理程式和新增金鑰的詳細資訊。
此時,您可以附加到遠端主機上的容器。我們稍後將在本節中更詳細地介紹如何使用設定和環境變數或Docker contexts連線。
對於 devcontainer.json
,還有一個額外的步驟:您需要更新任何已設定 (或自動設定) 的繫結掛載,使其不再指向本機檔案系統。
此設定有兩種變體。第一種是先建立遠端開發容器,然後將原始碼複製到具名磁碟區,因為這不需要您直接存取遠端主機上的檔案系統。
以下是此設定的基本 devcontainer.json
範例
{
"image": "node", // Or "dockerFile"
"workspaceFolder": "/workspace",
"workspaceMount": "source=remote-workspace,target=/workspace,type=volume"
}
事實上,命令選 palette (F1) 中的 Dev Containers: 在容器磁碟區中複製儲存庫... 命令使用了相同的技術。如果您在 GitHub 儲存庫中已經有一個 devcontainer.json
檔案,其中參考了映像或 Dockerfile,則該命令將自動使用具名磁碟區而不是繫結掛載 - 這也適用於遠端主機。
第二種方法是將遠端機器上的資料夾繫結掛載到您的容器中。這需要您存取遠端檔案系統,但也允許您使用遠端機器上的現有原始碼。
更新上述範例中的 workspaceMount
屬性以改用此模型
"workspaceMount": "source=/absolute/path/on/remote/machine,target=/workspace,type=bind,consistency=cached"
在這兩種情況下,若要試用,請執行 Dev Containers: 在容器中開啟資料夾...,然後選取包含 .devcontainer.json
檔案的本機資料夾。
請參閱轉換現有或預先定義的 devcontainer.json,以瞭解其他情境,例如 Docker Compose。
使用 VS Code 設定或本機環境變數連線
如果您已經有一個遠端 Docker 主機正在運作,您可以使用工作區或使用者 settings.json
中的以下屬性來指定主機。
SSH 協定
Docker 的最新版本 (18.06+) 已新增對 SSH 協定的支援,以連線到遠端 Docker 主機。這很容易設定,因為您只需要在 settings.json
中設定一個屬性即可使用它。
首先,安裝支援的 SSH 用戶端,設定金鑰式驗證),然後將您的金鑰匯入到您的本機 SSH 代理程式 (這通常在 Windows 和 Linux 上預設未執行)。請參閱關於將 SSH 金鑰與 Git 搭配使用的文章,以瞭解有關設定代理程式和新增金鑰的詳細資訊。
然後,將以下 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 允許您與不同的主機互動 - 您可以為每個主機設定 contexts 並在它們之間切換。
您可以使用 docker context create
建立新的 contexts。可以使用 docker context use <context>
變更目前的 context。
Docker 擴充功能 隨附 docker.environment
設定,您可以在其中設定環境變數 (如 DOCKER_HOST
或 DOCKER_CONTEXT
),這些變數也會被 Dev Containers 擴充功能採用。
注意:上述設定僅在安裝 Docker 擴充功能時可見。如果沒有 Docker 擴充功能,Dev Containers 將使用目前的 context。
轉換現有或預先定義的 devcontainer.json
若要將現有或預先定義的本機 devcontainer.json
轉換為遠端的,請依照下列步驟進行
-
在 VS Code 中開啟本機資料夾 (非遠端資料夾),您要在其中轉換檔案。
-
如果您未選取包含
devcontainer.json
的資料夾,您可以從命令選 palette (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
和適當的remote-workspace
中為"service"
屬性指定的值,並替換為唯一的磁碟區名稱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 文件。 -
從命令選 palette (F1) 執行 Dev Containers: 重新在容器中開啟 命令或 Dev Containers: 重建容器。
-
如果您使用磁碟區而不是繫結掛載,請使用 ⌃⇧` (Windows, Linux Ctrl+Shift+`) 開啟容器內的終端機。您可以從這裡執行
git clone
以提取您的原始碼,並使用 檔案 > 開啟... / 開啟資料夾... 開啟複製的儲存庫。
下次您想要連線到同一個容器時,請執行 Dev Containers: 在容器中開啟資料夾...,並在 VS Code 視窗中選取相同的本機資料夾。
選用:在本機提供遠端原始碼
如果您的原始碼儲存在遠端主機的檔案系統上而不是 Docker 磁碟區內,則有幾種方法可以從本機存取檔案
使用 SSHFS 或 Docker Machine 的 mount 命令是更方便的選項,不需要任何檔案同步。但是,效能將明顯低於透過 VS Code 工作,因此它們最適合用於單一檔案編輯和上傳/下載內容。如果您需要使用一次大量讀取/寫入多個檔案的應用程式 (例如本機原始碼控制工具),rsync 是更好的選擇。