Está en la página 1de 138

Despliegue de

aplicaciones
con Docker
Antonio Varela Nieto
Descripción del curso

u Los contenedores de Docker son una de las tecnologías más en auge en


el mundo del desarrollo, ofreciendo métodos más sencillos, rápidos y
robustos que los conocidos anteriormente para desarrollar, desplegar y
distribuir software.
u A lo largo del curso el alumno aprenderá por qué los contenedores son
tan importantes y cómo hacer que sean parte de su proceso de
desarrollo.
u La formación trata desde las bases de Docker hasta la ejecución de
docenas de contenedores sobre un sistema multi-host con networking y
scheduling, además de revisar los pasos necesarios para desarrollar,
testear y desplegar aplicaciones web con Docker.
Estar familiarizado con SO base Linux

Estar familiarizado con la línea de comandos

Requisitos
para seguir Nociones básicas de desarrollo

el curso Nociones básicas de despliegue de aplicaciones en


servidores

Nociones básicas de redes


Entender lo que es un contenedor y su filosofía

Instalar y configurar un entorno de despliegue de contenedores

Integrar los contenedores en el proceso de desarrollo

Objetivos del Distribución de imágenes

curso Proceso de integración continua y despliegue continuo con Dockers

Manejo de redes y Service Discovery

Escalado de aplicaciones mediante Orquestación, Clustering y


Gestión
Contenido del curso

Módulo 1. El Módulo 4.
Módulo 2. Módulo 3. Primeros
porqué de los Fundamentos de
Instalación pasos
contenedores Docker

Módulo 6. Módulo 8.
Módulo 5. Uso de Módulo 7.
Creación de una Integración
Docker en Distribución de
Aplicación Web de Continua y Testing
Desarrollo ejemplo imágenes con Docker

Módulo 11.
Módulo 9. Módulo 10.
Orquestación,
Despliegue de Networking y
Clustering y
Containers Service Discovery Gestión
Presentación

u ¿Cómo te llamas?
u ¿Cuáles son tus expectativas del curso?
u ¿Tienes experiencia previa con lenguajes
de desarrollo?
u ¿Tienes experiencia previa con
instalación/configuración de servidores?
u ¿Tienes experiencia previa desplegando
aplicaciones?
Módulo 1
El porqué de los
contenedores
u En la ingeniería de software se
denomina aplicación web a aquellas
herramientas que los usuarios pueden
utilizar accediendo a un servidor web
¿Qué es una a través de internet o de una intranet
mediante un navegador.
aplicación
web? u En otras palabras, es un programa que
se codifica en un lenguaje
interpretable por los navegadores
web en la que se confía la ejecución al
navegador.
Es un proceso de ingeniería

u La elaboración de una aplicación es un proceso de


ingeniería dividido en fases
u Cada fase involucra diferentes roles con necesidades
de conocimiento dispares pero complementarios
u Las fases pueden ejecutarse de forma secuencial una
única vez (metodología en Cascada)
u O pueden ejecutarse N veces de forma repetitiva
(metodología en espiral)
Es un proceso de ingeniería

u En las fases de Requisitos y Diseño se marcan las necesidades tecnológicas del


proyecto y como se van a suplir
u Se define la tecnología escogida para el desarrollo
u Se definen los requisitos no funcionales que darán lugar al diseño de la infraestructura
de despliegue
u Con gran diferencia, las fases de Codificación y Pruebas son las fases que más
tiempo y recursos requieren en el total del proyecto
u La fase de Despliegue comúnmente es la fase en la que se pone el software a
funcionar en los entornos de producción
u En la actualidad es muy común tener diferentes entornos previos al de producción para
la realización de pruebas de integración o calidad
u La fase de Mantenimiento es una fase posterior al desarrollo principal donde se
abordan y solucionan posibles incidencias no detectadas en la fase de pruebas
Capa Navegador

• HTML
• CSS
• JavaScript

Múltiples Capa Servidor

tecnologías
• PHP
• Java
• JavaScript en lado servidor (SSJS)
• Perl

para el • Ruby
• Python
• Node.js

desarrollo • C# y Visual Basic con sus tecnologías de ASP/ASP.NET

Capa Persistencia

• Bases de datos SQL (MySQL, PostgreSQL, Oracle, ...)


• Bases de datos NOSQL (Cassandra, MongoDB, Redis, CouchDB, ...)
Múltiples tecnologías para el despliegue
Desplegando una aplicación web

u A la hora de diseñar el despliegue de nuestra aplicación solemos manejar tres


opciones:
u Servidor dedicado
u Virtualización
u Contenerización
Servidor dedicado

u Hace años era la opción predeterminada


u Si todas las aplicaciones comparten arquitectura y tecnologías es más fácil de
configurar y mantener
u Todas las aplicaciones coexisten en la misma máquina (SO)
u Puede suponer un problema de seguridad si no se manejan los permisos de forma
adecuada
u Una aplicación puede consumir todos los recursos disponibles
u Un fallo crítico en una aplicación puede suponer la caída del resto de aplicaciones
u El despliegue en un nuevo entorno implica un gran trabajo de configuración
u La escalabilidad, cuando es posible, es complicada y costosa
Virtualización
Virtualización

u Cada aplicación o conjunto de aplicaciones se despliega dentro de una


maquina virtual (MV)
u En el mismo servidor (host) pueden coexistir múltiples MV con tecnologías
diferentes
u El uso de recursos del host puede limitarse por MV
u Un fallo crítico dentro de una MV no afecta a otras (isolación)
u Mover la MV a otro servidor (con el mismo sistema de virtualización) es
relativamente sencillo
u La escalabilidad es más sencilla
u Duplicar una MV es mucho más fácil que duplicar un servidor
u Se puede parar una instancia y relanzarla con más asignación de recursos
Contenerización
Contenerización

u Existen varias opciones para la contenerización, pero sin duda la más


extendida es Docker
u El objetivo principal es el mismo, el aislamiento entre aplicaciones y generar
un entorno replicable
u En este caso en lugar de albergar un SO completo lo que se busca es
compartir directamente los recursos del SO Host
u El Docker Engine es el encargado de lanzar y gestionar los contenedores
buscando el uso optimo de los recursos del host
u Docker funciona a partir de imágenes que se pueden reutilizar entre varias
aplicaciones
u Docker aísla directamente aplicaciones, no sistemas operativos
Virtualización VS Contenerización

