Contenedores con Docker. con Docker II..pdfContenedores con Docker. II) Docker Compose y Docker...

Preview:

Citation preview

Contenedores con Docker.II) Docker Compose y Docker Swarm.

Daniel A. Cialdella C., José M. Cousiño y Pablo P. Corral L.

Espacio ofrecido por

Travel Labs Madrid 04-2019

¿ Cuántos vinieron al MeetUp anterior ?

● Cuántos? Experiencia anterior?

● Conocimientos a los que no vinieron?

● Subimos la presentación del Meetup I).

¿Quiénes somos y porqué hicimos Dockertips?

2015. Comenzamos probando Docker.

2016. Implementaciones para desarrolladores.

2017. www.dockertips.com y publicaciones.

2018. Puesta en marcha de varios Proyectos.

2019. Comunidad establecida, compartiendo

experiencias y dando servicios.

Presentación.

Componentes de una Aplicación.

Componentes de una aplicación.

Componentes usando Docker.

Microservicios en Docker.

Docker-Compose.

● Es una herramienta para definir y ejecutar contenedores de manera local.

● Los contenedores se definen y configuran por medio de una plantilla yaml.

● Objetivos:

○ Desplegar aplicaciones en diferentes entornos aislados entre ellos.

○ Utilizar volúmenes de forma persistente.

○ Recrear contenedores modificados: reutiliza contenedores en caso de cambios en

la plantilla.

○ Variables utilizadas dentro de los contenedores (nombre de las bases de datos,

otros)

● En Windows y Mac viene instalado por defecto con Docker.

● En Linux no está incluido en la instalación de Docker Engine y se tiene que hacer de

forma manual.

# apt install docker-compose

Conceptos generales.

● Fue diseñado para utilizar contenedores en un solo servidor.

● No soporta la alta disponibilidad.

● Centrado en entornos de desarrollo - NO utilizar en producción.

● Para entorno de producción se debe usar “Docker Swarm”.

Limitaciones.

● Entornos de desarrollo: simplifica la creación de imágenes, ejecución de

contenedores y comunicación entre ellos.

● Automatización de test:

○ Test de integración con bases de datos.

○ Test de integración con Servicios web o Web Apis.

● Entornos de prueba de nuevas versiones de frameworks o productos.

● “Si solo tenemos un servidor” se puede utilizar como herramienta de

despliegue.

● Varios desarrolladores usan el mismo entorno (gracias al fichero yml)

Recomendaciones para su uso.

● Docker-compose posee un fichero de configuración para definir “aplicaciones”.

● Una aplicación está compuesta de los siguientes elementos que son definidos en el

fichero:

○ Uno o varios contenedores.

○ La configuración que tiene cada contenedor.

○ Puertos que se exponen y cómo se mapean.

○ Cómo se comunican entre ellos.

● Por defecto el fichero tiene el nombre docker-compose.yml y está escrito en yaml.

El fichero docker-compose.yml

● version: indica la versión del formato a utilizar.

● build: especifica el directorio donde se aloja el fichero Dockerfile para crear la

imagen basada en dicho fichero.

● context: es parecido a build (solo compatible versión 2 o superior), e indica el

directorio o dirección en la que encontrar el fichero Dockerfile.

● dockerfile: especifica el nombre de un fichero alternativo al fichero Dockerfile.

● args: indica un comando distinto para la imagen distinto al definido en el fichero

Dockerfile.

● entrypoint: indica el punto de entrada para la imagen distinto al indicado en el

Dockerfile.

● Container_name: nombre del contenedor.

● depends_on: indica la dependencia de servicios entre los contenedores.

El fichero docker-compose.yml

● environment: especifica la lista de variables de entorno a pasar en la creación de la

imágen.

● env_file: especifica el nombre del fichero que contiene las variables de entorno.

● expose: indica la lista de puertos que expone el contenedor.

● imagen: indica la imagen a utilizar en caso de no utilizar build o context.

● labels: lista de etiquetas a a establecer.

● logging: especifica el driver a utilizar para los registros de los contenedores.

● network_mode: especifica el modo de red a utilizar.

● networks: especifica la lista de redes a unirse para los servicios.

● ports: lista de puertos a exponer.

● volumenes: lista de volúmenes de los contenedores.

El fichero docker-compose.yml

