在遠端 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 快速入門的其餘部分照常適用。您可以在 Remote - SSH 擴充套件程式的文件中瞭解更多資訊。
使用 Remote - Tunnels 擴充套件程式連線
您可以將 Remote - Tunnels 和 Dev Containers 擴充套件程式一起使用,在容器中開啟遠端主機上的資料夾。您甚至不需要在本地安裝 Docker 客戶端。這類似於上面的 SSH 主機方案,但使用 Remote - Tunnels 代替。具體操作如下:
- 按照 Remote - Tunnels 擴充套件程式的入門說明進行操作。
- 在隧道主機上安裝 Docker。您不需要在本地安裝 Docker。
- 按照 Remote - Tunnels 擴充套件程式的步驟連線到隧道主機並在其中開啟資料夾。
- 從命令面板(F1,⇧⌘P (Windows, Linux Ctrl+Shift+P))使用 開發容器:在容器中重新開啟 命令。
Dev Containers 快速入門的其餘部分照常適用。您可以在 Remote - Tunnels 擴充套件程式的文件中瞭解更多資訊。
使用 Docker CLI 連線
此模型僅要求 Docker Engine 在遠端主機上執行,並且本地 Docker CLI 可以連線到該主機。雖然使用 Remote - SSH 和 Remote - Tunnels 擴充套件程式更容易,並且甚至不需要在本地安裝 Docker CLI,但此模型對於您已經從命令列連線到主機的場景非常有用。如果您希望附加到此遠端伺服器上已在執行的容器,此方法也很有用。
一個基本的遠端示例
設定 VS Code 以附加到遠端 Docker 主機上的容器可以像在 settings.json 中設定 Container Tools extension 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... 命令使用了相同的技術。如果您在 GitHub 儲存庫中已經有一個引用映象或 Dockerfile 的 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 extension 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 extension 屬性。這些屬性是:
"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 extension 帶有 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。將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以下拉原始碼,然後使用 File > Open... / Open Folder... 開啟克隆的儲存庫。
下次要連線到同一個容器時,執行 Dev Containers: Open Folder in Container... 並在 VS Code 視窗中選擇相同的本地資料夾。
可選:使遠端原始碼在本地可用
如果您將原始碼儲存在遠端主機的本地檔案系統上而不是 Docker 卷中,您可以通過幾種方式訪問本地檔案:
- 使用 SSHFS 裝載遠端檔案系統.
- 使用
rsync將檔案從遠端主機同步到本地計算機. - 如果您正在使用 Docker Machine,請使用
mount命令。
使用 SSHFS 或 Docker Machine 的 mount 命令是更方便的選擇,並且不需要任何檔案同步。但是,效能會比透過 VS Code 工作慢得多,因此它們最適合用於單個檔案編輯和內容上傳/下載。如果您需要使用同時對許多檔案進行批次讀取/寫入的應用程式(例如本地原始碼控制工具),rsync 是更好的選擇。