⚠️ Traduction non officielle - Cette documentation est une traduction communautaire non officielle de Docker.

Utiliser USB/IP avec Docker Desktop

Requires: Docker Desktop 4.35.0 and later
For: Docker Desktop for Mac, Linux, and Windows with the Hyper-V backend

USB/IP vous permet de partager des périphériques USB sur le réseau, qui peuvent ensuite être accessibles depuis des conteneurs Docker. Cette page se concentre sur le partage de périphériques USB connectés à la machine sur laquelle vous exécutez Docker Desktop. Vous pouvez répéter le processus suivant pour attacher et utiliser des périphériques USB supplémentaires selon vos besoins.

Note

Docker Desktop inclut des pilotes intégrés pour de nombreux périphériques USB courants, mais Docker ne peut pas garantir que tous les périphériques USB possibles fonctionnent avec cette configuration.

Configuration et utilisation

Étape un : Exécuter un serveur USB/IP

Pour utiliser USB/IP, vous devez exécuter un serveur USB/IP. Pour ce guide, l'implémentation fournie par jiegec/usbip sera utilisée.

  1. Clonez le dépôt.

    $ git clone https://github.com/jiegec/usbip
    $ cd usbip
    
  2. Exécutez l'exemple de périphérique d'interface humaine (HID) émulé.

    $ env RUST_LOG=info cargo run --example hid_keyboard
    

Étape deux : Démarrer un conteneur Docker privilégié

Pour attacher le périphérique USB, démarrez un conteneur Docker privilégié avec l'espace de noms PID défini sur host :

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

--privileged donne au conteneur un accès complet à l'hôte, et --pid=host lui permet de partager l'espace de noms de processus de l'hôte.

Étape trois : Entrer dans l'espace de noms de montage du PID 1

À l'intérieur du conteneur, entrez dans l'espace de noms de montage du processus init pour obtenir l'accès aux outils USB/IP pré-installés :

$ nsenter -t 1 -m

Étape quatre : Utiliser les outils USB/IP

Maintenant vous pouvez utiliser les outils USB/IP comme vous le feriez sur tout autre système :

Lister les périphériques USB

Pour lister les périphériques USB exportables depuis l'hôte :

$ usbip list -r host.docker.internal

Sortie attendue :

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)

Attacher un périphérique USB

Pour attacher un périphérique USB spécifique, ou le clavier émulé dans ce cas :

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

Vérifier l'attachement du périphérique

Après avoir attaché le clavier émulé, vérifiez le répertoire /dev/input pour le nœud de périphérique :

$ ls /dev/input/

Exemple de sortie :

event0  mice

Étape cinq : Accéder au périphérique depuis un autre conteneur

Tandis que le conteneur initial reste en cours d'exécution pour maintenir le périphérique USB opérationnel, vous pouvez accéder au périphérique attaché depuis un autre conteneur. Par exemple :

  1. Démarrez un nouveau conteneur avec le périphérique attaché.

    $ docker run --rm -it --device "/dev/input/event0" alpine
    
  2. Installez un outil comme evtest pour tester le clavier émulé.

    $ apk add evtest
    $ evtest /dev/input/event0
    
  3. Interagissez avec le périphérique et observez la sortie.

    Exemple de sortie :

    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

Le conteneur initial doit rester en cours d'exécution pour maintenir la connexion au périphérique USB. Quitter le conteneur arrêtera le fonctionnement du périphérique.