la différence entre le panneau d'attacher et de docker exec
Les deux seront en mesure d'exécuter des commandes dans un conteneur.
Les deux pourrait se détacher du conteneur.
Alors quelle est la vraie différence entre le panneau exec et docker joindre?
Vous devez vous connecter pour publier un commentaire.
Il y avait un commettre PR qui a ajouté à la doc:
La réponse à "Débardeur. Comment obtenir bash\ssh est géré à l'intérieur de conteneur (
exécuter -d
)?" illustre la différence:Comme mentionné dans ce problème:
La même question ajoute:
Lorsqu'un conteneur est démarré à l'aide de /bin/bash, puis il devient le conteneurs PID 1 et docker joindre est utilisé pour pénétrer à l'intérieur de PID 1 d'un conteneur. Donc docker joindre < container-id > à l'intérieur du terminal bash comme c'est le PID 1 comme nous l'avons mentionné pendant le démarrage du conteneur. La sortie du conteneur va arrêter le conteneur.
Alors que dans docker exec de commande, vous pouvez spécifier le shell vous voulez entrer dans. Il ne vous prendra pas le PID 1 du conteneur. Il va créer un nouveau processus pour bash.
docker exec -il < container-id > bash.
La sortie du conteneur ne sera pas arrêter le conteneur.
Vous pouvez également utiliser nsenter entrer à l'intérieur de conteneurs.
nsenter -m -u -n -p -i-t < pid du conteneur >
Vous pouvez trouver le PID de conteneur à l'aide de: docker inspecter < container-id > | grep PID
Remarque: Si vous avez commencé votre récipient avec drapeau-d puis la sortie du conteneur ne sera pas arrêter le conteneur,si vous utilisez l'option " attacher ou exec pour obtenir à l'intérieur.
nsenter
. Pouvez-vous développer? Expliquer les options dans l'ordre. Pourquoi ne pas entrer dans tous les espaces de noms? Pourquoi ces chers?Docker exec exécute une nouvelle commande /créer un nouveau processus dans le conteneur de l'environnement, tandis que le panneau attacher juste relie le standard d'entrée/de sortie/erreur du processus principal(avec le PID 1) à l'intérieur du conteneur correspondant à l'entrée/sortie standard d'erreur/de l'actuel terminal(le terminal que vous utilisez pour exécuter la commande).
Un conteneur est un environnement isolé, avec certains processus en cours d'exécution dans l'environnement. Plus précisément, un conteneur dispose de son propre espace du système de fichiers et le PID de l'espace qui sont isolées à partir de l'hôte et d'autres contenants.
Lorsque le conteneur est démarré à l'aide de “docker run –elle ...”, le principal processus de pseudo-tty et STDIN maintenu ouvert.
Lorsqu'il est attaché dans le mode tty, vous pouvez détacher de la cuve (et de le laisser tourner) à l'aide d'une séquence de touches configurables. La valeur par défaut de la séquence de touches CTRL-p CTRL-q. Vous configurer la séquence de touches à l'aide de l' --detach-clés option ou d'un fichier de configuration.
Vous pouvez vous rattacher à un décollement de récipient avec le panneau attacher.
Docker exec juste démarre un nouveau processus, à l'intérieur du conteneur de l'environnement, qui est, appartient à la PID de l'espace du conteneur.
Par exemple, si vous démarrez votre conteneur à l'aide de “docker run –dit XXX /bin/bash”,que vous pouvez joindre au conteneur(‘s principaux processus) à l'aide de deux terminaux différents. Pendant que vous saisissez dans un terminal, vous pouvez voir qu'il apparaît dans le terminal, pour les deux terminaux sont connectés à la même ats.
Faire attention à ce que vous êtes maintenant dans le processus principal du conteneur, si vous tapez “exit”, vous quittez le conteneur(soyez donc prudent, en utilisant de détachement clés pour détacher), et vous verrez les deux bornes de la fermeture.
Mais si vous l'exécutez “docker exec –il XXX /bin/bash” dans les deux terminaux, vous avez commencé deux nouveaux processus à l'intérieur du conteneur, et ils ne sont pas liés les uns aux autres et le processus principal, et vous pouvez en sortir en toute sécurité à partir d'eux.
Que Michael Sun a déclaré, dans sa réponse
Ma réponse va se concentrer plus sur vous permettant de valider la déclaration ci-dessus et de comprendre plus clairement.
Ouvrir une fenêtre de terminal et exécutez la commande
docker run -itd --name busybox busybox /bin/sh
. La commande va tirer l'imagebusybox
si pas déjà présent. Il va alors créer un conteneur avec le nombusybox
à l'aide de cette image.Vous pouvez vérifier le statut de votre conteneur en exécutant la commande
docker ps -a | grep busybox
.Si vous allez courir
docker top busybox
, vous devriez voir une sortie quelque chose comme ça.Bien sûr, la
PID
,PPID
et les autres valeurs peuvent être différentes dans votre cas. Vous pouvez utiliser d'autres outils et utilitaires ainsi commepstree
,top
,htop
pour voir la liste desPID
etPPID
.La
PID
etPPID
signifie que l'id de processus et de parent de l'id de processus. Le processus a commencé lorsque nous avons créé et a commencé notre conteneur avec la commande/bin/sh
. Maintenant, exécutez la commandedocker attach busybox
. Cela permettra de fixer la norme d'entrée/de sortie/flux d'erreur du conteneur à votre terminal.Après la fixation du conteneur, de créer une session shell en exécutant la commande
sh
. Appuyez surCTRL-p CTRL-q
séquence. Ce qui va se détacher du terminal à conteneurs et de garder le contenant en cours d'exécution. Si vous allez exécuterdocker top busybox
, vous devriez voir deux processus dans la liste.Mais la
PPID
des deux processus sera différent. En fait, laPPID
de la deuxième processus sera le même quePID
de la première. Le premier agit en tant que le processus parent pour la session d'environnement que nous venons de créer.Maintenant, exécutez
docker exec -it busybox sh
. Une fois à l'intérieur du conteneur, consultez la liste des processus en cours d'exécution pour le conteneurbusybox
dans une autre fenêtre de terminal en exécutant la commandedocker top busybox
. Vous devriez voir quelque chose comme ceciLa
PPID
de la première et de la troisième processus sera le même, ce qui confirme quedocker exec
crée un nouveau processus dans le conteneur de l'environnement tout endocker attach
juste relie le standard d'entrée/de sortie/erreur des principaux processus à l'intérieur du conteneur correspondant à l'entrée/sortie standard d'erreur/de terminal courant.