Compartir comentarios
Las respuestas se generan en base a la documentación.

Ejecuta tu imagen de Rust como un contenedor

Prerrequisito

Has completado Compila tu imagen de Rust y has compilado una imagen.

Resumen

Un contenedor es un proceso normal del sistema operativo, excepto que Docker aísla este proceso para que tenga su propio sistema de archivos, su propia red y su propio árbol de procesos aislado e independiente del host.

Para ejecutar una imagen dentro de un contenedor, utilizas el comando docker run. El comando docker run requiere un parámetro, que es el nombre de la imagen.

Ejecutar una imagen

Utiliza docker run para ejecutar la imagen que compilaste en Compila tu imagen de Rust.

$ docker run docker-rust-image-dhi

Después de ejecutar este comando, notarás que no volviste al prompt de la línea de comandos. Esto se debe a que tu aplicación es un servidor que se ejecuta en un bucle esperando solicitudes entrantes sin devolver el control al sistema operativo hasta que detengas el contenedor.

Abre una nueva terminal y realiza una solicitud al servidor utilizando el comando curl.

$ curl http://localhost:8000

Deberías ver una salida como la siguiente.

curl: (7) Failed to connect to localhost port 8000 after 2236 ms: Couldn't connect to server

Como puedes ver, tu comando curl falló. Esto significa que no pudiste conectarte a localhost en el puerto 8000. Esto es normal porque tu contenedor se está ejecutando de forma aislada, lo que incluye la red. Detén el contenedor y reinícialo con el puerto 8000 publicado en tu red local.

Para detener el contenedor, presiona ctrl-c. Esto te devolverá al prompt de la terminal.

Para publicar un puerto para tu contenedor, utilizarás la bandera --publish (o -p para abreviar) en el comando docker run. El formato del comando --publish es [puerto del host]:[puerto del contenedor]. Por lo tanto, si quisieras exponer el puerto 8000 dentro del contenedor al puerto 3001 fuera del contenedor, pasarías 3001:8000 a la bandera --publish.

No especificaste un puerto al ejecutar la aplicación en el contenedor y el valor predeterminado es 8000. Si deseas que funcione tu solicitud anterior dirigida al puerto 8000, puedes mapear el puerto 3001 del host al puerto 8000 del contenedor:

$ docker run --publish 3001:8000 docker-rust-image-dhi

Ahora, vuelve a ejecutar el comando curl. Recuerda abrir una nueva terminal.

$ curl http://localhost:3001

Deberías ver una salida como la siguiente.

Hello, Docker!

¡Éxito! Pudiste conectarte a la aplicación que se ejecuta dentro de tu contenedor en el puerto 8000. Regresa a la terminal donde se está ejecutando tu contenedor y deténlo.

Presiona ctrl-c para detener el contenedor.

Ejecutar en modo detached

Esto es genial hasta ahora, pero tu aplicación de muestra es un servidor web y no tienes que estar conectado al contenedor. Docker puede ejecutar tu contenedor en modo desacoplado (detached) o en segundo plano. Para hacer esto, puedes usar --detach (o -d para abreviar). Docker inicia tu contenedor de la misma manera que antes, pero esta vez se "desacoplará" del contenedor y te devolverá al prompt de la terminal.

$ docker run -d -p 3001:8000 docker-rust-image-dhi
3e4830e7f01304811d97dd3469d47a0c7a916a8b6c28ce0ef19c6f689a521144

Docker inició tu contenedor en segundo plano e imprimió el ID del contenedor (Container ID) en la terminal.

De nuevo, asegúrate de que tu contenedor se esté ejecutando correctamente. Ejecuta el comando curl de nuevo.

$ curl http://localhost:3001

Deberías ver una salida como la siguiente.

Hello, Docker!

Listar contenedores

Dado que ejecutaste tu contenedor en segundo plano, ¿cómo sabes si tu contenedor está en ejecución o qué otros contenedores se están ejecutando en tu máquina? Bueno, para ver una lista de contenedores que se ejecutan en tu máquina, ejecuta docker ps. Esto es similar a cómo utilizas el comando ps en Linux para ver una lista de procesos.

Deberías ver una salida como la siguiente.

CONTAINER ID   IMAGE                   COMMAND                  CREATED          STATUS          PORTS                                         NAMES
3e4830e7f013   docker-rust-image-dhi   "/server"                23 seconds ago   Up 22 seconds   0.0.0.0:3001->8000/tcp, [::]:3001->8000/tcp   youthful_lamport

El comando docker ps proporciona una gran cantidad de información sobre tus contenedores en ejecución. Puedes ver el ID del contenedor, la imagen que se ejecuta dentro del contenedor, el comando que se utilizó para iniciar el contenedor, cuándo se creó, el estado, los puertos que se expusieron y el nombre del contenedor.

Probablemente te estés preguntando de dónde viene el nombre de tu contenedor. Como no proporcionaste un nombre para el contenedor cuando lo iniciaste, Docker generó un nombre aleatorio. Corregiremos esto en un minuto, pero primero debes detener el contenedor. Para detener el contenedor, ejecuta el comando docker stop que hace justamente eso, detener el contenedor. Debes pasar el nombre del contenedor o puedes usar el ID del contenedor.