Virtualización Contenerización
Tamaño Elevado debido a que tiene que Reducido al no necesitar SO huésped
embeber el SO huésped
Reserva de Se hace previa al despliegue y Es dinámica en función de las
recursos es bloqueante necesidades y la gestiona el engine
Tiempo de Varios minutos Unos pocos segundos
despliegue
Portabilidad Permitida No se puede ejecutar
entre SO Host contenedores/aplicciones que no
sean para ese mismo SO Host
Complejidad Relativamente sencillo de La complejidad crece a medida que
empezar se requieren despliegues más
escalables
Que es Docker?

u Docker es un motor de código abierto que automatiza la implementación de


aplicaciones en contenedores
u Fue escrito por el equipo de Docker, Inc (anteriormente dotCloud Inc, uno de
los primeros jugadores en el mercado de la Plataforma como Servicio (PAAS)),
y publicado bajo la licencia Apache 2.0
u Está diseñado para proporcionar un entorno ligero y rápido en el que
ejecutar su código, así como un flujo de trabajo eficiente para llevar ese
código de su computadora portátil a su entorno de prueba y luego a la
producción
u Puede comenzar con Docker en un host mínimo que no ejecute nada más que
un kernel de Linux compatible y un binario de Docker
Por que usar Docker

u 1. Olvídate del SO y de las configuraciones manuales


u Con las máquinas físicas o virtuales hay que instalar el SO, todo el software y
dependencias que se necesita para que nuestra aplicación funcione de forma
manual.
u Con Docker todo eso se puede especificar en el Dockerfile y cada vez que se
arranque el contenedor se garantiza su correcta configuración y dsiponiblidad
u Una actualización o cambio de dependencias solo impacta en editar el Dockerfile,
parar y volver a desplegar el contenedor
Por que usar Docker

u 2. Adiós al “en mi máquina funciona”


u El contenedor de Docker proporciona consistencia. Lo que va dentro es siempre lo
mismo independientemente de donde se despliegue
u 3. Mucho más ligero y escalable que una MV
u Uso más eficiente de los recursos del host
u Transformar fácilmente un único contenedor en una granja mediante Docker
Composer
u Más potencia aun con Kubernetes
u Permite monitorizarlos, asegurarlos, ejecutarlos periódicamente, y muchas cosas más,
para crear entornos empresariales con la complejidad que necesites.
Por que usar Docker

u 4. Tan seguros como un MV


u Disponen de una versión reducida del espacio de usuario del sistema operativo
u Un contenedor no puede acceder a otros contenedores ni al sistema operativo
subyacente (a excepción de los volúmenes de almacenamiento a los que les des
permiso)
u 5. Control de versiones de la infraestructura
u Dado que toda la configuración de la infraestructura se hace en ficheros de texto
plano, este fichero puede ir al Sistema de control de versiones junto con el propio
código de la aplicación
Por que usar Docker

u 6. Concebido para trabajar en la nube


u Los contenedores se pensaron con la nube en la mente
u En la actualidad los principales actores Cloud ofrecen completísimas opciones de
despliegue de contenedores en sus infraestructuras
u Amazon Web Services
u Microsoft Azure
u Google Compute Engine

u Todos ellos soportan Kubernetes para permitir despliegues más complejos de


multiples contenedors orquestados para trabajar y escalar de forma independiente
Módulo 2
Instalación
Instalación

u La instalación de Docker es sencilla y rápida.


u Tiene un extenso soporte por parte de los principales SO
u En Microsoft Windows y en Mac OS X, los instaladores incluyen una plataforma de
virtualización transparente para incorporar el núcleo Linux necesario para la
ejecución del entorno de Docker
u El equipo de Docker recomienda
u Ubuntu
u Red Hat Enterprise Linux (RHEL)
Requisitos

u Arquitectura 64 Bits
u Linux Kernel 3.8 o posterior
u El kernel debe admitir un controlador de almacenamiento apropiado:
u Device Mapper (La opción por defecto)
u AUFS
u vfs
u btrfs
u Las características del núcleo de cgroups y namespaces deben ser
compatibles y habilitadas
Docker Desktop

u La plataforma de Docker es multiplataforma. La podemos instalar en los


principales sistemas operativos
u Docker Desktop
u Docker Desktop incluye Docker Engine, Docker CLI client, Docker Compose, Notary,
Kubernetes, y Credential Helper
u Windows: https://docs.docker.com/docker-for-windows/install/
u Mac OS X: https://docs.docker.com/docker-for-mac/install/
Docker en Linux

u En Linux tenemos instrucciones diferentes según la distro que escojamos y


tenemos que ir por partes
u Docker Engine
u Ubuntu: https://docs.docker.com/engine/install/ubuntu/
u Debian: https://docs.docker.com/engine/install/debian/

u Docker Compose
u https://docs.docker.com/compose/install/

u Kubernetes
u https://kubernetes.io/es/docs/tasks/tools/install-kubectl/
Docker en Linux

u El comando docker solo puede ser ejecutado por root o un usuario que
pertenezca al grupo docker (se crea automáticamente durante la instalación)

u Agregamos nuestro usuario al grupo docker


u $ sudo usermod -aG docker ${USER}
u Relogueamos la sesión del usuario en la terminal
u $ su - ${USER}

u Verificamos los grupos de nuestro usuario


u $ id -nG
Módulo 3
Primeros pasos
El comando docker

u El comando docker es nuestra herramienta para interactuar con toda la


arquitectura de Docker

u La sintaxis es la siguiente:
u $ docker [option] [command] [arguments]

u Si introducimos únicamente el comando docker en la terminal nos responderá


con la lista de todos los subcomandos de los que dispone
u $ docker
El comando docker: Hello World!

u Lo primero que podemos hacer es verificar la versión de Docker que tenemos


instalada en nuestro equipo
u $ docker versión

u O consultar los detalles de la instalación y el host


