Ssh

將文件從非主機傳輸到 docker 容器,反之亦然

  • November 2, 2021

Ubuntu在 Linux 機器上有一個正在執行的 docker 容器。每次嘗試從本地電腦向/從 docker 容器複製文件時,我都會遇到很大的困難。我必須將文件複製到主機上,然後執行docker cp以傳輸它。

有什麼方法可以直接從我的基於 Windows 的本地機器訪問 docker 容器?

由於容器只有一個本地到主機的 IP,我想到的一個選項是告訴主機將所有 SSH 連接轉發到容器的特定埠。或您可能擁有的任何其他解決方案。

容器的設計目標之一是隔離,因此部分預期訪問容器內的文件的困難。

(至少)有這三個選項。編輯:想到第四個:)

連接到容器內的守護程序

sshd在容器內執行一個程序以便能夠通過任何 SSH 客戶端直接訪問它似乎很誘人。然而,這與每個容器執行“一個程序”/“一個服務”的想法背道而馳(除非容器的全部目的是一個 ssh 守護程序)。直接在容器內執行的任何其他文件共享服務(如 ftpd 等)也是如此。

此選項是否可行取決於是否可以更改容器以包含用於您的目的的守護程序以及是否需要。我認為,在尋求容器提供隔離的環境中,在容器內使用額外服務會適得其反。然而,如果它更像是一個“開發環境”,那麼在容器內執行一個額外的守護程序可能是有益的。由於容器提供的程序監督非常有限,因此請考慮在容器內部使用合適的服務管理器(systemd 很重,但可以做到這一切,存在不太完整的替代方案:))以防執行多個服務。

從容器中暴露體積

所以只要你有辦法連接到 Linux 部分,Docker 提供了一個集成機制,用於從容器內的(Linux)主機映射路徑。這是通過-v在創建容器時指定標誌來完成的,如下所示:

docker run --rm -it -v /home/linux-fan/wd:/media/wd debian:10 /bin/bash

在這裡,我的本地目錄在容器內部/home/linux-fan/wd提供。/media/wd請注意,docker 沒有做任何特殊的事情來使容器內外的使用者 ID 匹配(如果 ID 沒有正確對齊,可能會導致權限被拒絕錯誤)。

另外/可選地,為了避免通過 SSH 連接,使用 samba 將來自 Linux 主機的路徑公開為 Windows 共享可能會很有趣,所有用於文件訪問的 SSH 都可以被消除。

其他卷儲存選項

雖然我對它們沒有任何經驗,但 Docker 不僅允許將目錄作為卷提供,而且還可以選擇添加外部儲存(參見https://docs.docker.com/engine/extend/plugins_volume/)。這樣的儲存可能再次可以從 Windows 端訪問。

直接訪問遠端 docker daemon

Docker 本身就是一個服務,可以暴露給外部網路。為此,您需要設置正確的 TLS 證書並啟用對 Linux 主機上 Docker 守護程序的網路訪問。然後應該可以執行 Windows Docker 客戶端(通過 TLS 連接到 Linux Docker 守護程序)並直接從本地電腦發出合適docker cp的命令(以及所有其他命令)。docker

編輯 2:無需重新創建容器

對正在執行的容器做一些事情肯定會大大減少選項。

如果沒有暴露的埠可以監聽,那麼基於 SSHD-in-container 的解決方案可能會很困難。sshd如果是這種情況,使用連結到正在執行的容器的附加容器來解決這個問題並進行一些轉發可以工作,但是很麻煩。

遠端 Docker 訪問不需要重新創建容器,但需要更改 Docker 配置,因此需要重新啟動所有正在執行的容器(無需重新創建),因為需要重新啟動 Docker 守護程序。

最後,如果這一切都不可能,那麼在現有容器中作為新創建的程序執行的基於拉取的解決方案可能會更加駭人聽聞,但可以作為一種“最後的手段”使用。但是,我懷疑這是否比現有的ssh+docker cp工作流程更方便。如果您想優化現有的解決方案:WinSCP 提供了自動將更改的文件發送到 Linux 的功能(docker cp因此可以簡化呼叫之前的部分)。

引用自:https://serverfault.com/questions/990707