$ docker stop youthful_lamport
youthful_lamport

Ahora, vuelve a ejecutar el comando docker ps para ver una lista de los contenedores en ejecución.

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

Detener, iniciar y nombrar contenedores

Puedes iniciar, detener y reiniciar contenedores de Docker. Cuando detienes un contenedor, este no se elimina, sino que el estado cambia a detenido y el proceso dentro del contenedor se detiene. Cuando ejecutaste el comando docker ps en el módulo anterior, la salida predeterminada solo mostraba los contenedores en ejecución. Cuando pasas la bandera --all (o -a para abreviar), verás todos los contenedores en tu máquina, independientemente de su estado de inicio o parada.

$ docker ps -a
CONTAINER ID   IMAGE                   COMMAND                  CREATED              STATUS                          PORTS                                         NAMES
3e4830e7f013   docker-rust-image-dhi   "/server"                About a minute ago   Exited (0) 28 seconds ago                                                     youthful_lamport
60009b7eaf40   docker-rust-image-dhi   "/server"                2 minutes ago        Exited (0) About a minute ago                                                 sharp_noyce
152e1d7d9eea   docker-rust-image-dhi   "/server ."              4 minutes ago        Exited (0) 2 minutes ago                                                      magical_bhabha

Ahora deberías ver varios contenedores listados. Estos son contenedores que iniciaste y detuviste pero que no has eliminado.

Reinicia el contenedor que acabas de detener. Localiza el nombre del contenedor que acabas de detener y reemplázalo en el siguiente comando de reinicio.

$ docker restart youthful_lamport

Ahora vuelve a listar todos los contenedores utilizando el comando docker ps --all.

$ docker ps --all
CONTAINER ID   IMAGE                   COMMAND                  CREATED             STATUS                         PORTS                                         NAMES
3e4830e7f013   docker-rust-image-dhi   "/server"                3 minutes ago       Up 7 seconds                   0.0.0.0:3001->8000/tcp, [::]:3001->8000/tcp   youthful_lamport
60009b7eaf40   docker-rust-image-dhi   "/server"                4 minutes ago       Exited (0) 3 minutes ago                                                     sharp_noyce
152e1d7d9eea   docker-rust-image-dhi   "/server ."              5 minutes ago       Exited (0) 4 minutes ago                                                     magical_bhabha

Observa que el contenedor que acabas de reiniciar se ha iniciado en modo desacoplado (detached). Además, observa que el estado del contenedor es "Up X seconds" (Activo hace X segundos). Cuando reinicias un contenedor, se inicia con las mismas banderas o comandos con los que se inició originalmente.

Ahora, detén y elimina todos tus contenedores y veamos cómo solucionar el problema del nombre aleatorio. Detén el contenedor que acabas de iniciar. Busca el nombre de tu contenedor en ejecución y reemplázalo en el siguiente comando con el nombre del contenedor en tu sistema.

$ docker stop youthful_lamport
youthful_lamport

Ahora que has detenido todos tus contenedores, elimínalos. Cuando eliminas un contenedor, este ya no se está ejecutando ni se encuentra en estado detenido, sino que el proceso dentro del contenedor se ha detenido y los metadatos del contenedor se han eliminado.

Para eliminar un contenedor, ejecuta el comando docker rm con el nombre del contenedor. Puedes pasar múltiples nombres de contenedores al comando en una sola línea. De nuevo, reemplaza los nombres de los contenedores en el siguiente comando con los nombres de los contenedores de tu sistema.

$ docker rm youthful_lamport sharp_noyce magical_bhabha
youthful_lamport
sharp_noyce
magical_bhabha

Ejecuta el comando docker ps --all de nuevo para ver que Docker eliminó todos los contenedores.

Ahora, es el momento de abordar el problema del nombre aleatorio. La práctica estándar es nombrar tus contenedores por la sencilla razón de que es más fácil identificar qué se está ejecutando en el contenedor y con qué aplicación o servicio está asociado.

Para nombrar un contenedor, solo necesitas pasar la bandera --name al comando docker run.

$ docker run -d -p 3001:8000 --name docker-rust-container docker-rust-image-dhi
1aa5d46418a68705c81782a58456a4ccdb56a309cb5e6bd399478d01eaa5cdda
$ docker ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED         STATUS         PORTS                                         NAMES
219b2e3c7c38   docker-rust-image-dhi   "/server"                6 seconds ago   Up 5 seconds   0.0.0.0:3001->8000/tcp, [::]:3001->8000/tcp   docker-rust-container

¡Así está mejor! Ahora puedes identificar fácilmente tu contenedor basándote en el nombre.

Resumen

En esta sección, vimos cómo ejecutar contenedores. También vimos cómo administrar contenedores al iniciarlos, detenerlos y reiniciarlos. Y finalmente, vimos cómo nombrar tus contenedores para que sean más fácilmente identificables.

Información relacionada:

Pasos siguientes

En la siguiente sección, aprenderás cómo ejecutar una base de datos en un contenedor y conectarla a una aplicación Rust.