DOCKERS
Contenedor?
Empaquetar nuestras aplicaciones y dependencias
Instalar Docker desktop
Es una máquina virtual optimizada que corre Linux
Docker compose contiene una línea de comandos
Instalar Docker desktop
¿Qué es Docker hub?
En la página de Docker podemos encontrar mas de 100,000 contendores que podemos usar.
Entre ellos Ubuntu, mongoDB, NodeJS, etc.
Entramos a NodeJS
Podemos ver las distintas versiones de NodeJS que podemos descargar y utilizar
inmediatamente.
Descargara la ultima version de la imagen de Docker,hay que especificar cual se desea si no se
quiere la ultima.
docker pull node
Ultima version de node según la lista :
Comandos para gestionar las imágenes
Docker images
En este caso ya bajamos 2 imagenes
Para descargar imagen
Docker pull node
Docker descargara cada una de las capas de la imagen. Si hay otra imagen que coinciden en
capas que ya se han descargado no se descargaran.
De esta forma descargaras la ultima
REPOSITORY ->
TAG ->
IMAGE ID -> identificador unico
CREATED -> fecha de creacion
SIZE -> espacio en disco duro
Para bajar una imagen de una versión especifica se usa: y luego le nro de la versión
Docker pull node:[version]
Se está descargando solo el resto de la imagen que falta, ya que habíamos descargado un node
anterior.
Bajamos otro node, la 19
Tenemos que saber el nombre de la imagen que debemos descargar
Para saber los nombres debemos entrar a Docker hub
Para eliminar las imágenes descargadas
Docker image rm node:19
Esto eliminara la imagen de Node versión 19
CREAR UN CONTENEDOR EN BASE A LA IMAGEN QUE DESCARGUEMOS
Para crear un contenedor primero necesitamos una imagen. Descargaremos la imagen de
mongo con
Docker pull mongo
Se selecciono mongo para el ejemplo por que no tiene tantas imágenes de configuración
Para crear docker
docker créate mongo
con esta línea creas un contenedor y su identificador de container
hay que guardar ese código por que servirá para ejecutar el contenedor
Docker create mongo es una forma abreviada de escribir:
docker container create mongo
para inicializar docker
Para inicializar el contenedor debemos usar docker start tal como se muestra abajo:
docker start
9d70bbde67aa2f97952d97bdb5e942a8f36180cc6149403a824ea7
f418b508ca
aquí utilizado en el terminal:
Visualizar los contenedores inicializados
Para mostrar los containeres que están inicializados debemos usar docker ps, de esa forma
verificamos que está ejecutándose.
docker ps
Las columnas que se visualizan en la table son:
Id container => identificador del contenedor(short)
Image => en base a que imagen se ha creado nuestro contenedor
Command => comando que usa el contenedor para ejecutarse
Created => fecha de creación
Status => estado
Ports => el puerto que utiliza 17017 es el que usa mongo para clientes o aplicaciones que se
puedan conectarse a el
Names => nombre del contenedor
Detener la ejecución de un contenedor
Lo detenemos con la instruccion
Docker stop [container id]
Luego vemos la lista y no tenemos contenedores
Mostrar los contenedores de nuestro sistema así no se estén ejecutando
Docker ps -a
Permite listar los contenedores así no se estén utilizando
Los campos de la tabla so:
Container id => id del contenedor
Image => baso en la imagen de mongo
Command => el commando que se esta utilizando para correr
Created => hace cuanto se ha creado
Status => indica hace cuanto tiempo se ha desconectado
Port => no hay ninguno
Names => el nombre que se esta utilizando
Para poder hacer referencia a este contenedor podemos usar el nombre o el id
En este caso estamos borrando el contenedor llamado sad_turing
Docker rm sad_turing
Luego Podemos listar con
Docker ps -a
Ahora veremos que no se nos muestra nada
Asignando un nombre al contenedor
También podemos crear u contenedor asignándole un nombre
Podemos usar
Docker create –name moguito mongo
Donde estamos diciendo que cree utilizando un nombre que será moguito basado en la
imagen de mongo.
Esta operación devuelve el id del contenedor. Pero ahora podemos no usarlo ya que tenemos
el nombre: monguito
Para inicializarlo usaríamos start
docker start monguito
Ahora cuando usemos el comando
docker ps
Aparecerá monguito como un contenedor activado corriendo hace 31 segundos
Si intentadamos acceder a este contenedor para utilizar mongo y empezar a guardar datos
dentro de esta base de datos no vamos a poder
La razón es que no se encuentra ningún puerto publicado o abierto para que podamos utilizar
este contenedor. A pesar que se muestra que el contenedor esta usando el puerto 27017
Necesitamos indicar un puerto de nuestro computador físico el cual vamos a mapear a un
contenedor
PORT MAPPING
Cuando nosotros recibimos una conexión por algún puerto de nuestra maquina y queremos
mapearlo a algún puerto de uno de nuestros contenedores.
Tenemos 2 aplicaciones comunicándose por el puerto 3000 y una aplicación de mongoDB por
el puerto 27017
Las aplicaciones de nodeJS pueden estar comunicándose de manera interna con mongoDB
Que pasaría si queremos comunicarnos a las 2 aplicaciones de node ?
Ambas aplicaciones corren en el puerto 3000, esto es válido. Aquí tendríamos que hacer un
port mapping
Donde las conexiones que recibamos desde afuera por ejemplo desde el puerto 3000 la
mapeemos hasta la primera aplicación node . Otra conexión puede ser recibida en el puerto
3001 pueda ser redireccionada al contenedor de la siguiente aplicación de nodeJS
De estra forma las conexiones que van al puerto 3000 van a la primera aplicación y las
conexiones que van al puerto 3001 van a la segunda aplicación
Si ndeseamos podríamos hacer lo mismo para el servidor de mongoDB a travez del puerto
externo 27017
La idea es que los puertos de la computadora estén asociados los puertos de las aplicaciones
Eliminamos monguito y nos quedamos sin contenedores. Primero se detiene y luego se elimina
Podemos crear un nuevo contenedor mapeando puertos
-p => significa publish
27017 => El primer puerto es el puerto de nuestra maquina
: 27017 => El segundo puerto es el puerto del contenedor
--name => para colocar el nombre
monguito => es el nombre
mongo => El nombre de la imagen usado como base para crear el contenedor
Podemos inicializar monguito con start
Ahora inicializado podemos visualizar monguito. Ademas podemos ver en la columna de ports
Aquí dice que la ip [Link]. que viene a ser nuestra maquina con el puerto 27017 está
mapeando al puerto al puerto 17017 del contenedor monguito
Existe la opción de no definir el puerto del contenedor monguito y se creara el mapeo pero
con un puerto que Docker decida
Como saber si el servidor de mongo se ejecutó de manera correcta
Docker logs monguito
Donde monguito es el nombre del contenedor. –follow sirve para mantenerse observado
cambios en el log de monguito
Comando que combina pull, create y start
Se debe detener y eliminar . también borrar la imagen e mongo
Docker run mongo
Vera si se encuentra la imagen , la descarga si la imagen no existe luego creara un contenedor
y lo inicializara. Nos dejara ejecutando logs si salimos dejara de ejecutarse.
Docker run -d mongo
En modo detache donde no mostrara log y nos mandara a línea
de comando con -d
SIGUIENTE SECCION
Mongoose es una librería que sirve para conectar express con mongoDB.
También definimos un modelo que tiene como atributos tipo string y estado string también
En la url se define que
El usuario es nico
La contraseña es password
Luego la arroba
Indica la maquina a la cual quiere que me conecte localhost para hacer las consultas y registrar
Después de los dos puntos indico el puerto 27017
Indicó la base de datos en este caso miapp
Y un parámetro de configuración que es un usuario de tipo administrador
La finalidad es que la aplicación se pueda conectar con una instancia de mongo pero que se
encuentre dentro de un container de Docker. De esta forma no nos tendremos que descargar
mongo. De esta forma usaremos los recursos de Docker para conectar a mongo a través de
Docker (48:38)
La aplicación tiene 2 endpoints o rutas:
Cuando este en la raíz buscara todos los animales que se encuentren en la base de datos
Luego las devolverá
El siguiente endpoint /crear que creara un objeto de tipo chanchito y con el estado feliz
Luego devolverá un string ok
El objetivo es que la aplicación se puede conectar con una instancia de mongo que se
encuentre dentro de un container de Docker (que no tengamos que descargar una aplicación
de mongo). Que utilicemos las funcionalidades que ofrece Docker par poder conectar nuestra
aplicación a mongo, pero con Docker.
Ahora debemos ir a Docker hub y buscar mongo
Ya que necesitamos algunos parámetros de configuración cuando estemos creando nuestro
contenedor para acceder a la base de datos.
En la página de mongo en Docker hub podemos encontrar los pasos para configurar docker en
mongo
Todas las imágenes se configuran distinto
En el caso de mongo necesitamos las dos variables que se indican abajo
Eliminamos todos los contenedores
Descargamos la imagen de mongo
Docker pull mongo
Ahora crearemos un contenedor configurado para que nos podamos conectar
Creamos un contenedor usando el comando create
Docker create -p27017:27017 –name monguito -e
MONGO_INITDB_ROOT_USERNAME=nico -e
MONGO_INITDB_ROOT_PASSWORD=password mongo
-e significa variable de entorno
Ahora en visual code
Creamos un proyecto. vamos a una carpeta de tu elección
En teminal
Npm init -y
Npm I express mongoose
Escribir el código que se mostró con anterioridad
Configurar [Link]
En terminal
Npm start
En el navegador al ir a la raíz solo se verá un array vacío pero si luego vas a crear se generará
un objeto chanchito feliz
En el terminal podemos ver
De esta forma se crea un contenedor de mongo de manera exitosa
Nuestras aplicaciones se pueden conectar a el ya que no debemos descargar ni instalar por
que eso nos lo da Docker.
AHORA VEREMOS COMO COLOCAR LA APLICACIÓN CONSTRUIDA EN NODEJS Y METERLA EN
UN CONTAINER
Se crea un archivo llamado Dockerfile, esto es necesario
Y se utiliza para escribir las instrucciones para crear nuestros contenedores
Siempre que creemos una imagen se debe basar en otra imagen
En este ejercicio vamos a querer que nuestra imagen se base en node
From node => quiere decir que se base en node(el nombre de la imagen)
FROM node:18
Ahora debemos crear una carpeta donde coloquemos nuestro código fuente base
Para eso creamos una carpeta utilizando
RUN mkdir -p /home/app
Esta ruta esta dentro del mismo contenedor que viene a ser una distribución de linux
Esto no hace referencia a tu maquina física
No hace referencia a tu sistema de archivos
Hace referencia al contenedor que estamos creando ahora
En la carpeta/home/app meteremos el código fuente de nuestra aplicación
Como dijimos, en la ruta /home/app es donde meteremos el código fuente de nuestra
aplicación, incluso la carpeta node_modules
ahora tenemos que indicar de donde va a sacar el código fuente que meteremos dentro de
este contenedor
RUN permite ejecutar instrucciones del S.O. de Linux, pero COPY nos permitirá acceder a los
archivos del sistema operativo anfitrión(Windows , Linux o macOS) lo cual tomara los archivos
de nuestro SO y los meterá adentro de nuestro contenedor.
COPY es una instrucción que sirve para definir de dónde vienen los archivos de la aplicación
que están en el sistema operativo anfitrión
. -> El punto indica la ruta de código fuente, punto indica el lugar actual ya que nos
encontramos en la raíz de la aplicación con el terminal
/home/app -> viene a ser el destino donde voy a colocar el código fuente
COPY . /home/app
Ahora debemos exponer un puerto para que otros contenedores o incluso desde nosotros
desde el sistema operativo anfitrión nos podamos conectar a este contenedor
Esto se hace con la instrucción EXPOSE y el puerto de la aplicación
EXPOSE 3000
Luego utilizar el comando CMD que se debe ejecutar para que la aplicación corra
CMD [“node”, ”/home/app/[Link]”]
El comando es: node
y sus argumentos son la ruta completa /home/app/[Link]
Se tiene que indicar la ruta completa
Hasta aquí no se podrá ejecutar y eso es por que :
Los contenedores no necesariamente se podrán comunicar entre si. Cada uno de ellos puede
estar isolado uno del otro. Pueden tener comunicación hacia afuera con el mapeo de los
puertos, pero no pueden comunicarse entre ellos.
Para que los contenedores se comuniquen entre si se debe agrupar los contenedores a través
de una red interna de Docker(en la imagen se llamara mi red)
Los contenedores dentro de una red se van a poder comunicar entre si
Se puede tener más de una red cada una puede contener distintos contenedores que se estén
comunicando entre si
El archive dockerfile debería quedar asi
Con el comando network ls podemos listar todas las redes
docker network ls
Ahora crearemos nuestra red
docker network create mired
para eliminar una red
docker network rm mired
La forma que tienen los contenedores para comunicarse entre si .cuando los contenedores
se encuentran dentro de una misma red interna de docker es mediante el nombre del
contenedor
Esto quiere decir que el nombre del dominio del contenedor va a ser el mismo que el nombre
que nosotros se asignamos cuando creamos el contenedor
Tenemos que volver al código fuente y cambiar la ruta que usamos para conectarnos a mongo
Por
Se reemplazo el nombre del dominio (localhost) por el nombre del contenedor(monguito)
AHORA CREAREMOS LA IMAGEN DE NUESTRAS APLICACION
Luego en el terminal utilizar el comando build
Docker build se utiliza para poder crear imágenes en base a un archivo dockerfile que nosotros
hayamos creado antes
Recibe dos argumentos
docker build -t miapp:1 .
-t se usa para definir un nombre, el nombre es miapp
Luego sigue : y la etiqueta(que entiendo que puede ser un nombre o un numero de version de la
imagen como latest, 1, o 1.01)
el punto busca definir la ubicación del archivo Dockerfile, como estamos posicionados en la
raíz y allí mismo se encuentra dockerfile entonces usamos el punto
docker build -t [nombre]:[etiqueta] [ubicación de Dockerfile]
para saber si la imagen se creo correctamente
docker images
Ahora cada vez qyue creemos un contenedor debemos indicarle que pertenecen a una red en
especifico. Por lo tanto el contenedor monguito que creamos antes no nos va a servir asi que
debemos eliminarlo.
Debemos crear un contenedor que se encuentre vinculado a la red mired que creamos
anteriormente
Eliminamos monguito con Docker rm monguito, por que no tiene definido la red mired
Creamos otra vez monguito definiendo network mired
Ahora crearemos el contenedor de la aplicación que nosotros acabamos de colocar dentro de
una imagen