Il y a quelques années j’ai eu la chance de me poser un peu plus de questions sur docker et c’est grâce à vous et à la chaine Xavki. Eh oui faire des vidéos permet de faire de la recherche de manière un peu différente. Par exemple quand on se forme à une technologie, on regarde des choses assez générique et ensuite on progresse grâce au debug. Du coup souvent on se forme à travers de besoin sépcifique.
Avec la production d’un tutoriel docker, je me suis posé un peu plus de question… Mais quelle est la différence entre docker attach et docker exec ? Est-ce que cette différence est importante ??
FInalement, je considère cette différence comme peu importante… si ce n’est qu’elle permet de mieux comprendre comment on interagit avec docker (ou d’autres outils comme podman). Et ça c’est cool !!!
Bon venons-en justement à ce sujet.
Docker exec il fait quoi ?
La commande exec de docker est souvent utilisé par les débutants et perso c’est celle que je préfère. Mais finalement ques-ce qui se passe derrière ?
Si vous voulez trouver un bon article plus détaillé, je vous invite à lire cette article : Containers 101: attach vs. exec – what’s the difference?
Alors si vous avez suivi les tutoriels docker précédents, cela est assez simple à comprendre. Souvenez vous pour débuter nous avions vu la notion de namespaces réseau notamment.
Ces namespaces permettent de faire tourner un processus linux dans un environnement donné et précis (réseau, hostname, user, montage…).
Et là où le exec est magique c’est que cette commande ne fait que créer un second conteneur… dans exactement le même contexte (environnement). Ainsi, on a vraiment l’impression d’être dans le conteneur comme l’on dit souvent. Du coup c’est un abus de langage car on est à côté dans un autre conteneur mais juste dans le même réseau, le même hostname, user…
Donc ça c’est pour le docker exec… Passons à docker attach qui peut plaire aux fans de linux :).
Docker attach le man in the middle du conteneur !!!
Attach lui est assez marrant. Sur un processus donné sous linux, vous disposez de stdin, stdout, stderr… d’ailleurs vous pouvez les retrouver dans /proc sous les identifiants de vos processus. En gros c’est la libIO de linux qui permet de gérer ces flux.
Le conteneur c’est un processus comme un autre sur votre machine. Il dispose donc de ses propres flux précités.
Imaginez donc que vous soyez en mesure d’écouter le stdout du conteneur… Vous seriez en mesure de voir les sorties du processus du conteneur.
Imaginez également que vous soyez connecté à stdin du conteneur (processus)… idem vous seriez en mesure d’envoyer des commandes au processus de ce conteneur…
Bingo c’est docker attach, il permet de streamer tout ce qui sort et tout ce qui rentre dans le processus du conteneur docker.
Donc la finalité de attach ou de exec est à peu près la même pour debuguer, tester etc. Les méthodes sont par contre assez différentes. A vous de choisir la votre.