在 Docker Desktop 中使用 USB/IP
目錄
USB/IP 允許您透過網路共享 USB 裝置,然後可以在 Docker 容器中訪問這些裝置。本頁重點介紹共享連線到您執行 Docker Desktop 的機器上的 USB 裝置。您可以根據需要重複以下過程來連線和使用其他 USB 裝置。
注意Docker Desktop 包含許多常用 USB 裝置的內建驅動程式,但 Docker 無法保證所有可能的 USB 裝置都適用於此設定。
設定和使用
第一步:執行 USB/IP 伺服器
要使用 USB/IP,您需要執行 USB/IP 伺服器。本指南將使用 jiegec/usbip 提供的實現。
克隆儲存庫。
$ git clone https://github.com/jiegec/usbip $ cd usbip
執行模擬的人機介面裝置 (HID) 裝置示例。
$ env RUST_LOG=info cargo run --example hid_keyboard
第二步:啟動特權 Docker 容器
要連線 USB 裝置,請啟動一個特權 Docker 容器,並將 PID 名稱空間設定為 host
。
$ docker run --rm -it --privileged --pid=host alpine
--privileged
賦予容器對主機的完全訪問許可權,而 --pid=host
允許它共享主機的程序名稱空間。
第三步:進入 PID 1 的掛載名稱空間
在容器內部,進入 init
程序的掛載名稱空間,以獲得對預安裝的 USB/IP 工具的訪問許可權
$ nsenter -t 1 -m
第四步:使用 USB/IP 工具
現在您可以像在任何其他系統上一樣使用 USB/IP 工具
列出 USB 裝置
從主機列出可匯出的 USB 裝置
$ usbip list -r host.docker.internal
預期輸出
Exportable USB devices
======================
- host.docker.internal
0-0-0: unknown vendor : unknown product (0000:0000)
: /sys/bus/0/0/0
: (Defined at Interface level) (00/00/00)
: 0 - unknown class / unknown subclass / unknown protocol (03/00/00)
連線 USB 裝置
連線特定的 USB 裝置,或此處的模擬鍵盤
$ usbip attach -r host.docker.internal -d 0-0-0
驗證裝置連線
連線模擬鍵盤後,檢查 /dev/input
目錄中的裝置節點
$ ls /dev/input/
示例輸出
event0 mice
第五步:從另一個容器訪問裝置
當初始容器保持執行以使 USB 裝置正常工作時,您可以從另一個容器訪問連線的裝置。例如
啟動一個帶有已連線裝置的新容器。
$ docker run --rm -it --device "/dev/input/event0" alpine
安裝
evtest
等工具來測試模擬鍵盤。$ apk add evtest $ evtest /dev/input/event0
與裝置互動,並觀察輸出。
示例輸出
Input driver version is 1.0.1 Input device ID: bus 0x3 vendor 0x0 product 0x0 version 0x111 ... Properties: Testing ... (interrupt to exit) Event: time 1717575532.881540, type 4 (EV_MSC), code 4 (MSC_SCAN), value 7001e Event: time 1717575532.881540, type 1 (EV_KEY), code 2 (KEY_1), value 1 Event: time 1717575532.881540, -------------- SYN_REPORT ------------ ...
重要初始容器必須保持執行才能維護與 USB 裝置的連線。退出容器將導致裝置停止工作。