634 votes

Comment entrer dans un conteneur Docker déjà en cours d'exécution avec un nouveau TTY ?

J'ai un conteneur qui exécute le service Apache au premier plan. J'aimerais pouvoir accéder au conteneur à partir d'un autre shell afin de "fouiller" à l'intérieur et d'examiner les fichiers. Pour l'instant, si je m'attache au conteneur, je me retrouve à regarder le démon Apache et je ne peux exécuter aucune commande.

Est-il possible d'attacher un autre tty à un conteneur en cours d'exécution ? Je peux éventuellement profiter du fait que Docker ne fait qu'envelopper les conteneurs LXC ? J'ai essayé sudo lxc-console -n [container-id] -t [1-4] mais il semble qu'un seul tty soit disponible et c'est celui qui exécute le daemon apache. Peut-être existe-t-il un moyen d'activer plusieurs consoles lxc pendant la construction ?

Je préférerais no configurer et construire le conteneur avec un service openssh si possible.

7 votes

Avez-vous essayé docker attach [conainer-id] ?

14 votes

@shabbychef à moins que docker attach n'ait changé, la commande attach s'attache à la tty en cours, pas à une nouvelle, d'où le titre de la question "...avec une nouvelle TTY". C'est pourquoi la réponse ci-dessous n'utilise pas la commande attach.

1 votes

Depuis la version 1.3, il existe une méthode plus simple, décrite à la page cette réponse

1238voto

Michael_Scharf Points 792

Avec docker 1.3, il y a une nouvelle commande docker exec . Cela vous permet d'entrer dans un conteneur en cours d'exécution :

docker exec -it [container-id] bash

Nota: cela suppose bash est installé sur votre conteneur. Vous pouvez exécuter sh ou tout autre shell interactif installé sur le conteneur.

32 votes

J'ai modifié cette réponse pour qu'elle soit correcte (de mon point de vue) car cette nouvelle méthode, qui n'existait pas à l'époque de la question, est la meilleure méthode actuelle IMO.

3 votes

Notez toutefois que exec n'agit pas comme un terminal normal. Par exemple, vous ne pouvez pas changer d'utilisateur une fois à l'intérieur du conteneur.

0 votes

Pour docker 1.2, utilisez nsenter . Sous OS X et Windows, vous pouvez suivre la procédure suivante nsenter instructions

42voto

Hyperfocus Points 399

Vous devriez utiliser l'outil de Jérôme Petazzoni appelé 'nsenter' pour entrer dans un conteneur sans utiliser SSH. Voir aussi : https://github.com/jpetazzo/nsenter

L'installation se fait simplement en cours d'exécution : docker run -v /usr/local/bin:/target jpetazzo/nsenter

Utilisez ensuite la commande docker-enter <container-id> pour entrer dans le conteneur.

0 votes

C'est la bonne méthode. Voir blog .

6 votes

Avec docker 1.3, il y a une nouvelle commande docker exec . Cela vous permet d'entrer dans un docker en cours d'exécution : docker exec -it <container-id> bash (voir ma réponse ci-dessous)

6 votes

Fait docker-enter existe-t-elle encore ? Il me donne command not found .

22voto

Programster Points 579

Mise à jour

Depuis la version 0.9 de Docker, pour que les étapes ci-dessous fonctionnent, il faut maintenant mettre à jour le fichier /etc/default/docker avec le fichier '-e lxc' à l'option de démarrage du daemon docker avant de redémarrer le daemon (j'ai fait cela en redémarrant l'hôte).

update to the /etc/default/docker file

Tout cela parce que...

...il [docker 0.9] contient une nouvelle abstraction "engine driver" pour rendre possible l'utilisation d'autres API que LXC pour démarrer les conteneurs. Il fournit également un nouveau moteur basé sur une nouvelle bibliothèque API (libcontainer) qui est capable de de gérer les groupes de contrôle sans utiliser les outils LXC. Le principal problème est que est que si vous comptez sur lxc-attach pour effectuer des actions sur vos conteneur, comme lancer un shell à l'intérieur du conteneur, ce qui est ce qui est incroyablement utile dans un environnement de développement...

source

Veuillez noter que cela empêchera la nouvelle host only networking fonctionnalité optionnelle de docker 0.11 de "working" et vous ne verrez que l'interface loopback. rapport de bogue


Il s'avère que la solution de une autre question était également la solution à ce problème :

...vous pouvez utiliser docker ps -notrunc pour obtenir le contenu complet de lxc puis utiliser lxc-attach -n <container_id> exécuter bash dans ce conteneur en tant que Racine.

Mise à jour : Vous devrez bientôt utiliser ps --no-trunc au lieu de ps -notrunc qui est en train d'être supprimée.

enter image description here Trouver l'identifiant complet du conteneur

enter image description here Entrez la commande lxc attach.

enter image description here Le haut montre mon processus apache en cours d'exécution que docker a démarré.

0 votes

Il n'y a donc aucun moyen de faire cela avec Docker, n'est-ce pas ? Personnellement, je préfère ne pas mélanger LXC.

0 votes

Existe-t-il un moyen de lancer une commande avec lxc-attach au lieu de lancer le bash ? merci !

0 votes

@qkrijger, pour autant que je sache, c'est exact. Pourquoi s'inquiéter de "mélanger" LXC ? Vous réalisez que docker est construit au-dessus de LXC, n'est-ce pas ?

4voto

Pithikos Points 1227

nsenter le fait. Cependant, j'avais également besoin d'entrer un conteneur de manière simple et nsenter ne suffisait pas à mes besoins. Il était bogué dans certains cas (écran noir et drapeau -wd ne fonctionnant pas). De plus, je voulais me connecter en tant qu'utilisateur spécifique et dans un répertoire spécifique.

J'ai fini par fabriquer mon propre outil pour entrer dans les conteneurs. Vous pouvez le trouver à l'adresse suivante https://github.com/Pithikos/docker-enter

Son utilisation est aussi simple que

./docker-enter [-u <user>] [-d <directory>] <container ID>

0 votes

Je viens d'essayer, c'est très cool ! Sur ubuntu, j'ai dû lancer sudo apt-get build-essential -y gcc docker-enter.c -o docker-enter sudo ./docker-enter <short-container-id> C'est bien que je n'aie pas à obtenir l'ID complet comme avec lxc-attach -n La base de code est suffisamment courte pour que l'on puisse la parcourir en entier rapidement à la recherche de quelque chose de malveillant.

0 votes

J'ai mis à disposition un ebuild sur gentoo à l'adresse suivante github.com/steveeJ/personal-portage-overlay comme app-émulation/docker-enter.

0 votes

J'ai ajouté un tutoriel/script pour le faire automatiquement pour les utilisateurs d'ubuntu à l'adresse suivante programter.blogspot.co.uk/2014/01/

2voto

Ivailo Bardarov Points 1484

La méthode "nsinit" est la suivante :

installer nsinit

git clone git@github.com:dotcloud/docker.git
cd docker
make shell

de l'intérieur du conteneur :

go install github.com/dotcloud/docker/pkg/libcontainer/nsinit/nsinit

de l'extérieur :

docker cp id_docker_container:/go/bin/nsinit /root/

l'utiliser

cd /var/lib/docker/execdriver/native/<container_id>/
nsinit exec bash

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X