Utiliser USB/IP avec Docker Desktop
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.
NoteDocker 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.
-
Clonez le dépôt.
$ git clone https://github.com/jiegec/usbip $ cd usbip
-
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 :
-
Démarrez un nouveau conteneur avec le périphérique attaché.
$ docker run --rm -it --device "/dev/input/event0" alpine
-
Installez un outil comme
evtest
pour tester le clavier émulé.$ apk add evtest $ evtest /dev/input/event0
-
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 ------------ ...
ImportantLe 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.