● Se puede tener un fichero docker-compose por entorno: desarrollo, pre-

producción o producción.

● El objetivo es tener diferentes configuraciones por entorno.

● Tendremos un fichero de docker-compose principal donde se define los

servicios que contiene.

● Y un fichero con la configuración personalizada por entorno.

● Al ejecutar el docker-compose se tiene que indicar los dos parámetros:

#docker-compose up -f docker-compose.yml

-f docker-compose.test.yml

Un fichero docker-compose.yml para c/entorno.

docker-compose.yml docker-compose.test.yml

Ejemplos de ficheros YML.

● El comando docker-compose tiene las siguientes opciones globales que se

pueden especificar en cada comando:

○ -f fichero: especifica un fichero diferente al por defecto (docker-

compose.yml)

○ -p proyecto: especifica el nombre de un proyecto diferente al de por

defecto (nombre de directorio)

○ --verbose: muestra más información cuando se ejecuta el comando.

Parámetros globales.

● Con el comando up creamos los contenedores especificados en el fichero:

○ -d: se ejecutan en segundo plano.

○ --force-recreate: si algún contenedor existe y no ha sido modificado no

se recreará. Con esta opción forzamos la recreación.

○ --no-build: no crea las imágenes específicas sino existen.

○ --abort-on-container-exit: si algún contenedor es detenido, se detienen

todos los demás.

Comandos.

● El comando ps lista el estado de los servicios definidos en la plantilla.

● El comando down detiene los servicios y elimina los contenedores y las

redes asociadas. Este comando tiene las siguientes opciones:

○ --rmi: elimina las imágenes asociadas. Indicando all elimina todos las

imágenes.

○ -v: elimina los volúmenes asociados a los servicios.

● El comando start inicia los servicios definidos en la plantilla, o el servicio

especificado como argumento.

● El comando stop detiene los servicios definidos dentro de la plantilla o el

servicio especificado como argumento.

○ Tiene un parámetro opcional -t que permite establecer un timeout.

Comandos de control.

● El comando pause pausa todos los servicios definidos en la plantilla o el

servicios especificado como argumento.

● El comando unpause reanuda todos los servicios definidos en la plantilla o

el servicio especificado como argumento.

Comandos de control.

● El comando build crea o recrea las imágenes definidas en la plantilla

basándose en los ficheros Dockerfile. Tiene las siguientes opciones:

○ --force-rm: siempre elimina los contenedores intermedios.

○ --no-cache: no utiliza caché para eliminar las imágenes.

○ --pull: siempre se intenta obtener una nueva versión de la imagen

definida en el fichero Dockerfile.

#docker-compose build --no-cache

● El comando create crea los servicios definidos en la plantilla pero no los

ejecuta, es decir, no ejecuta el comando run. Tiene los siguientes parámetros:

○ --force-recreate: recrea las imágenes incluso si la configuración o los

ficheros Dockerfile no han sido modificados.

○ --no-recreate: no recrea las imágenes incluso si la configuración o los

ficheros Dockerfile no han sido modificados.

○ --no-build: no crea las imágenes incluso si no existen.

○ --build: crea las imágenes antes de crear los contenedores.

● El comando logs muestra la salida producida por los contenedores. Tiene los

siguientes parámetros:

○ --no-color: muestra la salida sin colores.

○ -f/--follow: mantiene el proceso en primer plano esperando nuevos

registros.

○ -t/--timestamps: muestra la fecha y hora de cada registro

○ --tail líneas: muestra el número de líneas específicas.

● El comando scale ejecutado con el comando up nos permite realizar un

escalado de un servicio.

#docker-compose scale NOMBRE_SERVICIO=<número>

Demo.

Docker Swarm.

Docker Swarm es el orquestador de contenedores proporcionado por Docker.

● Las principales características son:

○ Administración del clúster con Docker Engine.

○ Utiliza el CLI de Docker.

○ Diseño descentralizado: la diferencia de roles se realiza en tiempo de

ejecución.

○ Modelo declarativo: los servicios se describen de manera declarativa.

○ Codificación de estado (DSC).

○ Red multi-host.

○ Descubrimiento de servicios: tiene un DNS único.

○ Balanceo de carga.

○ Seguro por defecto: utiliza TLS autenticación.

