在 Docker Desktop 中使用 USB/IP
目录
要求: Docker Desktop 4.35.0 及更高版本
适用于: 适用于 Mac、Linux 和 Windows(Hyper-V 后端)的 Docker Desktop
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 设备的连接。退出容器将导致设备停止工作。