u $ docker info

u Y como no, todo empieza con un “Hello World”


u $ docker run hello-world
Busybox

u Busybox es una imagen Docker mínima que nos permite trastear de forma
rápida
u Para ejecutar un único comando dentro de una imagen podemos usar lo
siguiente:
u $ docker run busybox echo Hola mundo
u Si lo que queremos es abrir una terminal para trastear más en detalle
u $ docker run -it busybox sh
Iniciar un ubuntu

u De igual modo si queremos iniciar un contenedor con Ubuntu es tan sencillo


como usar el comando:
u $ docker run -it ubuntu /bin/bash

u Veremos que se descarga la imagen desde el registro y se inicia el contenedor.


Podemos verificar la versión concreta que está montando
u $ cat /etc/lsb-reléase

u Si lo preferimos podemos especificar la versión concreta de ubuntu que


queremos iniciar
u $ docker run –it ubuntu:14.04 /bin/bash
Práctica. Explorando el entorno

u Inicia un contenedor interactivo de Ubuntu


u $ docker run –it ubuntu /bin/bash
u Explora tu entorno
u $ hostname
u $ cat /etc/hosts
u $ ifconfig
u Instala el editor de textos vim
u $ apt-get update
u $ apt-get install vim
u Sal del entorno con el comando exit y repite el paso 1. Tenemos el comando
vim?
El comando docker: Listando
contenedores
u Con el subcomando ps podemos listar la información de todos los
contenedores en ejecución
u $ docker ps

u Si incorporamos la opción –a obtendremos la lista incluyendo los


contenedores ya finalizados
u $ docker ps -a

u Si solo necesitamos los IDs de los contenedores podemos usar la opción -q


u $ docker ps -aq
El comando docker: run, start, attach

u Podemos especificar un nombre para nuestro contenedor [a-zA-Z0-9_.-]


u $ docker run --name myUbuntu -it ubuntu /bin/bash
u Podemos reiniciar un contenedor parado anteriormente
u $ docker start {ID}
u $ docker start myUbuntu
u Para arrancar el contenedor con los parámetros iniciales podemos usar attach
u $ docker attach {ID}
u También es posible crear un contendor e iniciar como un demonio con la opción
-d
u $ docker run --name myDaemon -d ubuntu /bin/sh -c "while true; do
echo hello world; sleep 1; done"
El comando docker: logs, top

u Para ver lo que está pasando dentro de un contenedor podemos usar el comando
logs
u $ docker logs myDaemon

u Podemos abrir el streaming para verlo en tiempo real


u $ docker logs -f myDaemon
u $ docker logs –f –-tail 10 myDaemon

u Podemos pedir que incluya la marca temporal


u $ docker logs -ft myDaemon

u También podemos consultar los procesos en ejecución


u $ docker top myDaemon
El comando docker: stop, rm

u Si se necesita terminar un contenedor de forma externa tenemos el comando


subcomando stop
u $ docker stop {ID}

u Si lo que queremos es parar todos los contenedores en ejecución


u $ docker stop $(docker ps -q)

u Para eliminar los contenedores de forma definitiva


u $ docker rm {ID}
u Para eliminar todos los contenedores
u $ docker rm $(docker ps -aq)
El comando docker: inspect

u Para obtener más detalle sobre el contenedor tenemos inspect


u $ docker inspect {ID}
u Podemos usar –-format para obtener detalles concretos
u $ docker inspect --format='{{.State.Running}}' myDaemon
u $ docker inspect -f='{{.NetworkSettings.IPAddress}}' myDaemon
u Podemos consultar multiples contenedores indicando sus nombre uno detrás
de otro
u $ docker inspect --format='{{.Name}} {{.State.Running}}'
$(docker ps -aq)
Módulo 4
Fundamentos de
Docker
Docker Engine

u Es una aplicación cliente-servidor


compuesta por tres elementos:
u Docker Daemon (comando dockerd)
u Un API REST
u El cliente (comando docker) de la
interfaz de línea de comando

u El Cliente Docker y el Daemon pueden


ejecutarse en la misma máquina, o el
cliente se puede conectar a un Docker
Daemon remoto
Arquitectura Docker
El Docker Daemon

u El Docker daemon (dockerd) escucha las solicitudes de la API de Docker y


gestiona los objetos de Docker, como imágenes, contenedores, redes y
volúmenes.
u Un daemon también puede comunicarse con otros daemons para administrar
los servicios de Docker.
El Cliente Docker

u El cliente Docker (docker) es la forma principal en que muchos usuarios de


Docker interactúan con Docker
u Cuando se utilizan comandos como docker run, el cliente envía estos
comandos a dockerd, que los lleva a cabo
u El comando docker usa la API Docker. El cliente de Docker puede
comunicarse con más de un daemon
Los registros de Docker

u Un registro de Docker almacena imágenes de Docker


u Docker Hub y Docker Cloud son registros públicos que cualquiera puede usar
u Docker está configurado para buscar imágenes en Docker Hub de manera
predeterminada. Incluso podemos ejecutar nuestro propio registro privado
u Los comandos docker pull o docker run, las imágenes necesarias se
extraen del registro configurado
Objetos Docker: Contenedores

u Un contenedor es una instancia ejecutable de una imagen


u Se puede crear, iniciar, detener, mover o eliminar un contenedor utilizando la
API Docker o el CLI
u Se puede conectar un contenedor a una o más redes, adjuntarle
almacenamiento o incluso crear una nueva imagen en función de su estado
actual
u Relativamente bien aislado de otros contenedores y su máquina host
u Se define por su imagen y por las opciones de configuración que se le
proporciona cuando se crea o inicia
u Cuando se elimina un contenedor, desaparecen los cambios en su estado que
no se almacenan en el almacenamiento persistente
Objetos Docker: Imágenes

u Una imagen es una plantilla de 'solo lectura'


con instrucciones para crear un contenedor
Docker
u A menudo, una imagen se basa en otra
imagen, con alguna personalización
adicional. Por ejemplo, se puede compilar
una imagen basada en la imagen Ubuntu,
pero que instala el servidor web Apache y
nuestra aplicación, así como los detalles de
configuración necesarios para ejecutar
nuestra aplicación
Objetos Docker: Servicios

