docker-container tag - ¿Cómo me meto en un contenedor Docker?




example hub (18)

Si está utilizando 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

Estoy empezando a trabajar con Docker. Estoy usando la imagen base de WordPress y componer en docker.

Estoy tratando de guardar en 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, preferiría 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?


Para golpear en un contenedor en ejecución, escriba esto:

docker exec -t -i container_name /bin/bash

Si el contenedor ya ha salido (quizás debido a algún error), puede hacerlo

$ 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 obtener un shell en él. Ya que especificó --rm, el contenedor se eliminaría cuando salga del shell.


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 tengas Git Bash instalado. Si no lo hace, asegúrese de instalarlo.


Otra opción es usar nsenter .

PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid

¡Es simple !

Lista de todas sus imágenes de Docker:

sudo docker images

En mi sistema mostró el siguiente resultado:

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

Tengo dos imágenes de Docker en mi PC. Digamos que quiero correr el primero.

sudo docker run -i -t ubuntu:latest /bin/bash

Esto le dará control terminal del contenedor. Ahora puedes hacer todo tipo de operaciones de shell dentro del contenedor. Al igual que hacer ls generarán todas las carpetas en la raíz del sistema de archivos.

bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

SSH en un contenedor Docker usando este comando:

sudo docker exec -i -t (container ID) bash

Para inspeccionar archivos, ejecute la docker run -it <image> /bin/bash para obtener un terminal interactivo. La lista de imágenes se puede obtener por docker images . Al contrario que 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).


docker exec definitivamente será una solución. Una forma fácil de trabajar con la pregunta que hizo es montar el directorio dentro de Docker en el directorio del sistema local .

Para que pueda ver los cambios en la ruta local al instante.

docker run -v /Users/<path>:/<container path> 

Para docker-compose up (Docker4Drupal)

docker-compose exec php bash

Uso Docker para Drupal en una computadora portátil con Linux. Después de ejecutar el contenedor, utilizo ' docker-compose exec php bash ' para conectarme con el contenedor para poder ejecutar comandos drush. Funciona bien para mí.


Digamos que, por razones 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) usando el reenvío X11 al cliente SSH:

ssh -X [email protected]
xeyes ## run an X11 demo app in the client

Aquí hay algunos recursos relacionados:


Si tiene Docker instalado con Kitematic , puede usar la GUI. Abra Kitematic desde el ícono de Docker y en la ventana de Kitematic seleccione su contenedor, y luego haga clic en el ícono 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.


Para conectarse a cmd en un contenedor de Windows, use

docker exec -it d8c25fde2769 cmd

Donde d8c25fde2769 es el ID del contenedor.


En mi caso, por alguna razón, necesito verificar toda la información relacionada con la red en cada contenedor. Así que los siguientes comandos deben ser válidos en el contenedor ...

ip
route
netstat
ps
...

Revisé todas estas respuestas, no es válido 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 el mismo requisito que yo.

Digamos que tienes un contenedor en ejecución llamado light-test. Siga los pasos a continuación.

  • docker inspect light-test -f {{.NetworkSettings.SandboxKey}} . Este comando obtendrá una respuesta como /var/run/docker/netns/xxxx .
  • Luego ln -s /var/run/docker/netns/xxxx /var/run/netns/xxxx . Es posible que el directorio no exista, primero haga mkdir /var/run/netns .
  • Ahora puede ejecutar ip netns exec xxxx ip addr show para explorar el mundo de la red en un contenedor.

PD. xxxx es siempre un mismo valor obtenido a través del primer comando. Y, por supuesto, cualquier otro comando es válido, es decir, ip netns exec xxxx netstat -antp|grep 8080 .


Aviso : esta respuesta promueve una herramienta que he escrito.

He creado un servidor SSH en contenedor 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 adjunto 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 el cliente SSH de su elección), se iniciará una sesión de Bash en el contenedor con el nombre 'my-container'.

Para obtener más consejos y documentación, consulte: https://github.com/jeroenpeeters/docker-ssh


docker attach te permitirá conectarte a tu contenedor Docker, pero esto no es realmente lo mismo que ssh . Si su contenedor está ejecutando un servidor web, por ejemplo, la conexión de la ventana docker attach probablemente lo conectará con 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 contenedor.

En el comando anterior <mycontainer> es el nombre o ID del contenedor de destino. No importa si está utilizando o no la docker compose ; simplemente ejecute el docker ps y use el 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

Yo podría lograr lo mismo ejecutando:

$ docker exec -it d2d4a89aaee9 ip addr

Del mismo modo, podría iniciar un shell en el contenedor;

$ docker exec -it web sh
/ # echo This is inside the container.
This is inside the container.
/ # exit
$

Si está aquí buscando una respuesta específica de Docker Compose como lo estaba yo, proporciona una manera fácil de ingresar sin tener que buscar el ID de 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:

$ docker-compose exec web bash

El uso de ambos es una parte importante de las pruebas de entrega de aplicaciones. Estoy empezando a involucrarme con Docker y estoy pensando mucho en un equipo de aplicaciones que tiene una complejidad terrible en la creación y entrega de su software. Piense en una situación clásica de Proyecto de Phoenix / Entrega continua.

El pensamiento va algo así:

  • Tome un componente de la aplicación Java / Go y créelo como un contenedor (tenga en cuenta, no está seguro si la aplicación debe estar integrada en el contenedor o construirse luego en el contenedor)
  • Entregar el contenedor a una máquina virtual Vagrant.
  • Repita esto para todos los componentes de la aplicación.
  • Iterar en el (los) componente (s) para codificar.
  • Pruebe continuamente el mecanismo de entrega a las máquinas virtuales administradas por Vagrant
  • Duerma bien sabiendo que es hora de implementar el contenedor, que las pruebas de integración se estaban realizando de forma mucho más continua que antes de Docker.

Esta parece ser la extensión lógica de la afirmación de Mitchell de que Vagrant es para el desarrollo combinado con el pensamiento de Farley / Humbles en la entrega continua. Si yo, como desarrollador, puedo reducir el ciclo de retroalimentación sobre las pruebas de integración y la entrega de aplicaciones, se aplicará una mejor calidad y mejores entornos de trabajo.

El hecho de que, como desarrollador, ofrezco contenedores de forma constante y constante a la máquina virtual y que la prueba sea más holística significa que las versiones de producción se simplificarán aún más.

Así que veo a Vagrant evolucionar como una forma de aprovechar algunas de las increíbles consecuencias que Docker tendrá para el despliegue de aplicaciones.





docker docker-container