Docker Run / Docker Images
Obtener y ejecutar contenedores a partir de imágenes
Marcelo Denis
Ing. Informático


@mdrm016

mdrm016@gmail.com
Overview
- Estructura de Docker
- Estados de un contenedor

- Docker Run
- Docker Images
- Imágenes oficiales
- Dockerfile
- Instrucciones de Dockerfile
- Ejercicios
- Ejecutar con contenedor con una BD
- Ejecutar un contenedor con un API REST
- Ejecutar un contenedor con un Frontend
Docker Run
Estructura de Docker

Hello World

El Modo Iterativo



Estados de un Contenedor
El contenedor se creo sin errores pero no esta corriendo.
Este estado es útil para cuando queremos crear un contenedor pero todavía no utilizarlo.
Created
Estados de un Contenedor
El contenedor se esta reiniciando.
Este estado puede darse en el caso que desde un comando reiniciemos el contenedor o bien por un error relacionado a código en el mismo.
Restarting
Estados de un Contenedor
Nuestro contenedor esta creado y corriendo sin ningún problema.
Running
Estados de un Contenedor
El contenedor se esta removiendo pero todavía sigue creado, en este momento ya no podemos acceder al mismo.
Removing
Estados de un Contenedor
El contenedor esta creado pero pausado.
En este estado podemos acceder al contenedor pero su código no está en ejecución.
Paused
Estados de un Contenedor
Podemos llegar a este estado porque el container termino de ejecutar su código de forma correcta o bien porque se encontró con algún problema durante su ejecución.
Si su “status code” es 0 quiere decir que el container termino sin problemas, cualquier otro numero distinto de 0 implica que el container no termino su ejecución de forma correcta.
Exited
Estados de un Contenedor
Es el estado terminal del container.
Usualmente se da cuando el container pierde acceso de escritura a archivos necesarios para funcionar.
Dead
Ejecutar un Main Process


Nombre del contenedor
Parámetro para ejecutar en segundo plano
Nombre de la imagen
Comando del main process
Estado del Contenedor
Parar un Contenedor


En windows
En linux
Otros Comandos para Administrar un Contenedor
- start
- stop
- restart
- rm
- exec
- info
- inspect
- logs
- pause
- unpause
- port
- rename
Exponer Contenedores

Puerto del servidor anfitrión
Puerto del contenedor
Docker Images
Docker images
Una imagen es una plantilla creada a partir de una serie de instrucciones para luego crear containers en base a esta.

Imágenes Oficiales
La gran mayoría de las aplicaciones Open Source populares tiene una Imagen Oficial en el Docker Hub.



Dockerfile
Nos permite crear imágenes personalizadas usando un fichero de configuración llamado Dockerfile.