u Los servicios permiten escalar contenedores a través de múltiples demonios


Docker, que trabajan juntos como un enjambre con múltiples gerentes y
trabajadores
u Cada miembro de un enjambre es un demonio Docker, y todos los demonios se
comunican mediante la API Docker
u Permite definir el estado deseado, como el número de réplicas del servicio
que deben estar disponibles en un momento dado
u De manera predeterminada, el servicio tiene balanceo de carga en todos los
nodos de trabajo
u Para el usuario, el servicio Docker parece ser una sola aplicación
u Docker Engine admite el modo enjambre en Docker 1.12 y superior
Dockerfile

u Se utilizan para crear imágenes de contenedor


u Un Dockerfile es un documento de texto que contiene toda la información de
configuración y los comandos necesarios para ensamblar una imagen de
contenedor (tarea que realiza el Docker Daemon)
Namespaces

u Docker usa un conjunto de namespaces para garantizar el aislamiento de


cada contenedor
u Docker Engine usa espacios de nombres como los siguientes en Linux:
u El espacio de nombres pid: aislamiento del proceso (PID: ID del proceso).
u El espacio de nombres de red: Gestión de interfaces de red (NET: Redes).
u El espacio de nombres de IPC: gestión del acceso a los recursos de IPC (IPC:
comunicación entre procesos).
u El espacio de nombres mnt: Gestión de puntos de montaje del sistema de archivos
(MNT: Mount).
u El espacio de nombres uts: Aislamiento del núcleo y los identificadores de versión.
(UTS: Sistema de tiempo compartido Unix).
Control de grupos cgroups

u Un cgroup limita una aplicación a un conjunto específico de recursos


u Estos grupos permiten que Docker Engine comparta los recursos de hardware
disponibles con los contenedores y, opcionalmente, imponga límites y
restricciones
u Por ejemplo, se puede limitar la cantidad de memoria disponible para un
contenedor específico
Sistema de unión de ficheros

u Los sistemas de unión de ficheros, o UnionFS, son sistemas de archivos que


operan creando capas, haciéndolos muy livianos y rápidos
u Docker Engine utiliza UnionFS para proporcionar los bloques de construcción
para contenedores
u Docker Engine puede usar múltiples variantes de UnionFS, incluidas AUFS,
btrfs, vfs y DeviceMapper
Formato contenedor

u Docker Engine combina los namespaces, cgroups y UnionFS en un contenedor


llamado formato contenedor
u El formato de contenedor predeterminado es libcontainer
u En el futuro, Docker puede admitir otros formatos de contenedor al integrarse
con tecnologías como BSD Jails o Solaris Zones.
Módulo 5
Uso de Docker
en Desarrollo
El comando docker: images, rmi

u Para listar las imágenes que tenemos en local usaremos el subcomando image
u $ docker images
u Y con –q obtenemos solo los IDs
u $ docker images -q

u Para eliminar las imágenes


u $ docker rmi {ID}
u Para eliminar todas las imagenes
u $ docker rmi $(docker ps -aq)
El comando docker: pull, search

u Lo más normal es que las imágenes estén alojadas en un registro en la nube.


Para descargarlas al equipo local tenemos el subcomando pull
u $ docker pull fedora

u Podemos comprobar las imágenes descargadas con el comando


u $ docker images fedora

u Si queremos consultar las imágenes disponibles en los registros que tenemos


configurados, tenemos el subcomando search
u $ docker search debian
El comando docker: cp

u Si queremos copiar ficheros entre el host y un contenedor tenemos la opción


de usar el comando cp

u $ docker cp foo.txt mycontainer:/foo.txt


u $ docker cp mycontainer:/foo.txt foo.txt
El comando docker: diff

u Con el comando diff podemos obtener una lista de los ficheros se han alterado
desde la creación del container
u $ docker diff {ID}
El comando docker: stats

u El subcomando stats nos permite conocer el estado de consumo de recursos


de nuestros contenedores en tiempo real

u $ docker stats
u $ docker stats {ID}

u También admite el parámetro –a para incluir todos los contenedores inactivos


Aplicando límites

u Se pueden definir limites al uso de memorio y un valor de prioridad para


obtener tiempo de cpu
u $ docker container run -d --name nginx-test --cpu-shares 512 -
-memory 128M -p 8080:80 nginx

u Si el contenedor ya está en uso, se puede modificar los valores con update


u $ docker container update --cpu-shares 512 --memory 128M --
memory-swap 256M nginx-test
Crear nuestras propias imágenes

u Tenemos dos formas de crear nuestras propias imágenes


u Usando el comando docker commit
u Usando el comando docker build con un Dockerfile
El comando docker: commit

u El comando docker commit, nos permite generar una imagen a partir de un


contenedor
u Los pasos serían los siguientes:
u Ejecutar un contenedor de una imagen base que queramos modificar
u $ docker run -i -t ubuntu /bin/bash
u Hacer las instalaciones y configuraciones que necesitemos
u $ apt-get -y install apache2
u Ejecutar el comando docker commit para generar la imagen
u $ docker commit 4aab3ce3cb76 local:apache2
u $ docker commit -m="A new custom image" --author=“John Doe" 4aab3ce3cb76
local:apache2
El comando docker: commit

u El uso del comando commit no es frecuente, o mejor dicho no se aconseja su


uso para la generación de imágenes
u Tenemos una excepción, y es cuando algo falla durante la ejecución de un
determinado contenedor y queremos hacer un volcado para su posterior
análisis
u En esos casos también puede llegar a resultar útil generar la exportación en
tar para compartir el contenedor con otros miembros del equipo
u $ docker image save -o <name_of_file.tar> <REPOSITORY>:<TAG>
El comando docker: build

u El comando docker build es el método recomendado para generar


imágenes
u Necesitamos crear el Dockerfile para nuestra imagen
u Los pasos serían los siguientes:
u Crear un directorio llamado static_web
u Dentro creamos un fichero llamado Dockerfile
u Generamos la imagen
u $ docker build -t="local:static_web" .
El Dockerfile

