在遠端 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 擴充功能的快速入門,連線到主機並在那裡開啟資料夾。
- 從命令面板 (F1, ⇧⌘P (Windows, Linux Ctrl+Shift+P)) 使用 Dev Containers:在容器中重新開啟 命令。
其餘的 Dev Containers 快速入門指南仍然適用。您可以在其文件中瞭解更多關於 Remote - SSH 擴充功能的資訊。
使用 Remote - Tunnels 擴充功能連線
您可以將 Remote - Tunnels 和 Dev Containers 擴充功能一起使用,以在容器內開啟遠端主機上的資料夾。您甚至不需要在本機安裝 Docker 用戶端。這與上述 SSH 主機情境類似,但使用的是 Remote - Tunnels 而不是 SSH。若要執行此操作:
- 依照 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,但對於您已經從命令列連線到的主機的情況,此模型可能很有用。如果您希望附加到此遠端伺服器上已經在執行的容器,此方法也很有用。
基本的遠端範例
設定 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 代理程式。請參閱關於搭配 Git 使用 SSH 金鑰的文章,以瞭解關於設定代理程式和新增金鑰的詳細資訊。
此時,您可以附加到遠端主機上的容器。我們將在本節稍後介紹更多關於如何使用設定和環境變數或Docker contexts連線的資訊。
對於 devcontainer.json
,還有一個額外步驟:您需要更新任何已設定(或自動設定)的綁定掛載,使其不再指向本機檔案系統。
此設定有兩種變體。第一種是先建立您的遠端開發容器,然後將您的原始碼複製到具名卷冊,因為這不需要您直接存取遠端主機上的檔案系統。
以下是此設定的基本 devcontainer.json
範例:
{
"image": "node", // Or "dockerFile"
"workspaceFolder": "/workspace",
"workspaceMount": "source=remote-workspace,target=/workspace,type=volume"
}
事實上,命令面板 (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 上預設未執行)。請參閱關於搭配 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 允許您與不同的主機互動 - 您可以為主機設定 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
轉換為遠端 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 或 Docker Machine 的 mount 命令是更方便的選項,並且不需要任何檔案同步。但是,效能會明顯慢於透過 VS Code 工作,因此它們最適合用於單一檔案編輯和上傳/下載內容。如果您需要使用一次性大量讀取/寫入許多檔案的應用程式(例如本機原始碼控制工具),rsync 是更好的選擇。