El archivo YAML

  Se ha explicado, en una entrada anterior, que para instalar contenedores con Docker Compuesto hace falta que haya en el directorio donde se ejecute un archivo del tipo yaml.
  No obstante, este tipo de archivo no es exclusivo de su empleo con la mencionada herramienta de Docker, sino que se utiliza para otras tareas informáticas, llegando a ser muy versátil.
  YAML es un formato de serialización de datos legible por humanos inspirado en lenguajes como XML, C, Python, Perl, así como el formato para correos electrónicos especificado en RFC 2822.
  Este tipo de archivo fue creado bajo la creencia de que todos los datos pueden ser representados adecuadamente como combinaciones de listas, mapeos ("hashes", en inglés) y datos escalares (valores simples). La sintaxis es relativamente sencilla y fue diseñada teniendo en cuenta que fuera muy legible pero que a la vez fuese fácilmente mapeable a los tipos de datos más comunes en la mayoría de los lenguajes de alto nivel. Además, YAML utiliza una notación basada en la indentación y/o un conjunto de caracteres Sigil distintos de los que se usan en XML, haciendo que sea fácil componer ambos lenguajes.

  Por una parte, los contenidos en YAML se describen utilizando el conjunto de caracteres imprimibles de Unicode, bien en UTF-8 o UTF-16. Además, la estructura del documento se denota indentando con espacios en blanco; sin embargo no se permite el uso de caracteres de tabulación para indentar.
  Se emplean diversos signos de puntuación con diversas funciones diferentes a las que suelen tener en otros lenguajes de programación:
  •   Los miembros de las listas se denotan encabezados por un guión ( "-" ) con un miembro por cada línea, o bien entre corchetes ( "[   ]" ) y separados por coma espacio ( ",   " ).
  •   Los vectores asociativos se representan usando los dos puntos seguidos por un espacio en la forma "clave: valor", bien uno por línea o entre llaves ( "{   }" ) y separados por coma seguida de espacio ( ",   " ).
  •   Un valor de un vector asociativo viene precedido por un signo de interrogación ( "?" ), lo que permite que se construyan claves complejas sin ambigüedad.
  •   Los valores sencillos (o escalares) por lo general aparecen sin entrecomillar, pero pueden incluirse entre comillas dobles ( " ), o comillas simples ( ' ).
  •   En las comillas dobles, los caracteres especiales se pueden representar con secuencias de escape similares a las del lenguaje de programación C, que comienzan con una barra invertida ( " \ " ).
  •   Se pueden incluir mútliples documentos dentro de un único flujo, separándolos por tres guiones ( "---" ); los tres puntos ( "... " ) indican el fin de un documento dentro de un flujo.
  •   Los nodos repetidos se pueden denotar con un et ( "&" ) y ser referidos posteriormente usando el asterisco ( "* " ).
  •   Los comentarios vienen encabezados por la almohadilla ( "#" ) y continúan hasta el final de la línea.
  •   Los nodos pueden etiquetarse con un tipo o etiqueta utilizando el signo de exclamación ( "!" ) seguido de una cadena que puede ser expandida en una URL.
  •   Los documentos YAML pueden ser precedidos por directivas compuestas por un signo de porcentaje ( "%" ) seguidos de un nombre y parámetros delimitados por espacios. Hay definidas dos directivas en YAML 1.1: "%YAML" (identifica la versión de YAML en un documento dado), y "%TAG" (se emplea como atajo para los prefijos de URIs. Estos atajos pueden ser usados en las etiquetas de tipos de nodos).
  YAML requiere que las comas y puntos y comas que se utilicen como separadores en las listas sean seguidos por un espacio, de forma que los valores escalares que contengan signos de puntuación se puedan representar sin necesidad de utilizar comillas.
  Existen implementaciones de este lenguaje de marcado ligero para los siguientes lenguajes: JavaScript, Objective-C, Perl, PHP, Python, Ruby (utiliza YAML como el formato de serialización por defecto; YAML está incluido en la biblioteca estándar desde la versión 1.8), Java, Haskell, y XML.


EJEMPLO DE USO (DOCKER COMPUESTO)

  Una de las utilidades más actuales de un archivo YAML (con extensión ".yml") es el despliegue de aplicaciones en contenedores de Docker gracias a Docker Compuesto. Con esta función, el archivo se suele denominar "docker-compose.yml"
  En un fichero YAML es posible definir, entre otras cosas, la imagen o imágenes de Docker que se pretende utilizar, la exposición de puertos o los volúmenes de almacenamiento de Docker.
  En primer lugar, se debe recordar que todos los elementos relevantes de un archivo YAML, como sucede con la mayoría de los elementos relacionados con la informática, se deben escribir en inglés para que el Docker Compuesto los interprete sin errores.
    En este caso, los vectores asociativos se anidan en árbol cuando es necesario (es decir, el vector asociativo que constituye un valor de otro se tabula bajo su clave). Los vectores asociativos más comunes en este tipo de archivo para Docker Compuesto son:
  •    build: Especifica opciones de configuración que se aplicarán durante la creación de los contenedores. También puede utilizarse para especificar una ruta donde se crearán los contenedores. No obstante, posee los siguientes argumentos: Context (especifica una ruta a un archivo de Docker o a una direccción externa de descarga), dockerfile (especifica un archivo de Docker concreto, cuya ruta debe ser especificada con el argumento anterior), args (añade variables del entorno necesarias para la construcción; deben especificarse los argumentos en un fichero de docker al que se hará referencia desde el fichero YAML), cache_from (lista de imágenes de Docker que el motor utilizara en caché), labels (agrega metadatos a la imagen resultante; disponible desde la versión 3 de Docker Compuesto), shm_size [determina el tamaño de la partición donde irán los contenedores (formato shm); disponible desde la versión 3 de Docker Compuesto], target (especifica el escenario definido en el archivo de Docker; disponible desde la versión 3 de Docker Compuesto).
  •   cap_add, cap_drop: Añade o elimina capacidades al contenedor.
  •   cgroup_parent: Especifica un grupo c padre alternativo al contenedor.
  •   command: Anula el comando predeterminado.
  •   configs: Otorga el acceso a las configuraciones basadas en por servicio empleando la configuración de configuraciones por servicio.
  •   container_name: Especifica un nombre personalizado para el contenedor. Ya que el nombre del contenedor debe ser único, no es posible escalar un servicio más allá de un contenedor si se le ha especificado un nombre personalizado.
  •   credential_spec: Configura una credencial especial para administrar una cuenta del servicio. Está disponible desde la versión 3 y sólo es válido para contenedores desplegados en Windows. Se debe utilizar con el formato "file://<nombre de archivo>" (el archivo debe estar situado en un subdirectorio "CredentialSpecs" dentro del directorio donde esté instalado Docker) o "registry://<nombre de valor>" (el valor debe encontrarse en la siguiente ruta del registro de Windows: "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers\CredentialSpecs").
  •   depends_on: Expresa dependencia entre servicios.
  •   deploy: Especifica configuraciones referentes al despliegue y activación de servicios, aunque sólo es efectivo si se despliega en una nube con el desarrollo apilado de Docker. Posee los siguientes argumentos: endpoint_mode (especifica un método para que los clientes externos se conecten a la nube; puede ser "vip" o "dnsrr"), labels (especifica etiquetas para el servicio que sólo aparecerán en este), mode [puede ser "global" (exactamente un contenedor por nodo de nube) o "replicated" (un número específico de contenedores; es la opción predeterminada)], placement (especifica la colocación de las restricciones y las preferencias), replicas (si el servicio es replicado, especifica el número de contenedores que pueden estar activos al mismo tiempo), resources (configura las restricciones de recursos), restart_policy {configura si y el modo en el que se reinician los contenedores al salir [opciones: condition ("none", "on-failure", "any"), delay (especifica el tiempo de espera entre intentos de reinicios; el valor predeterminado es "0"), max_attempts (especifica el nº de intentos de reinicio de un contenedor antes de abandonar; el valor predeterminado es "never give up"), window (tiempo de espera antes de decidir si un reinicio tuvo éxito; el valor predeterminado es "decide immediately")]}, rollback_config {configura el modo en el que retrocede un servicio en caso de fallo de actualización [opciones: parallelism (nº de contenedores que retroceden a la vez; si el valor es "0", retrocederán todos), delay (tiempo de espera del retroceso de cada contenedor de un grupo; el valor predeterminado es "0s"), failure_action (qué hacer si falla un retroceso; sus valores son "continue" y "pause", siendo este último el predeterminado), monitor (duración tras cada tarea de actualización monitorizada como fallida expresada en "ns", "us", "ms", "s", "m", "h"; el valor predeterminado es "0s"), max_failure_ratio (fallo proporcional a la tolerancia durante un retroceso; su valor predeterminado es "0"), order (orden de operaciones durante un retroceso; sus valores son "stop-first", que es el predeterminado, y "start-first")]}, update_config {configura cómo puede ser actualizado el servicio [opciones: parallelism (nº de contenedores que se actualizan a la vez), delay (tiempo de espera entre actualizaciones de un grupo de contenedores), failure_action (qué hacer si falla una actualización; sus valores son "continue", "rollback" y "pause", siendo este último el predeterminado), monitor (duración tras cada tarea de actualización monitorizada como fallida expresada en "ns", "us", "ms", "s", "m", "h"; el valor predeterminado es "0s"), max_failure_ratio (fallo proporcional a la tolerancia durante una actualización; su valor predeterminado es "0"), order (orden de operaciones durante una actualización; sus valores son "stop-first", que es el predeterminado, y "start-first")]}. Está disponible desde la versión 3.
  •   devices: Lista cartografiada de dispositivos.
  •   dns: Servidores DNS personalizados. Puede tener un valor único o una lista.
  •   dns_search: Personaliza búsquedas de DNS de dominios. Puede tener un único valor o una lista.
  •   env_file: Añade variables del entorno desde un archivo. Puede tener un único valor o una lista.
  •   environment: Añade avariables del entorno. Puede usarse una matriz o un diccionario. Cualquier valor booleano debe ir encerrado en comillas.
  •   expose: Expone puertos sin anunciárselo a la máquina anfitriona (sólo accesibles a servicios enlazados). Sólo se puede especificar el puerto interno.
  •  external_links: Enlaza a contenedores iniciados externos, especialmente contenedores que proporcionan servicios comunes o compartidos.
  •   extra_hosts: Añade nombres de anfitrión cartografiados.
  •   healthcheck: Configura una comprobación que se ejecuta para determinar qué contenedores están "sanos" y cuáles no. Para especificar la duración se emplean los parámetros "interval", "timeout" y "start_period". El parámetro "test" puede ser una cadena o una lista (debe comenzar con "NONE", "CMD", o "CMD-SHELL"). Está disponible desde la versión 2.
  •   image: Especifica la imagen desde la que iniciar el contenedor. Puede ser una etiqueta de repositorio o un número identificador parcial de la imagen.
  •    init: Ejecuta un inicio en el contenedor que adelanta señales y recoge procesos. Puede tener un valor booleano o especificar una ruta al inicio.
  •   isolation: Especifica una tecnología de aislamiento del contenedor. En Linux, el único valor aceptable es "default", mientras que en Windows, los valores aceptados son "default", "process" e "hyperv".
  •   labels: Añade metadatos al contenedor mediante etiquetas de Docker. Sus valores pueden ser matrices o diccionarios.
  •   links: Vincula los contenedores a otros servicios. Se puede especificar el nombre del servicio o utilizar un alias.
  •   logging: Configuración de inicio de sesión para el contenedor. El parámetro "driver" especifica un controlador de inicio de sesión para los contenedores del servicio.
  •   network_mode: Tipo de red.
  •   networks: Redes a unir. Posee los siguientes argumentos: aliases (nombres alternativos de anfitrión para este servicio en la red), ipv4_address y ipv6_address (ambos especifican una dirección IP estática al contenedor cuando se une a la red).
  •   pid: Establece el modo de pid del modo de pid del anfitrión.
  •   ports: Expone los puertos.
  •   restart: Reinicia el contenedor. Posee los valores "no" (no se reinicia nunca; es el valor predeterminado), "always" (siempre se reiniciará), "on-failure" (reinicia cuando se da el error "on-failure"), y "unless-stopped" (reinicia tras una parada).
  •   secrets: Otorga el acceso a los secretos de una base por servicio empleando la configuración de los secretos por servicio.
  •   security_opt: Anula el esquema de etiquetado predeterminado de cada contenedor.
  •   services: Especifica los servicios que se prepararán según las especificaciones del usuario (lo que constituye el resto del archivo).
  •   stop_grace_period: Especifica cuánto hay que esperar cuando se intenta detener un contenedor sin emplear los comando adecuados antes de su detención forzosa.
  •   stop_signal: Establece una señal alternativa para detener el contenedor.
  •   sysctls: Ajuste de parámetros del núcleo del contenedor. Su valor puede ser una matriz o un diccionario.
  •   tmpfs: Monta un sistema de archivos temporales en el contenedor. Puede tener un valor único o una lista.
  •   ulimits: Anula los ulímites predeterminados de un contenedor. Sus valores pueden expresarse con un número entero o con los parametros "soft" y "hard" cartografiados.
  •   userns_mode: Desactiva el espacio de nombre de un usuario para este servicio, si el demonio de Docker está configurado con espacios de nombres de usuario. 
  •  version: Muestra la versión de Docker Compuesto que se empleará. Su valor numérico suele ir entre comillas simples.
  •   volumes: Monta rutas de anfitrión o volúmenes denominados, especificados como opciones secundarias de un servicio.

  Como ejemplo se mostrará un archivo YAML que instala, en un único contenedor de Docker, dos programas que interactúan entre sí. El primero es el gestor de bases de datos MySQL, mientras que el segundo es el gestor de contenidos WordPress.

version: '2'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
volumes:
    db_data:


 Para profundizar sobre este tema, puede verse el siguiente enlace del sitio oficial de Docker.

  Espero que esta entrada haya sido del gusto del lector. En caso afirmativo, aguardo que la comente y/o la comparta, por favor.

No hay comentarios:

Publicar un comentario

Deje aquí su comentario, si no puede comentar, pruebe a hacerlo desde otro navegador de red u otro equipo.