# Version: 0.0.1
FROM ubuntu:14.04
MAINTAINER John Doe john@doe.com
RUN apt-get update
RUN apt-get install -y nginx
RUN echo 'Hi, I am in your container' \
>/usr/share/nginx/html/index.html
EXPOSE 80

$ docker build –t="local:static_web" .


$ docker run -d --name static_web -p 80:80 local:static_web
nginx -g "daemon off;"
El Dockerfile

u El comando FROM le dice a Docker qué base desea utilizar para su imagen
u Se puede indicar el nombre de la imagen seguido de su etiqueta
u El comando LABEL puede ser usado para añadir información extra a la imagen
u Puede ser cualquier cosa desde un número de versión hasta una descripción
u Se pueden consultar con el subcomando inspect
u El comando RUN es donde interactuamos con nuestra imagen para instalar
software y ejecutar scripts, comandos y otras tareas
El Dockerfile

u También podemos añadir un bloque con comandos COPY o ADD


COPY files/nginx.conf /etc/nginx/nginx.conf
COPY files/default.conf /etc/nginx/conf.d/default.conf
ADD files/html.tar.gz /usr/share/nginx/

u El comando COPY es el más sencillo, coge el fichero origen y lo copia en el


destino indicado dentro de la imagen
u El comando ADD es más avanzado, automáticamente sube el paquete
comprimido y lo descomprime en el destino, dentro de la imagen
u El comando ADD también nos permite descargar contenido remoto
ADD http://www.myremotesource.com/files/html.tar.gz /usr/share/nginx/
El Dockerfile

u Una de las últimas secciones de un Dockfile suele ser (si existe) el


ENTRYPOINT y/o CMD
u Con estas secciones podemos indicar comandos que serán ejecutados una vez
se inicie el container
u ENTRYPOINT puede ser usado en combinación con CMD, donde ENTRYPOINT
establece la base de los comandos y CMD lo completa.
u En ocasiones puede que parte de esa complección sea necesaria hacerla
en las opciones de inicio del comando docker run

ENTRYPOINT ["nginx"]
CMD ["-g", "daemon off;"]
El Dockerfile

u Otros comandos de Dockerfile que pueden ser interesantes son:


u USER: define el usuario con el que se van a ejecutar los bloques RUN, CMD y
ENTRYPOINT. El usuario tiene que existir dentro de la imagen
u WORKDIR: establece el directorio de trabajo para los los bloques RUN, CMD y
ENTRYPOINT
u ENV: El comando ENV establece las variables de entorno dentro de la imagen tanto
cuando se construye como cuando se ejecuta
u Estas variables pueden ser sobrescritas cuando se lanza la imagen
Práctica I

u Después de ver las posibles bloques del Dockerfile como podríamos


simplificiar el Dockerfile del ejemplo para facilitar la ejecución del container?
El comando docker: exec

u Con el subcomando exec podemos lanzar comandos dentro de un contenedor


en ejecución
u Por ejemplo, para acceder a un contendor que no se inicia con terminal
podemos usar:
u $ docker exec –it static_web /bin/bash
Consejo – build.sh

u Para estos casos en los que la generación es una ejecución repetitiva de


comandos, si no disponemos de una herramienta de más alto nivel podemos
crear un sencillo script para simplificar el trabajo
u $ vim build.sh
#!/bin/bash
nombre=prac4.2
docker build -t="local:$nombre" .

docker stop $nombre


docker rm $nombre

docker run -d --name $nombre -p 80:80 local:$nombre $ chmod +x build.sh

u $ chmod +x build.sh
u $ sh build.sh
Práctica II

u Crea una imagen a partir de un Dockerfile que haga lo siguiente:


u Tome como base una imagen de Ubuntu
u Le instale un apache2 o un nGinx y los módulos básicos de php7
u Desarrolla una página en HTML con un formulario con un input text para introducir
el nombre y un botón de submit.
El form se enviará a una página PHP que nos saludará (usando el nombre
introducido en el formulario) y nos dará la bienvenida al site.
u Empaqueta el código del sitio en un tar.gz para que al generar la magen se añada a
la misma
u Cuando se inicie el contenedor de la imagen deberemos poder acceder a esa mini
página web
Práctica II - Reflexión

u Siguiendo la filosofía de contenedores crees que es la forma más cómodo de


lograr una imagen capaz de ejecutar una página en PHP?
Práctica III

u Explora el registro de Docker Hub y simplifica al máximo tu Dockerfile


Práctica IV

u Crea una aplicación web en java sencilla, con un simple servlet que nos dé la
bienvenida de forma genérica, y si pasamos el parámetro name por get nos
salude de forma personalizada
u Empaqueta la aplicación en un WAR
u Crea un Dockerfile capaz de crear un contendor que ejecute ese WAR
Persistencia de datos

u Cuando hablamos de una aplicación web, es ineludible hablar de persistencia


de datos
u La filosofía de contenedores es que el contenedor es efímero, puede aparecer
y desaparecer
u Los datos que maneja el usuario deben poder persistir más haya de la vida
contendor
u Para eso están los volumenes
Persistencia de datos: Volúmenes

u Cuando hablamos de una aplicación web, es ineludible hablar de persistencia


de datos
u La filosofía de contenedores es que el contenedor es efímero, puede aparecer
y desaparecer
u Los datos que maneja el usuario deben poder persistir más haya de la vida
contendor
u Para eso están los volúmenes
Persistencia de datos: Volúmenes

u Es una zona del disco duro de la


máquina host
u Se monta dentro del contenedor
como si formara parte de su
sistema de ficheros
u Puede ser compartido por varios
contenedores
u Puede ser de solo lectura, o de
lectura y escritura
Persistencia de datos: Volúmenes

u El comando docker tiene el subcomando volume para poder trabajar con los
volúmenes
u Desde desde este comando podemos crear, consultar y eliminar los volúmenes
u $ docker volume create myVolume
u $ docker volume create --name myVolume --label test
u $ docker volume create --driver local \
--opt type=nfs \
--opt o=addr=192.168.1.1,rw \
--opt device=:/path/to/dir \
foo
Persistencia de datos: Volúmenes

