Join our Discord Server
Ajeet Raina Ajeet Singh Raina is a former Docker Captain, Community Leader and Distinguished Arm Ambassador. He is a founder of Collabnix blogging site and has authored more than 700+ blogs on Docker, Kubernetes and Cloud-Native Technology. He runs a community Slack of 9800+ members and discord server close to 2600+ members. You can follow him on Twitter(@ajeetsraina).

Integrating USB/IP into Docker Desktop is Now Possible

1 min read

Docker containers provide excellent isolation for applications, but accessing physical USB devices within a container can be challenging. By leveraging the USB/IP protocol, you can share USB devices over the network and use them in Docker containers.

This guide will walk you through:

  1. Setting up and running a USB/IP server
  2. Connecting USB devices to a privileged Docker container
  3. Sharing USB devices with other containers

We’ll use USB/IP, nsenter, and Docker to facilitate USB over IP and simplify device management.

Step 1: Clone and Set Up the USB/IP Server

We will use the usbip implementation to run a USB/IP server. First, clone the repository:

git clone https://github.com/jiegec/usbip
cd usbip


# Run the USB/IP example for a HID keyboard
env RUST_LOG=info cargo run --example hid_keyboard

Step 2: Run a Privileged Docker Container

To interact with the USB devices, start a privileged container with the PID namespace set to host:

docker run --rm -it --privileged --pid=host alpine

Step 3: Enter the Mount Namespace

Inside the container, enter the mount namespace of the init process to access pre-installed USB/IP tools and make device node lookups easier:

nsenter -t 1 -m

Step 4: List Available USB Devices

Use the USB/IP tools to list exportable USB devices from the host system:

usbip list -r host.docker.internal

Example Output:

usbip: error: failed to open /usr/share/hwdata//usb.ids
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)

Step 5: Attach a USB Device

Attach the desired USB device using the usbip attach command:

usbip attach -r host.docker.internal -d 0-0-0

# Verify the attached device
ls /dev/input/

Example Output:

event0 mice

Step 6: Use the USB Device in Another Container

With the USB device attached, you can use it in a separate container:

# Start a new container with the device
docker run --rm -it --device "/dev/input/event0" alpine

# Install evtest
apk add evtest

# Test the device
evtest /dev/input/event0

Example Output:

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 ------------

Important Tips and Notes

  • Keep the initial container running while working with the attached device. Exiting it will stop the device from working.
  • Use nsenter to simplify access to host-level tools within a container.
  • Ensure your Docker setup supports privileged containers for seamless USB/IP integration.

By following this guide, you can successfully set up a USB/IP server, attach USB devices to a privileged Docker container, and share those devices with other containers. This approach is particularly useful for hardware-dependent applications, enabling seamless integration of physical USB devices with containerized environments.

Have Queries? Join https://launchpass.com/collabnix

Ajeet Raina Ajeet Singh Raina is a former Docker Captain, Community Leader and Distinguished Arm Ambassador. He is a founder of Collabnix blogging site and has authored more than 700+ blogs on Docker, Kubernetes and Cloud-Native Technology. He runs a community Slack of 9800+ members and discord server close to 2600+ members. You can follow him on Twitter(@ajeetsraina).

How to Build and Host Your Own MCP Servers…

Introduction The Model Context Protocol (MCP) is revolutionizing how LLMs interact with external data sources and tools. Think of MCP as the “USB-C for...
Adesoji Alu
1 min read
Join our Discord Server
Index