在 Docker Desktop 中使用 USB/IP

要求: Docker Desktop 4.35.0 及更高版本
適用於: Mac、Linux 和 Windows 上的 Docker Desktop(使用 Hyper-V 後端)

USB/IP 允許您透過網路共享 USB 裝置,然後可以在 Docker 容器中訪問這些裝置。本頁重點介紹共享連線到您執行 Docker Desktop 的機器上的 USB 裝置。您可以根據需要重複以下過程來連線和使用其他 USB 裝置。

注意

Docker Desktop 包含許多常用 USB 裝置的內建驅動程式,但 Docker 無法保證所有可能的 USB 裝置都適用於此設定。

設定和使用

第一步:執行 USB/IP 伺服器

要使用 USB/IP,您需要執行 USB/IP 伺服器。本指南將使用 jiegec/usbip 提供的實現。

  1. 克隆儲存庫。

    $ git clone https://github.com/jiegec/usbip
    $ cd usbip
    
  2. 執行模擬的人機介面裝置 (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 裝置正常工作時,您可以從另一個容器訪問連線的裝置。例如

  1. 啟動一個帶有已連線裝置的新容器。

    $ docker run --rm -it --device "/dev/input/event0" alpine
    
  2. 安裝 evtest 等工具來測試模擬鍵盤。

    $ apk add evtest
    $ evtest /dev/input/event0
    
  3. 與裝置互動,並觀察輸出。

    示例輸出

    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 裝置的連線。退出容器將導致裝置停止工作。