u Para listar los volúmenes creados


u $ docker volume ls
u Para ver los detalles de un volumen
u $ docker volume inspect myVolume
u Para eliminar un volumen
u $ docker volume rm myVolume
u Para todos los volúmenes que no están en uso
u $ docker volume prune
Persistencia de datos: Volúmenes

u Para usar un volumen en un contenedor


u $ docker run –v {nameVolume}:{pathToMount} myImagen
u Otra opción es usar la opción --mount
u $ docker run –-mount source={nameVolume};target={pathToMount}
myImagen

u En principio son equivalentes e intercambiables, salvo que queramos iniciar


un servicio de Docker Swarm, en cuyo caso solo podemos usar --mount
Persistencia de datos: Volúmenes

u Por ejemplo, imaginemos que nuestra aplicación tiene un directorio llamado


uploads en el cual guardamos los ficheros subidos por los usuarios
u Podemos usar el siguiente comando para crear el contenedor
u $ docker run -d –v myUploads:/var/www/html/uploads myAppImage

u Si no existe ningún volumen con el nombre se myUploads creará en este


momento
u Si ya existe, se monta el contenido existente en el volumen
BBDD

u La mayoría de las aplicaciones web hacen uso de bases de datos para la


persistencia de la información que manejan
u En Docker Hub tenemos la imagen oficiar de MySQL
u Si queremos iniciar un servidor de BBDD solo necesitamos los siguiente
u $ docker run -d -p 33060:3306 --name mysql-db
-e MYSQL_ROOT_PASSWORD=secret
--mount src=mysql-db-data,dst=/var/lib/mysql mysql
Ejemplo con Wordpress y Compose

u Docker Compose es una herramienta de Docker para manejar la generación de


imágenes en base a múltiples imágenes
u Tiene un fichero de configuración en YAML llamado docker-compose.yml

u Ejemplo de compose con Wordpress


u https://docs.docker.com/compose/wordpress/
Práctica V

u Partiendo del ejemplo anterior de wordpress con docker-compose modifica el


script para que coja los ficheros del directorio wp-content de forma externa y
persistente
Módulo 6
Creación de una
Aplicación Web
de ejemplo
Los 12 factores

u En estos tiempos, el software se está distribuyendo como un servicio: se le


denomina web apps, o software as a service (SaaS). “The twelve-factor app”
es una metodología para construir aplicaciones SaaS
u La metodología “twelve-factor” puede ser aplicada a aplicaciones escritas en
cualquier lenguaje de programación, y cualquier combinación de ‘backing
services’ (bases de datos, colas, memoria cache, etc)
u https://12factor.net/es/
Apps Monolíticas vs Microservicios

u Las aplicaciones monolíticas agrupan la funcionalidad y sus servicios en una


base de código única
u Fáciles de desarrollar
u Fáciles de desplegar
u Sencillo y rápido ejecutarlas
u Muy difícil o costoso de escalar
u El mantenimiento y las actualizaciones pueden ser complejas y derivar en
problemas funcionales
Apps Monolíticas vs Microservicios

u Los microservicios son una manera de construir aplicaciones y servicios


digitales
u Una arquitectura de microservicios busca desacoplar o independizar los
componentes individuales de una aplicación, para que cada componente sea
una aplicación en sí misma
u Los microservicios se conectan entre sí a través de API’s, permitiendo que
diferentes equipos trabajen al mismo tiempo en diferentes partes de una
aplicación
Apps Monolíticas vs Microservicios

u Los microservicios son una manera de construir aplicaciones y servicios


digitales
u Una arquitectura de microservicios busca desacoplar o independizar los
componentes individuales de una aplicación, para que cada componente
sea una aplicación en sí misma
u Los microservicios se conectan entre sí a través de API’s, permitiendo que
diferentes equipos trabajen al mismo tiempo en diferentes partes de una
aplicación. O incluso en diferentes lenguajes
u Distintos componentes del software pueden ser desarrollados y desplegados
de forma independiente
Apps Monolíticas vs Microservicios

u Los microservicios presentan grandes ventajas


u La escalabilidad del sistema es más sencilla dado que se pueden escalar cada uno
de los microservicios por separado
u Se puede hacer un uso más optimo de los recursos de la máquina
u Pero también presentan grandes retos tecnológicos y complejidad a la hora de
implementarlos
u Al tener un mayor número de componentes su operación y diseño es más complejo
u Diseñar y desarrollar la infraestructura requiere mas tiempo y recursos
u Monitorización de servicios distribuidos (KPIs de aplicación, redes, logs,
transaccionalidad)
Apps Monolíticas vs Microservicios

u La arquitectura monolítica sigue siendo la norma para la mayor parte de las


aplicaciones, aunque no es lo mejor para sistemas complejos
u La arquitectura de microservicios nació como una reacción de los
desarrolladores ante la imposibilidad de continuar escalando aplicaciones
u Transformar una aplicación monolítica en una orientada a microservicios es un
proceso complejo y costoso que ha de hacerse en pequeños pasos
u El primer paso sería tratar de identificar partes de la lógica de negocio que se
puedan aislar del resto debido a su bajo acoplamiento
u El siguiente paso podría ser identificar las partes del código que consuman
más cantidad de recursos y que aparenten poder ser aislados
Desarrollo Web APP Java

u Para desarrollar una aplicación web en JAVA solemos necesitar


u Un IDE como Netbeans o Eclipse
u Una herramienta de gestión de dependencias, por ejemplo MAVEN
u Un servidor de aplicaciones como Tomcat, Glassfish, …
u Podemos recurrir a diferentes tecnologías
u JSP y Servlets
u Java Server Faces
u Spring Boot
Configurando el entorno

u En nuestro caso vamos a trabajar con Netbeans, Maven, Spring Boot y Docker
u Para establecer el entorno podemos usar el siguiente manual
u https://jaxenter.com/playing-with-spring-boot-docker-in-netbeans-ide-
127672.html
Caso práctico

u Consideremos el supuesto en el que queremos desarrollar una aplicación para