Imágenes Personalizadas
En el caso de no encontrar una imagen específica en el Docker Hub, debemos crearla nosotros.
FROM centos:centos7.9.2009 RUN yum install httpd -y
Centos con Apache
Dockerfile
Imágenes Personalizadas
FROM ubuntu RUN apt-get update
RUN apt-get install -y python3
Ubuntu con Python
Dockerfile
Instruciones en Dockerfile
RUN
Nos permite ejecutar comandos en contenedores intermedios para realizar configuraciones, instalaciones,
etc. dentro de la imagen base.
RUN echo 1.0 >> /etc/version && apt-get install -y git \
&& apt-get install -y iputils-pingCMD
Esta directiva nos permite ejecutar el main process al arrancar el contenedor.
CMD echo "Este es mi contenedor"CMD ["echo", "Este es mi contenedor"]Ejecuta con la shell -> /bin/sh
Ejecuta con Exec
ENTRYPOINT
Nos permite ejecutar un comado siempre al iniciar un contenedor.
ENTRYPOINT ["/bin/bash"]ENTRYPOINT ["ls"]ENTRYPOINT ["/var/app/run.sh"]WORKDIR
Determina el directorio de trabajo en un determinando momento durante la creación de la imagen. Permite ejecutar comandos sin tener que usar la ruta completa.
RUN mkdir /datos WORKDIR /datos
WORKDIR /home/miAppCOPY
Nos permite copiar el contenido del un directorio de nuestro host a algún directorio del contenedor.
WORKDIR /home/miApp
COPY /develop/app/index.html .
COPY /develop/log.txt /datosFichero del Host
Directorio del contenedor
ADD
Nos permite copiar el directorio de nuestro host a algún directorio del contenedor.
WORKDIR /home/miApp
ADD /develop/app .
COPY /develop /datosDirectorio del Host
Directorio del contenedor
ENV
Esta directiva permite configurar variables de entorno para el contenedor.
ENV DIR=/datos
RUN mkdir $DIR
ENV DB_NAME=app DB_USER=app123 DB_PASS=987654321
ARG
Esta directiva nos permite pasar una variable al momento de construir una imagen.
ARG DIR
RUN mkdir $DIR
docker build -t image:0.0.1 --build-arg DIR=data .
Ejercicios
Ejecutar 3 contenedores que corresponde a partes de una aplicación web.
https://github.com/mdrm016/bootcamp-docker-ejercicios.git
1. Levantar una BD en postgres
- Crear el Dockerfile
- Usar la imagen oficial de postgres
- Copiar el script de BD en la raiz del contenedor
-
Crear la imagen con el siguiente comando
- docker build -t bootcamp_ej1_bd:0.0.1 .
-
Crear el contenerdor con el siguiente comando
- docker run -p 5433:5432 --name bootcamp-ej1-db -e POSTGRES_PASSWORD=postgres -d bootcamp_ej1_bd:0.0.1
- Conectarse al contenedor de Modo Interactivo
- docker exec -it <ID_CONTENEDOR> bash
-
Restaurar la BD con el script copiado con los siguientes comandos
- psql -U postgres -c "create database app;"
- psql -U postgres -d app -f script_db.sql
- Salir del modo iterativo con "exit"
2. Levantar un API REST [Backend]
- Crear el Dockerfile en la raiz del proyecto backend
- Usar la imagen oficial de python:3.8
- Copiar el directorio backend en "/home"
- Establecer un directorio de trabajo por ejemplo "/home/backend"
- Restaurar las dependencias -> pip install -r requirements.txt
- Ejecutar el Process Main -> CMD [ "gunicorn", "-b :5000", "app:app" ]
- Exponer el contenedor en el puerto 5000 -> EXPOSE 5000
-
Crear la imagen con el siguiente comando
- docker build -t bootcamp_ej2_backend:0.0.1 .
-
Crear el contenedor con el siguiente comando
- Obtener la ip de nuestra maquina y reemplazar por <IP_HOST>
-
docker run --rm -p 5000:5000 --name bootcamp-ej2-backend -e SQLALCHEMY_DATABASE_URI=postgresql://postgres:postgres@<IP_HOST>:5433/app -d bootcamp_ej2_backend:0.0.1
3. Levantar el Frontend
-
Crear la imagen a partir del Dockerfile proveído
- Obtener la ip de nuestra maquina y reemplazar por <IP_HOST>
- docker build -t bootcamp_ej3_frontend:0.0.1 --build-arg BACKEND_URL=http://<IP_HOST>:5000/api .
-
- Crear el contenedor
- docker run --rm -p 8080:80 --name bootcamp-ej3-frontend -d bootcamp_ej3_frontend:0.0.1
- - Acceder a la aplicación con test:test
- - Analizar los pasos del Dockerfile
Referencias
Sumary

- Estructura de docker
- Image, Container, Network and Volumes
- Estados de un contenedor
- Created, Restarting, Running, Removing, Paused, Exited and Dead
- Tipos de imágenes
- Instrucciones de un Dockerfile
- Ejercicios
- BD, Backend y Frontend
- RUN
- CMD
- ENTRYPOINT
- WORKDIR
- COPY
- ADD
- ENV
- ARG
- Imágenes oficiales y personalizadas
Docker Run / Docker Images
By Marcelo Rafael Denis Meza
Docker Run / Docker Images
- 180