Entonces, si es nuevo en Docker, es posible que se pregunte cómo ejecutar un contenedor docker. Déjame mostrarte eso rápidamente.
Puede crear y ejecutar un contenedor con el siguiente comando:
docker run -it -d --name container_name image_name bash
Y luego, si desea ingresar al contenedor (para ejecutar comandos dentro del contenedor de forma interactiva), puede usar el comando docker exec:
docker exec -it container_ID_or_name /bin/bash
Aquí hay un ejemplo en el que creo un nuevo contenedor con Ubuntu como imagen base y luego entro en el contenedor de Ubuntu en ejecución y ejecuto el comando ls:
[email protected]:~$ docker run -it -d --name my_container ubuntu bash
7e77640bca686108ad415318278a1fa148e1c84d3b180276e19ec2b970ba9b67
[email protected]:~$ docker exec -it my_container bash
[email protected]:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[email protected]:/#
¿Perdió? No te preocupes. Explicaré en detalle qué hacen los dos comandos anteriores y qué es el -it
opción en el comando docker run and exec.
Cómo ejecutar el contenedor docker
Si desea ejecutar un contenedor docker con una imagen determinada y un comando específico, puede hacerlo de esta manera:
docker run -it -d --name container_name image_name bash
El comando anterior creará un nuevo contenedor con el nombre especificado de la imagen acoplable especificada. El nombre del contenedor es opcional.
- La opción -i significa que será un modo interactivo (puede ingresar comandos)
- La opción -t le da una terminal (para que pueda usarla como si usara ssh para ingresar al contenedor).
- La opción -d (modo daemon) mantiene el contenedor ejecutándose en segundo plano.
- golpe es el comando que ejecuta.
La razón para ejecutar bash como comando aquí es que el contenedor no se detendrá de inmediato.
[email protected]:~$ docker run -it -d ubuntu bash
82766613e7bc0ae98887bb1c776fa0de7f3c4771db9ac7ffc5db5c2c68ab497b
[email protected]:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
82766613e7bc ubuntu "bash" 4 seconds ago Up 3 seconds determined_blackburn
En el ejemplo anterior, no nombré el contenedor, por lo que se denominó al azar determin_blackburn.
Y como puede ver, el contenedor ejecuta el comando bash en segundo plano.
Docker Run vs Start vs Create:diferencia explicada Para un principiante de docker, términos como docker start, docker run y docker create pueden ser confusos. Este artículo explica la diferencia con ejemplos. Manual de LinuxAbhishek PrakashQué sucede si no lo ejecuta como un demonio (opción -d) en segundo plano?
Si no usa la opción -d, docker run creará un nuevo contenedor y tendrá una terminal en modo interactivo ejecutando bash shell.
Como puede ver en el ejemplo a continuación, se crea el contenedor y estoy automáticamente dentro del contenedor (bash shell).
El problema aquí es que si sales del contenedor, el contenedor se detiene.
[email protected]:~$ docker run -it ubuntu bash
[email protected]:/# echo this is a new container
this is a new container
[email protected]:/# exit
exit
[email protected]:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
82766613e7bc ubuntu "bash" 2 minutes ago Up 2 minutes determined_blackburn
[email protected]:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6098c44f2407 ubuntu "bash" 27 seconds ago Exited (0) 8 seconds ago bold_benz
82766613e7bc ubuntu "bash" 2 minutes ago Up 2 minutes determined_blackburn
¿Qué sucede si solo usa la opción -i (interactiva)?
Digamos que solo usas la opción -i. En ese caso, verá un aviso interactivo, pero si sale del aviso interactivo (usando Ctrl+D o el comando de salida), sale del contenedor y el contenedor se detiene.
[email protected]:~$ docker run -i ubuntu bash
echo "this is interactive"
this is interactive
[email protected]:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[email protected]:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b6b79a9f7789 ubuntu "bash" 27 seconds ago Exited (0) 9 seconds ago loving_galileo
¿Qué sucede si solo usa la opción -t (terminal/tty)?
Esa es una situación complicada porque en ese caso, tendrá un pseudo terminal (si usa la opción -t) pero no tendrá el STDIN. En otras palabras, no puede ingresar nada, no puede ejecutar el comando dentro del contenedor como lo hizo antes:
[email protected]:~$ docker run -t ubuntu bash
[email protected]:/# echo hello
^C^C
[email protected]:/# echo "hi"
^C^C
[email protected]:/# exit
^C^C
[email protected]:/#
Tuve que detener el contenedor desde otra terminal en el caso anterior.
Cómo salir de un contenedor de DockerEste pequeño consejo rápido de Docker muestra cómo salir de un contenedor de Docker. Manual de LinuxAbhishek PrakashCómo ejecutar un contenedor existente
El comando docker run crea un nuevo contenedor a partir de la imagen especificada. Pero, ¿qué pasa cuando ya tienes un contenedor?
Si desea ejecutar un contenedor existente, primero debe iniciar el contenedor y luego puede usar la opción exec como esta:
docker start existing_container_ID_or_name
docker exec -it existing_container_ID_or_name /bin/bash
Este ejemplo será mejor para su comprensión:
[email protected]:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b6b79a9f7789 ubuntu "bash" 7 minutes ago Exited (0) 7 minutes ago loving_galileo
[email protected]:~$ docker start b6b79a9f7789
b6b79a9f7789
[email protected]:~$ docker exec -it b6b79a9f7789 bash
[email protected]:/# echo "inside existing container"
inside existing container
[email protected]:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[email protected]:/# exit
exit
[email protected]:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b6b79a9f7789 ubuntu "bash" 8 minutes ago Up 43 seconds loving_galileo
¿Por qué usar bash todo el tiempo?
En todos los ejemplos anteriores, he usado bash o /bin/bash como el comando que se ejecuta con el contenedor. Lo usé porque proporciona un shell y cuando ejecuta el contenedor, gracias al shell, puede ejecutar comandos regulares dentro del contenedor como si estuviera dentro de un sistema Linux normal.
Puede pedirle al contenedor que ejecute cualquier comando, pero tenga en cuenta que el contenedor existe tan pronto como se completa el comando.
Como puede ver en el siguiente ejemplo, esta vez no hay una sesión de terminal interactiva. Ya no está 'dentro' del contenedor porque el comando de eco finaliza casi de inmediato.
[email protected]:~$ docker exec -it b6b79a9f7789 echo hello
hello
[email protected]:~$
De hecho, también puede ejecutar otros comandos e ingresar al contenedor después.
En el siguiente ejemplo, creé un nuevo contenedor que ejecuta el servidor nginx en el puerto 80. Dado que lo ejecuto como un demonio con la opción -d, el contenedor nginx continúa ejecutándose.
Y luego uso el comando docker exec para obtener un bash shell interactivo y así ingresar dentro del contenedor nginx (que es básicamente un Linux preconfigurado con nginx).
[email protected]:~$ docker container run -it -d -p 8000:80 nginx
262ca5b17bf8aac5afbfdf66af6383be164cd8488f8cd64c06ee466b4d7462e9
[email protected]:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
262ca5b17bf8 nginx "nginx -g 'daemon of…" 9 seconds ago Up 8 seconds 0.0.0.0:8000->80/tcp zen_kilby
b6b79a9f7789 ubuntu "bash" 20 minutes ago Up 12 minutes loving_galileo
[email protected]:~$ docker exec -it 262ca5b17bf8 bash
[email protected]:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[email protected]:/#
Espero que comprenda mejor cómo ejecutar contenedores docker y por qué usa ciertas opciones.
Si tiene preguntas o sugerencias, hágamelo saber en la sección de comentarios.