● Un nodo es una instancia del motor Docker Engine que participa en el clúster.

● Se puede ejecutar uno o más nodos en una sola máquina física o servidor en la nube.

● Generalmente la implementación de clusters se constituye de dos nodos distribuidos

en diferentes máquinas físicas o virtuales.

● Un clúster suele tener un nodo administrador que se encarga de la administración del

clúster.

● Los nodos workers reciben y ejecutan las tareas enviadas por el nodo administrador.

● Un tarea es la unidad de programación atómica del clúster.

Nodos/Managers/Workers.

● En los nodos worker se ejecuta un agente que informa de las tareas

asignadas.

● Un servicio es la definición de las tareas a ejecutar en los nodos de trabajo

(workers) o administración.

● Cuando se crea un servicio, se especifica la imagen de un contenedor y los

comandos que se ejecutan.

● El modelo de servicios replicados, el administrador de clúster distribuye un

número específico de tareas de réplica entre los los nodos worker en función

de la escala que se establezca.

Servicios.

● El administrador de clúster utiliza el balanceador de carga para exponer los

servicios que estén disponibles externamente en el clúster.

● El administrador de clúster puede asignar automáticamente el servicio a un

puerto público o puede configurar un puerto publicado para un servicio.

● Sino se especifica un puerto el administrador puede asignar al servicio un

puerto en el rango 30000 - 32767.

Para producir un balanceo automático se hace:

docker service update --force webserver

Balanceo de carga.

● Componentes externos como balanceadores pueden acceder al servicio en el

puerto publicado de cualquier nodo.

● Un nodo tiene un componente DNS interno que asigna automáticamente a

cada servicio del clúster una entrada en el DNS.

● El administrador utiliza el balanceo de carga para distribuir las solicitudes

entre los servicios del clúster en función del nombre DNS del servicio.

● Para configurar clúster para Docker-Swarm en máquinas físicas o virtuales se

tiene que tener abiertos los siguientes puertos:

○ Puerto TCP 2377 para las comunicaciones de la gestión del clúster.

○ Puerto TCP y UDP 7946 para comunicación entre nodos.

○ Puerto UDP 4789 para el tráfico de red.

Pre-requisitos para crear un clúster.

● Para crear un clúster se tiene que ejecutar el comando

docker swarm init --advertise-addr <ip nodo administrador>

● La IP tiene que ser de una máquina física o virtual.

● Cuando se ejecuta el comando, nos devuelve un token que se tiene que

utilizar para añadir los nodos workers.

Crear un clúster.

● Para añadir un nodo al clúster se tiene que utilizar el comando join mas el

token que se ha creado con el comando init mas la IP y puerto de

comunicaciones del nodo administrador

docker swarm join --token <token>

Añadir nodos al cluster.

● Para eliminar un nodo de un clúster se puede utilizar el comando leave.

docker swarm leave

Se puede utilizar el parámetro force para forzar la eliminación del nodo.

Eliminar nodos.

● Para promocionar un nodo se utiliza el método promote, sirve para que

además de worker pueda ser manager.

docker node promote nodo_worker

● Para degradar un nodo (quitarlo de manager) se utiliza el método demote.

docker node demote nodo_worker

Promocionar o degradar nodos.

● Cuando se despliega un servicio = a crear un contenedor en el clúster.

● El comando create tiene los siguientes parámetros:

○ name: nombre del servicio

○ replicas: número de réplicas que se van a desplegar

○ p / publish el puerto por el que es accesible

docker service create --name miservicio1 --replicas 1 microsoft/iis

Desplegar un servicio.

● Con el comando ls se puede listar los servicios del clúster

docker service ls

● Con el comando ps nos da más información del servicio

Verificar el despliegue del servicio.

● Con el comando scale se puede escalar un servicio dentro del clúster

docker service scale miservicio1=4

El escalado es tanto para aumentar la cantidad de servicios como para

disminuir los servicios

Escalar un servicio.

● Para eliminar un servicio se utiliza el método rm

docker service rm servicio1

La eliminación es automática, en pocos segundos es eliminado del clúster.

Eliminar un servicio.

Demo.

Administrar un Clúster Swarm

con Portainer en modo local.

Preguntas.

Gracias por participar.

dockertipshelp@gmail.com

Próximo evento III) Kubernetes.