Posted by q3it on miércoles, diciembre 01, 2021 in Micro-servicios
El ciclo de vida de aplicaciones en contenedor es una trayectoria que empieza por el desarrollador. El desarrollador decide implementar contenedores y Docker, ya que así se eliminan las fricciones en las implementaciones y las operaciones de TI, lo que, en última instancia, ayuda a todos los usuarios a ser más ágiles, más productivos de un extremo a otro y más rápido. [1]
Podemos decir que los diferentes estados que este puede manejar un contenedor son: Created, Running, Stopped, Paused, Killed.
Cada vez que un contenedor se ejecuta, este ejecuta un proceso del sistema operativo y se lo considera el proceso principal, el ciclo de vida de un contenedor dependerá de la ejecución de este, veamos un ejemplo, ejecutemos un contenedor con ubuntu con el siguiente comando:
docker run ubuntu tail -f /dev/null —> Para no ejecutar el comando por defecto, le podemos decir que se ejecute y no se apague. La terminal se queda congelada.
tail —> es para que se muestre el contenido de un archivo.
-f —> le dice al bash que arroje lo que tenga y que se quede esperando a que llegue algo nuevo.
/dev/null —> este archivo es curioso, se le conoce como el barril sin fondo por que todo lo que caiga ahí se pierde.
El resultado de ejecutar estos comandos dio como resultado que ubuntu está corriendo.
Se puede visualizar desde otra terminal tecleando docker ps.
para ejecutar un comando en un contenedor existente. -it para que sea de forma interactiva.
docker exec -it "nombre contenedor" bash
ps -fea —> Para ver procesos de todas las sesiones. Docker siempre por defecto le asigna el PID (ID del proceso) 1 al comando que corre con el contenedor, ahí esta la clave de cuando se apaga el contenedor. Todo contenedor tiene un root COMMAND, cuando haga exit se va apagar el contenedor.
Si queremos ejecutar otras acciones podemos teclear lo siguiente:
exit —> Salir del contenedor. Puedo hacer 2 cosas:
docker rm -f <nombre contenedor> —> Elima brutalmente el contenedor. El -f significa “Si esta corriendo no me importa”
docker kill <nombre contenedor> —> Manda una señal de matar el proceso. Si un contenedor se apaga es porque hubo un error en el proceso root e hizo exit o terminó de hacer lo que tenia que hacer.
Los contenedores están aislados del sistema y a nivel de red, cada contenedor tiene su propia stack de net y sus propios puertos.
Debemos redirigir los puertos del contenedor a los de la computadora y lo podemos hacer al utilizar este comando:
docker run -d --name server -p 8080:00 nombreDelContenedor
para este ejemplo vamos a correr un servidor nginx.
docker run --detach --name server nginx —> Esto crea el contenedor y lo corre.
docker run --detach --name server nginx —> Esto crea el contenedor y lo corre.
-d o --detach —> Si el contenedor que voy a ejecutar tiene un proceso que tiene output y/o pretende correr en modo interactivo, lo va omitir, me va dar el control de la terminal.
Después de ejecutar el proceso, el ultimo número largo que aparece en la terminal esta en formato SHA, lo usa docker para generar los números de IDs únicos.
El ID del contenedor son los primeros números del SHA.
Aparece PORTS (Esta exponiendo un puerto para que se comuniquen con el).
Los contenedores también están aislados a nivel de red. El que un contenedor tenga un puerto abierto no implica que ese puerto este abierto en la maquina esperando por conexiones hacia ese contenedor. Lo que tenemos que hacer es decirle explícitamente que desde tal puerto de mi computadora vaya hacia el puerto del contenedor.
docker run -d --name server -p 8080:80 nginx
-p —> esta bandera es para atar los puertos y también significa que es pública. Primero el de mi maquina y después el del contenedor.
Ahora en PORTS aparece que puerto de mi maquina está dirigiendo hacia el puerto del contenedor.
En el navegador localhost:8080 y ya puedo ver nginx.
Nota: No puedo asignar más de un contenedor a un mismo puerto.
[1] Referencia web —> https://docs.microsoft.com/es-es/dotnet/architecture/containerized-lifecycle/docker-application-lifecycle/