在Docker Desktop中使用USB/IP
目录
Introduced in Docker Desktop version
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提供的实现。
克隆仓库。
$ git clone https://github.com/jiegec/usbip $ cd usbip运行模拟的人机接口设备(HID)设备示例。
$ env RUST_LOG=info cargo run --example hid_keyboard
第二步:启动一个特权Docker容器
要连接USB设备,请启动一个具有PID命名空间设置为host的特权Docker容器:
$ docker run --rm -it --privileged --pid=host alpine
第三步:进入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设备的连接。退出容器将导致设备停止工作。