run - ¿Cómo me meto en la carcasa de un contenedor Docker?
dockers container download (24)
Estoy empezando a trabajar con Docker. Estoy usando la imagen base de WordPress y docker-compose.
Estoy tratando de ingresar a uno de los contenedores para inspeccionar los archivos / directorios que se crearon durante la compilación inicial.
Intenté ejecutar
docker-compose run containername ls -la
, pero eso no hizo nada.
Incluso si lo hiciera, prefiero tener una consola donde pueda atravesar la estructura del directorio, en lugar de ejecutar un solo comando.
¿Cuál es la forma correcta de hacer esto con Docker?
Solución interior
instale la herramienta de línea de comando
goinside
con:
sudo docker images
e ingrese a un contenedor acoplable con un tamaño de terminal adecuado con:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
bash latest 922b9cc3ea5e 9 hours ago
14.03 MB
ubuntu latest 7feff7652c69 5 weeks ago 81.15 MB
vieja respuesta
Hemos puesto este fragmento en
~/.profile
:
sudo docker run -i -t ubuntu:latest /bin/bash
Esto no solo hace que todos puedan ingresar a un contenedor con:
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
También resuelve un problema de larga duración sobre los tamaños fijos de terminales de contenedores Docker . Lo cual es muy molesto si lo enfrentas.
Además, si sigue el enlace, también tendrá que completar el comando para los nombres de los contenedores de la ventana acoplable.
Digamos que, por razones que son propias, realmente desea utilizar SSH. Toma unos pocos pasos, pero se puede hacer. Estos son los comandos que ejecutaría dentro del contenedor para configurarlo ...
apt-get update
apt-get install openssh-server
mkdir /var/run/sshd
chmod 0755 /var/run/sshd
/usr/sbin/sshd
useradd --create-home --shell /bin/bash --groups sudo username ## includes ''sudo''
passwd username ## Enter a password
apt-get install x11-apps ## X11 demo applications (optional)
ifconfig | awk ''/inet addr/{print substr($2,6)}'' ## Display IP address (optional)
Ahora incluso puede ejecutar aplicaciones gráficas (si están instaladas en el contenedor) utilizando el reenvío X11 al cliente SSH:
ssh -X username@IPADDRESS
xeyes ## run an X11 demo app in the client
Aquí hay algunos recursos relacionados:
- openssh-server no se inicia en el contenedor Docker
- ¿Cómo obtener bash o ssh en un contenedor en ejecución en modo de fondo?
- ¿Se pueden ejecutar aplicaciones GUI en un contenedor Docker?
- Otros enfoques útiles para el acceso gráfico encontrados con la búsqueda: Docker X11
- Si ejecuta SSHD en sus contenedores Docker, ¡lo está haciendo mal!
Docker
docker attach
le permitirá conectarse a su contenedor Docker, pero esto no es realmente lo mismo que
ssh
.
Si su contenedor ejecuta un servidor web, por ejemplo,
docker attach
probablemente lo conectará a la
salida estándar
del proceso del servidor web.
No necesariamente te dará una concha.
El comando
docker exec
es probablemente lo que está buscando;
Esto le permitirá ejecutar comandos arbitrarios dentro de un contenedor existente.
Por ejemplo:
docker exec -it <mycontainer> bash
Por supuesto, cualquier comando que esté ejecutando debe existir en el sistema de archivos del contenedor.
En el comando anterior,
<mycontainer>
es el nombre o ID del contenedor de destino.
No importa si está utilizando
docker compose
o no;
simplemente ejecute
docker ps
y use la ID (una cadena hexadecimal que se muestra en la primera columna) o el nombre (que se muestra en la columna final).
Por ejemplo, dado:
$ docker ps
d2d4a89aaee9 larsks/mini-httpd "mini_httpd -d /cont 7 days ago Up 7 days web
Puedo correr:
$ docker exec -it web ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
18: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:3/64 scope link
valid_lft forever preferred_lft forever
Podría lograr lo mismo ejecutando:
$ docker exec -it d2d4a89aaee9 ip addr
Del mismo modo, podría comenzar una cáscara en el contenedor;
$ docker exec -it web sh
/ # echo This is inside the container.
This is inside the container.
/ # exit
$
En algunos casos, su imagen puede estar basada en Alpine. En este caso arrojará:
OCI runtime exec falló: exec falló: container_linux.go: 348: el proceso de inicio del contenedor causó "exec: /" bash / ": archivo ejecutable no encontrado en $ PATH": desconocido
Porque
/bin/bash
no existe.
En lugar de esto, debes usar:
docker exec -it 9f7d99aa6625 ash
o
docker exec -it 9f7d99aa6625 sh
En mi caso, por alguna razón, necesito verificar toda la información involucrada en la red en cada contenedor. Por lo tanto, los siguientes comandos deben ser válidos en un contenedor ...
#usage: dbash [container_id]
dbash() {
docker exec -it "$1" /bin/bash
}
Revisé todas estas respuestas, ninguna fue útil para mí. He buscado información en otros sitios web. No agregaré un súper enlace aquí, ya que no está escrito en inglés. Así que acabo de publicar esta publicación con una solución de resumen para las personas que tienen los mismos requisitos que yo.
Digamos que tiene un contenedor en ejecución llamado prueba de luz. Sigue los pasos a continuación.
-
docker inspect light-test -f {{.NetworkSettings.SandboxKey}}
. Este comando recibirá respuesta como/var/run/docker/netns/xxxx
. -
Luego
ln -s /var/run/docker/netns/xxxx /var/run/netns/xxxx
. El directorio puede no existir, hagamkdir /var/run/netns
primero. -
Ahora puede ejecutar
ip netns exec xxxx ip addr show
para explorar el mundo de la red en el contenedor.
PD.
xxxx
es siempre el mismo valor recibido del primer comando.
Y, por supuesto, cualquier otro comando es válido, es decir,
ip netns exec xxxx netstat -antp|grep 8080
.
He creado una función de terminal para facilitar el acceso a la terminal del contenedor. Quizás también sea útil para ustedes:
Entonces el resultado es, en lugar de escribir:
$ docker exec -it <Container-Id> /bin/bash
escribirás:
$ docker exec -it <Container-Id> /bin/sh
Ponga lo siguiente en su ~ / .bash_profile (o cualquier otra cosa que funcione para usted), luego abra una nueva ventana de terminal y disfrute del acceso directo:
ip
route
netstat
ps
...
Otra opción es usar nsenter .
PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid
Para conectarse a cmd en un contenedor de Windows, use
docker exec -it d8c25fde2769 cmd
Donde d8c25fde2769 es la identificación del contenedor.
Para docker-compose up (Docker4Drupal)
docker-compose exec php bash
Yo uso
Docker para Drupal
en una computadora portátil Linux.
Después de ejecutar el contenedor, uso ''
docker-compose exec php bash
'' para conectarme con el contenedor y poder ejecutar comandos drush.
Funciona bien para mí.
Para golpear en un contenedor en ejecución, escriba esto:
docker exec -t -i container_name /bin/bash
Para inspeccionar archivos, ejecute
docker run -it <image> /bin/bash
para obtener un terminal interactivo.
La lista de imágenes se puede obtener mediante
docker images
.
A diferencia de
docker exec
esta solución funciona también en caso de que una imagen no se inicie (o se cierre inmediatamente después de ejecutarse).
SSH en un contenedor Docker con este comando:
sudo docker exec -i -t (container ID) bash
Si el contenedor ya ha salido (tal vez debido a algún error), puede hacer
$ docker run --rm -it --entrypoint /bin/ash image_name
o
$ docker run --rm -it --entrypoint /bin/sh image_name
o
$ docker run --rm -it --entrypoint /bin/bash image_name
para crear un nuevo contenedor y ponerle un caparazón. Como especificó --rm, el contenedor se eliminaría cuando salga del shell.
Si está buscando una respuesta específica de Docker Compose como yo, proporciona una manera fácil de ingresar sin tener que buscar la ID del contenedor generado.
docker-compose exec
toma el nombre del servicio según su archivo
docker-compose.yml
.
Entonces, para obtener un shell Bash para su servicio ''web'', puede hacer lo siguiente:
$ docker-compose exec web bash
Si está usando Docker Compose, esto lo llevará dentro de un contenedor Docker.
docker-compose run container_name /bin/bash
Dentro del contenedor lo llevará a WORKDIR definido en el Dockerfile. Puedes cambiar tu directorio de trabajo por
WORKDIR directory_path # E.g /usr/src -> container''s path
Si está utilizando Docker en Windows y desea obtener acceso de shell a un contenedor, use esto:
winpty docker exec -it <container_id> sh
Lo más probable es que ya tenga instalado Git Bash . Si no lo hace, asegúrese de instalarlo.
Si tiene Docker instalado con
Kitematic
, puede usar la GUI.
Abra
Kitematic
desde el icono de Docker y en la ventana de
Kitematic
seleccione su contenedor, y luego haga clic en el icono de
exec
.
También puede ver el registro del contenedor y mucha información del contenedor (en la pestaña de configuración) en esta GUI.
Usa este comando:
docker attach <container name/id here>
Utilizar:
docker exec -it containerid /bin/bash
La otra forma, aunque existe un peligro, es usar
attach
, pero si
presiona Ctrl
+
C
para salir de la sesión, también detendrá el contenedor.
Si solo quiere ver lo que está sucediendo, use los
docker logs -f
.
docker run -v /Users/<path>:/<container path>
puede interactuar con la terminal en el contenedor acoplable pasando la opción -ti
docker run --rm -ti <image-name>
eg: docker run --rm -ti ubuntu
-t significa terminal -i significa interactivo
docker exec
definitivamente será una solución.
Una manera fácil de trabajar con la pregunta que hizo es
montando el directorio dentro de Docker en el directorio del sistema local
.
Para que pueda ver los cambios en la ruta local al instante.
:~$ docker attach --help
Usage: docker attach [OPTIONS] CONTAINER
Attach to a running container
Options:
--detach-keys string Override the key sequence for detaching a container
--help Print usage
--no-stdin Do not attach STDIN
--sig-proxy Proxy all received signals to the process (default true)
Aviso : esta respuesta promueve una herramienta que he escrito.
He creado un servidor SSH en contenedores que puede ''pegar'' a cualquier contenedor en ejecución. De esta manera puedes crear composiciones con cada contenedor. El único requisito es que el contenedor tenga Bash.
El siguiente ejemplo iniciaría un servidor SSH conectado a un contenedor con el nombre ''my-container''.
docker run -d -p 2222:22 /
-v /var/run/docker.sock:/var/run/docker.sock /
-e CONTAINER=my-container -e AUTH_MECHANISM=noAuth /
jeroenpeeters/docker-ssh
ssh localhost -p 2222
Cuando se conecte a este servicio SSH (con su cliente SSH de elección), se iniciará una sesión Bash en el contenedor con el nombre ''my-container''.
Para obtener más sugerencias y documentación, consulte: https://github.com/jeroenpeeters/docker-ssh
Es simple !
Enumere todas sus imágenes de Docker:
sudo npm install -g goinside
En mi sistema mostró el siguiente resultado:
goinside docker_container_name
Tengo dos imágenes Docker en mi PC. Digamos que quiero ejecutar el primero.
goinside(){
docker exec -it $1 bash -c "stty cols $COLUMNS rows $LINES && bash";
}
export -f goinside
Esto le dará el control terminal del contenedor.
Ahora puede hacer todo tipo de operaciones de shell dentro del contenedor.
Al igual que hacer
ls
generará todas las carpetas en la raíz del sistema de archivos.
goinside containername
docker exec -it [container_id] /bin/bash
O dependiendo del caparazón, puede ser
dbash [container_id]
Puede obtener el
ID
del
contenedor a
través del comando
docker ps
-i
= interactivo
-t
= para asignar un psuedo-TTY