web-dev-qa-db-fra.com

Docker fonctionnant déjà avec un nouvel ATS

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.

432
Programster

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
853
Michael_Scharf

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.

40
Hyperfocus

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). 

update to the /etc/default/docker file

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 ...

la source

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 utilisez lxc-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.

enter image description here Trouver l'ID de conteneur complet

enter image description here Entrez la commande lxc attach.

enter image description here Top montre le processus Apache qui exécute ce menu fixe.

18
Programster

Qu'en est-il de l'exécution de tmux/GNU Screen au sein du conteneur?

$ docker attach {container id}
4
cig0

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>
4
Pithikos

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

3
patapouf_ai

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
2
Ivailo Bardarov
docker exec -t -i container_name /bin/bash

Vous mènera à la console des conteneurs.

1
Zemuldo

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
1
Ahmed Samir

docker stop Containter_name

docker start -i nom_conteneur

Cela a fonctionné pour moi dans le terminal distant connecté à Ubuntu

0
Flavio