name - Cómo ingresar en un contenedor Docker que ya se está ejecutando con un nuevo TTY
download docker image (9)
¿Qué pasa con la ejecución de la pantalla tmux / GNU dentro del contenedor? Parece la forma más fácil de acceder a tantos vty como quieras con un simple:
$ docker attach {container id}
Tengo un contenedor que ejecuta el servicio de Apache en primer plano. Me gustaría poder acceder al contenedor desde otro shell para "hurgar" dentro de él y examinar los archivos. En este momento, si me adjunto al contenedor, me quedo mirando el demonio de Apache y no puedo ejecutar ningún comando.
¿Es posible adjuntar otra tty a un contenedor en ejecución? Posiblemente, puedo aprovechar el hecho de que Docker en realidad solo está envolviendo los contenedores LXC. He probado sudo lxc-console -n [container-id] -t [1-4]
pero parece que solo hay un tty disponible y ese es el que ejecuta el daemon de apache. Tal vez hay una manera de habilitar múltiples consolas lxc durante la compilación?
Preferiría no configurar y construir el contenedor con un servicio openssh si es posible.
Comencé a usar powershell en un microsoft / iis en ejecución ejecutando como un demonio usando
docker exec -it <nameOfContainer> powershell
Con docker 1.3, hay un nuevo comando docker exec
. Esto le permite ingresar a una ventana acoplable en ejecución:
docker exec -it [container-id] bash
Debe usar la herramienta Jérôme Petazzoni llamada ''nsenter'' para ingresar a un contenedor sin usar SSH. Consulte: https://github.com/jpetazzo/nsenter
Instale simplemente ejecutando: docker run -v /usr/local/bin:/target jpetazzo/nsenter
Luego use el comando docker-enter <container-id>
para ingresar al contenedor.
La forma "nsinit" es:
instalar nsinit
git clone [email protected]:dotcloud/docker.git
cd docker
make shell
desde el interior del contenedor:
go install github.com/dotcloud/docker/pkg/libcontainer/nsinit/nsinit
desde afuera:
docker cp id_docker_container:/go/bin/nsinit /root/
utilízalo
cd /var/lib/docker/execdriver/native/<container_id>/
nsinit exec bash
nsenter
hace eso. Sin embargo, también necesitaba ingresar un contenedor de una manera sencilla y nsenter no era suficiente para mis necesidades. En algunas ocasiones, estaba defectuoso (la pantalla negra y el indicador ww no funcionan). Además, quería iniciar sesión como usuario específico y en un directorio específico.
Terminé haciendo mi propia herramienta para entrar en contenedores. Puede encontrarlo en: https://github.com/Pithikos/docker-enter
Su uso es tan fácil como
./docker-enter [-u <user>] [-d <directory>] <container ID>
Actualizar
A partir de la ventana acoplable 0.9, para que los pasos a continuación funcionen, ahora hay que actualizar el /etc/default/docker
con ''-e lxc''
en la opción de inicio del daemon de la ''-e lxc''
acoplable antes de reiniciar el daemon (lo hice reiniciando el anfitrión).
Esto es todo porque ...
... [docker 0.9] contiene una nueva abstracción de "controlador de motor" para hacer posible el uso de otra API distinta de LXC para iniciar contenedores. También proporciona un nuevo controlador de motor basado en una nueva biblioteca de API (libcontainer) que puede manejar grupos de control sin utilizar herramientas LXC. El problema principal es que si confía en lxc-attach para realizar acciones en su contenedor, como iniciar un shell dentro del contenedor, que es increíblemente útil para el entorno de desarrollo ...
Tenga en cuenta que esto evitará que la nueva función opcional de red solo host de la ventana acoplable 0.11 funcione y que solo verá la interfaz de loopback. informe de error
Resulta que la solución a una pregunta diferente fue también la solución a esta:
... puede usar docker
ps -notrunc
para obtener el ID de contenedor lxc completo y luego usarlxc-attach -n <container_id>
ejecutar bash en ese contenedor como root.
Actualización: pronto necesitará usar ps --no-trunc
lugar de ps -notrunc
que está en desuso.
Encuentra la ID del contenedor completo
Ingrese el comando lxc attach.
Arriba muestra mi proceso de apache ejecutando esa ventana acoplable iniciada.
Primer paso para obtener la identificación del contenedor:
docker ps
Esto te mostrará algo como
CONTAINER ID IMAGEN COMANDO ESTADO CREADO NOMBRES DE PUERTOS
1170fe9e9460 localhost: 5000 / python: env-7e847468c4d73a0f35e9c5164046ad88 "./run_notebook.sh" Hace 26 segundos Hasta 25 segundos 0.0.0.0:8989->9999/tcp SLURM_TASK-303337_0
1170fe9e9460
es la identificación del contenedor en este caso.
Segundo , ingrese a la ventana acoplable:
docker exec -it [container_id] bash
así que en el caso anterior: docker exec -it 1170fe9e9460 bash
docker exec -t -i container_name /bin/bash
Te llevará a la consola de contenedores.