satisfacer las necesidades de la empresa XYZ. Esta empresa cuenta con más
de 10.000 empleados repartidos en varias sedes, su catálogo de productos
cuenta con más 100.000 referencias y maneja ventas a clientes en todo el
mundo
u Esta aplicación debe poder gestionar:
u El directorio de empleados
u El directorio de productos
u El directorio de clientes
u Las ordenes de pedidos de los clientes
u La facturación de los clientes
Caso práctico

u ¿Cómo deberíamos afrontar el diseño de esta aplicación?


Caso práctico

u Trata de hacer una aproximación del desarrollo de la funcionalidad de listado


de empleados siguiendo la siguiente arquitectura
Módulo 7
Distribución de
imágenes
Registro

u Para la distribución de imágenes usamos los registros


u Podemos usar un registro público o uno privado
u El registro público más conocido y usado es Docker Hub
Docker Hub

u Para publicar en Docker Hub lo primero que necesitamos es crear una cuenta
de usuario
u https://hub.docker.com/
u Una vez tenemos la cuenta creada, tenemos que ir a la sección de
repositorios y nos creamos nuestro propio repositorio
u Podemos escoger entre público y privado
u Lo siguiente es iniciar sesión con nuestro usuario en nuestro docker cliente
u $ docker login --username={username}
Docker Hub

u Ahora ya podemos crear imágenes con nuestro repositorio y subirlas a Docker


Hub
u $ docker build {userName}/{repositoryName}:{tag}

u Esto nos genera la imagen de forma local


u $ docker images

u El último paso es subirla al registro


u $ docker push {userName}/{repositoryName}:{tag}
Docker Hub - Privado

u Tenemos la posibilidad de instalar un servidor privado de Docker Hub en


nuestra infraestructura

u Ejemplo rápido de instalación en un contenedor


u $ docker run -d -p 5000:5000
--restart always --name registry registry:2
u Y lo podríamos usar así
u $ docker pull ubuntu
u $ docker tag ubuntu localhost:5000/ubuntu
u $ docker push localhost:5000/Ubuntu
Docker Hub - Privado

u Un ejemplo más completo de configuración


u https://www.digitalocean.com/community/tutorials/how-to-set-up-a-private-
docker-registry-on-ubuntu-18-04-es
Módulo 8
Integración Continua y
Testing con Docker
Integración continua

u La integración continua es una práctica


de ingeniería de software que consiste en
hacer integraciones automáticas de un proyecto
lo más a menudo posible para así poder detectar
fallos cuanto antes.
u Entendemos por integración
la compilación y ejecución de pruebas de todo un
proyecto.
Integración continua

u El proceso de test se suele hacer cada cierto tiempo


u De forma periódica
u En base a eventos (por ejemplo, commit)

u El proceso consiste en:


u Se descarga el código fuente del control de versiones
u Se compila
u Se ejecutan las pruebas
u Se generan los informes
Integración continua

u Para la automatización de este proceso existen multitud de herramientas


u Algunas son independientes de la tecnología del desarrollo y otras están
ligadas al desarrollo
u Apache Continuum
u Hudson
u Jenkins
u CruiseControl
u Estas herramientas habitualmente se apoyan en otras herramientas como Ant
o Maven
u Estos procesos se suelen asociar a metodologías de programación extrema o
desarrollo ágil
Ventajas

u Se pueden detectar, y solucionar, los errores de integración en fases


tempranas de desarrollo. Evitando el caos de los fallos a última hora
u Disponibilidad constante de versiones para probar, enseñar a los interesados,
hacer demostraciones, etc
u Ejecución inmediata de las pruebas unitarias
u Monitorización continua de las métricas de calidad del proyecto
TDD

u Desarrollo guiado por pruebas de software, o Test-driven development (TDD) es


una práctica de ingeniería de software que involucra otras dos prácticas:
Escribir las pruebas primero (Test First Development) y Refactorización
(Refactoring).
Jenkins

u Jenkins es un servidor de automatización open source escrito en Java


u Está basado en el proyecto Hudson
u Ayuda en la automatización de parte del proceso de desarrollo de software
mediante integración continua y facilita ciertos aspectos de la entrega
continua
u Tiene integración con la mayoría de los sistemas de controles de versiones
u Puede ejecutar proyectos basados en Ant y Maven
u También puede ejecutar comandos en terminales
u Dispone de plugins para la customización
Jenkins

u Jenkins dispone de plugins para ampliar y mejorar su funcionalidad


u En este caso el que nos interesa es el plugin de Docker
u Este plugin nos permite integrarnos con un Docker Server para poder generar
contenedores a demanda del pipeline

u Ejemplo
u https://medium.com/@karthi.net/docker-tutorial-build-docker-images-using-
jenkins-
d2880e65b74#:~:text=On%20the%20Jenkins%20Dashboard%2C%20select,Select%20Do
cker%20from%20the%20list.
Docker Hub - GitHub

u Podemos integrar GitHub con Docker Hub para generar las imágenes de forma
automática
u Para ello, Docker Hub nos provee de la opción de los build automáticos
u https://docs.docker.com/docker-hub/builds/
Caso de estudio

u Aquí podemos ver un ejemplo real de las diferentes piezas que podrían hacer
falta para lograr una infraestructura 100% flexible y escalable siguiendo los
principios de la integración continua y Docker

u https://es.slideshare.net/Synerzip/running-microservices-on-docker
Práctica

u Vamos a hacer una instalación de un Jenkins y explorar un poco sus plugins y


sus posibilidades
Módulo 9
Despliegue de
Containers
Despliegue de Containers

u Para el despliegue de los contenedores podemos usar una infraestructura tradicional


u Despliegue on premise
u Despliegue en hosting (mv o servidor dedicado)

u También existe la posibilidad de usar las infraestructuras cloud


u AWS Elastic Container Service -> https://aws.amazon.com/es/ecs/
u Google Kubernetes Engine -> https://cloud.google.com/kubernetes-engine
u Azure Container Service -> https://azure.microsoft.com/es-es/free/kubernetes-service/
Módulo 10
Networking y
Service Discovery
Network

