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 de celui-ci et d'examiner les fichiers. Pour le moment, si je m'attache au conteneur, je suis obligé de regarder le démon Apache et je ne peux exécuter aucune commande.
Est-il possible de joindre un autre terminal à un conteneur en cours d'exécution? Peut-être que je peux tirer parti du fait que Docker est en train d’envelopper des conteneurs LXC? J'ai essayé Sudo lxc-console -n [container-id] -t [1-4]
mais il semble qu'un seul terminal soit disponible, celui qui exécute le démon Apache. Peut-être y a-t-il un moyen d'activer plusieurs consoles lxc pendant la construction?
Je préférerais pas configurer et construire le conteneur avec un service openssh si possible.
Avec docker 1.3, il existe une nouvelle commande docker exec
. Cela vous permet d'entrer dans un menu fixe en cours d'exécution:
docker exec -it [container-id] bash
Vous devez utiliser l'outil 'nsenter' de Jérôme Petazzoni pour entrer dans un conteneur sans utiliser SSH. Voir: https://github.com/jpetazzo/nsenter
Installez avec simplement en cours d'exécution: docker run -v /usr/local/bin:/target jpetazzo/nsenter
Ensuite, utilisez la commande docker-enter <container-id>
pour entrer le conteneur.
Mettre à jour
Depuis docker 0.9, pour que les étapes ci-dessous fonctionnent, il faut maintenant mettre à jour le fichier /etc/default/docker
avec le '-e lxc'
avec l'option de démarrage du démon docker avant de redémarrer le démon (je l'ai fait en redémarrant l'hôte).
C'est tout parce que ...
... il [docker 0.9] contient une nouvelle abstraction "moteur" pour rendre l'utilisation possible d’autres API que LXC pour démarrer les conteneurs. Il fournit également un nouveau pilote de moteur basé sur une nouvelle bibliothèque d’API (libcontainer) capable de fonctionner gérer des groupes de contrôle sans utiliser les outils LXC. Le problème principal est que si vous comptez sur lxc-attach pour effectuer des actions sur votre conteneur, comme démarrer un shell à l'intérieur du conteneur, qui est incroyablement utile pour l'environnement de développement ...
Veuillez noter que ceci empêchera le nouveau fonctionnement de fonctionnalité optionnelle de docker 0.11 pour la mise en réseau de l'ordinateur hôte uniquement , et vous ne verrez que l'interface de bouclage. rapport d'erreur
Il s'avère que la solution à une question différente était également la solution à celle-ci:
... vous pouvez utiliser docker
ps -notrunc
pour obtenir l'ID de conteneur lxc complet et le fichier puis utilisezlxc-attach -n <container_id>
run bash dans ce conteneur en tant que racine.
Update: Vous devrez bientôt utiliser ps --no-trunc
au lieu de ps -notrunc
qui est obsolète.
Trouver l'ID de conteneur complet
Entrez la commande lxc attach.
Top montre le processus Apache qui exécute ce menu fixe.
Qu'en est-il de l'exécution de tmux/GNU Screen au sein du conteneur?
$ docker attach {container id}
nsenter
fait cela. Cependant, je devais aussi entrer dans un conteneur de manière simple et nsenter ne suffisait pas à mes besoins. C'était buggy dans certaines occasions (écran noir plus -wd flag ne fonctionnait pas). De plus, je voulais me connecter en tant qu'utilisateur spécifique et dans un répertoire spécifique.
J'ai fini par créer mon propre outil pour entrer dans les conteneurs. Vous pouvez le trouver à: https://github.com/Pithikos/docker-enter
Son utilisation est aussi simple que
./docker-enter [-u <user>] [-d <directory>] <container ID>
Premier step obtenir l'ID du conteneur:
docker ps
Cela vous montrera quelque chose comme
COMMANDE D'IMAGE D'IDENTIFICATION DE CONTENEURS CREATE DES NOMS DES PORTS D'ETAT
1170fe9e9460 localhost: 5000/python: env-7e847468c4d73a0f35e9c5164046ad88 "./run_notebook.sh" Il y a 26 secondes Jusqu'à 25 secondes 0.0.0.0:8989->9999/tcp SLURM_TASK-303337_0
1170fe9e9460
est l'identifiant du conteneur dans ce cas.
Deuxièmement , entrez le docker:
docker exec -it [container_id] bash
donc dans le cas ci-dessus: docker exec -it 1170fe9e9460 bash
La manière "nsinit" est:
installer nsinit
git clone [email protected]:dotcloud/docker.git
cd docker
make Shell
depuis l'intérieur du conteneur:
go install github.com/dotcloud/docker/pkg/libcontainer/nsinit/nsinit
de dehors:
docker cp id_docker_container:/go/bin/nsinit /root/
utilise le
cd /var/lib/docker/execdriver/native/<container_id>/
nsinit exec bash
docker exec -t -i container_name /bin/bash
Vous mènera à la console des conteneurs.
J'ai démarré powershell sur un Microsoft/iis en cours d'exécution exécuté en tant que démon
docker exec -it <nameOfContainer> powershell
docker stop Containter_name
docker start -i nom_conteneur
Cela a fonctionné pour moi dans le terminal distant connecté à Ubuntu