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-ping

CMD

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/miApp

COPY

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 /datos

Fichero 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 /datos

Directorio 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

  1. Crear el Dockerfile
  2. Usar la imagen oficial de postgres
  3. Copiar el script de BD en la raiz del contenedor
  4. Crear la imagen con el siguiente comando
    •    docker build -t bootcamp_ej1_bd:0.0.1 .
  5. 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
  6. Conectarse al contenedor de Modo Interactivo
  7.     docker exec -it <ID_CONTENEDOR> bash
  8. 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
  9. Salir del modo iterativo con "exit"

2. Levantar un API REST [Backend]

  1. Crear el Dockerfile en la raiz del proyecto backend
  2. Usar la imagen oficial de python:3.8
  3. Copiar el directorio backend en "/home"
  4. Establecer un directorio de trabajo por ejemplo "/home/backend"
  5. Restaurar las dependencias -> pip install -r requirements.txt
  6. Ejecutar el Process Main -> CMD [ "gunicorn", "-b :5000", "app:app" ]
  7. Exponer el contenedor en el puerto 5000 -> EXPOSE 5000
  8. Crear la imagen con el siguiente comando
    •     docker build -t bootcamp_ej2_backend:0.0.1 .
  9. 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

  1.  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 .
  2. - Crear el contenedor
    •     docker run --rm -p 8080:80 --name bootcamp-ej3-frontend -d bootcamp_ej3_frontend:0.0.1
  3. - Acceder a la aplicación con test:test
  4. - 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
Made with Slides.com