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.
● 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.
● 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.
● 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>
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.
● 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.