u Docker crea una interfaz de red propia con el nombre de docker0. Esta red
tiene un rango típico: 174.17.0.1/24
u Al principio, solo se podía manejar esta red
u Eso generaba problemas de seguridad (confiabilidad y aislamiento)
u Esto se mejoró con el avance de Docker
Network

u Con el comando docker network ls podemos ver las redes que tenemos
configuradas por defecto
u host representa la red del propio equipo y haría referencia a eth0
u bridge representa la red docker0 y a ella se conectan todos los contenedores por
defecto.
u none significa que el contenedor no se incluye en ninguna red y si verificamos esto
con el comando ifconfig dentro del contenedor veríamos que solo tiene la interfaz
de loopback lo.

u Podemos obtener más información de las redes con inspect


u $ docker network inspect bridge
Network

u Si queremos aislar un contenedor o un grupo de contenedores, simplemente


tenemos que crear una red
u $ docker network create --driver bridge aislada

u y asociársela a los contenedores que queramos


u $ docker run --net=aislada -itd --name=container3 busybox
Overlay Network

u Cuando necesitamos manejar una infraestructura


compleja y grande puede ser necesario usar varios
host en conjunto como si solo fuera uno
u Para ello necesitamos poder generar redes suprahost o
superpuestas
u Para ese fin Docker hace uso de la librería VXLAN
u Es imprescindible disponer de un servicio de
almacenamiento key-value como Consul , Etcd , o
ZooKeeper
u El servicio se instala en un nodo, y en el resto se
instala Docker
Service Discovery

u Proceso de detección automática de dispositivos y servicios


en una red
u Es un estándar de red que logra la detección de redes
mediante la identificación de recursos
u Tradicionalmente, la detección de servicios ayuda a reducir
los esfuerzos de configuración de los usuarios a los que se les
presentan recursos compatibles, como una impresora o un
servidor habilitado para Bluetooth
u Más recientemente, el concepto se ha ampliado a los
recursos de red o de contenedores distribuidos como
"servicios", que se descubren y a los que se accede
Service Discovery
Service Discovery
Service Discovery con Spring Boot

u Ejemplos de implementación de un Service Discovery usando Eureka Service


Discovery en Spring Boot

u https://spring.io/guides/gs/service-registration-and-discovery/
u https://www.baeldung.com/spring-cloud-netflix-eureka
Módulo 11
Orquestación,
Clustering y Gestión
Orquestación

u En la actualidad las aplicaciones son complejas y por regla general no llega


con desplegar un solo contenedor en producción
u Lo habitual es necesitar varios, que además deben escalar de manera
diferente y otras complejidades.
u Por ejemplo, un contenedor para el Front-End, uno o varios para la interfaz de
servicios, otro para la base de datos... Por no hablar de si utilizas microservicios...

u Todo esto da pie a la necesidad de la orquestación de contenedores, es


decir, disponer de alguna herramienta o sistema que automatiza el
despliegue, la gestión, el escalado, la interconexión y la disponibilidad de
nuestras aplicaciones basadas en contenedores.
Orquestación

u Un orquestador de contenedores se ocupa de cuestiones como:


u Configuración automática
u Despliegue y "levantado" automático de servicios basados en contenedores
u Balanceado de carga
u Auto-escalado y auto-reinicio de contenedores
u Control de la "salud" de cada contenedor
u Intercambio de datos y networking
u Mantenimiento de parámetros "secretos" y configuraciones
Kubernetes

u Kubernetes es de hecho el motor de orquestación de contenedores más


popular que existe en el mercado.
u Comenzó siendo un proyecto de Google y miles de equipos de desarrolladores
lo usan para desplegar contenedores en producción.
u Google afirma que ejecuta miles de millones de contenedores usando
Kubernetes cada semana.
u La herramienta funciona agrupando contenedores que componen una
aplicación en unidades lógicas para una fácil gestión y descubrimiento.
Docker Swarm

u Swarm es la solución que propone Docker


u Viene incluido junto al motor de Docker desde la versión 1.12.0, y ofrece
muchas funciones avanzadas integradas como el descubrimiento de servicios,
balanceo de carga, escalado y seguridad
u Swarm sigue la filosofía de Docker de centrarse en la simplicidad y en la
experiencia del desarrollador
u Se podría decir que es más fácil de usar que Kubernetes de inicio, pero no tan
potente y no tan adoptado por las empresas, los proveedores Cloud o por la
comunidad
Google Kubernetes Engine (GKE)

u Montado sobre Kubernetes, permite desplegar, gestionar y escalar


aplicaciones de contenedores en la nube de Google
u El objetivo de GKE es optimizar la productividad del departamento de
desarrollo al mejorar la gestión de las cargas de trabajo basadas en
contenedores
u Oculta tanto las tareas de gestión simple como aquellas más complejas detrás
de herramientas de líneas de comando, usando interfaces transparentes y
fáciles de usar.
Azure Container Service (AKS)

u Hace relativamente poco se le cambió el nombre de marca de ACS a AKS


u El servicio de Azure es código abierto y está optimizado para su uso en las
máquinas virtuales de Azure, denominadas Azure Virtual Machine
u Proporciona las herramientas necesarias para crear, configurar y gestionar
la infraestructura de contendedores Docker abiertos
u AKS ofrece desarrollo simplificado de aplicaciones basadas en contenedores
y despliegue con soporte para Kubernetes, Mesosphere DC/OS, o Swarm para
la orquestación.
Amazon ECS

u El servicio de AWS para orquestación de contenedores, Amazon ECS, es un


sistema de gestión muy escalable que permite a los desarrolladores ejecutar
aplicaciones en contenedores sobre instancias EC2.
u Está formado por muchos componentes integrados que permiten la fácil
planificación y despliegue de clústeres, tareas y servicios Docker.
u Aunque, como principal desventaja, no existe soporte para ejecutar
contenedores fuera de EC2, los aspectos a favor incluyen ventajas propias
del servicio AWS tales como CloudTrail, CloudWatch, Elastic Load Balancing,
etc.
Práctica

u Kubernetes tiene una documentación interactiva muy buena para la


introducción a su entorno
u https://kubernetes.io/docs/tutorials/kubernetes-basics/
Muchas Gracias

u Antonio Varela Nieto

También podría gustarte