Práctica 7: Uso básico de Docker

Introducción a Docker

Funcionamiento

Docker es una plataforma que ofrece soporte para la ejecución de aplicaciones y servicios en contedores.

Contenedores vs. Máquinas virtuales!

Elementos principales

Imágenes

Plantillas de sólo lectura que sirven de base para la creación del contenedor.

Principales comandos para la gestión de imágenes:

Elementos Docker!

Contenedores

Los contenedores son instancia en ejecución una imagen.

Principales comandos para la gestión de contenedores:

Parámetros relevantes de docker create y docker run:

Volúmenes y bind mount

Los ficheros manejados por los contenedores son efímeros y no se mantienen entre ejecuciones.

Docker ofrece dos mecanismos (volúmenes Docker y bind mount) para mantener datos persitentes entre ejecuciones de un mismo contenedor o para compartir datos entre varios contenedores o entre contenedor y anfitrión.

1. Volúmenes Docker

Almacenamiento de datos gestionado por Docker (almacenado en /var/lib/docker/volumes, no editable directamente).

Modo de uso: Al crear el contenedor (docker create ó docker run) los volúmenes (con nombre o anónimos) son vinculados a los contenendores con -v|--volume ó -m|--mount type=volume, indicando en ambos casos el punto de montaje en el contenedor donde se ubicará el contenido del volumen indicado.

Comandos principales:

2. Bind mount

Docker permite vincular(montar) directorios o ficheros del sistema anfitrión en la jearquía de directorios del anfitrión.

Modo de uso: Al crear el contenedor (docker create ó docker run) son los bind mount son vinculados a los contenendores con -v|--volume ó -m|--mount type=bind, indicando en ambos casos la ruta del directorio/fichero del anfitrión y el punto de montaje en el contenedor donde se ubicará el contenido del directorio/fichero montado.

Redes

Por defecto en Docker hay 3 redes predefinidas (bridge, host y none), pero es posible crear redes definidas por el usuario.

Ver (https://docs.docker.com/network/)

Salvo que se indique lo contrario con la opción --network, los contenedores se conectan por defecto a la red de tipo bridge llamada bridge con direcciones 172.17.0.0/16 (siendo la IP 172.17.0.1 el propio anfitrión que actúa como gateway). Los contenedores conectados a esta red que quieren exponer algún puerto al exterior tienen que usar la opción -p para mapear puertos.

En general las redes bridge definidas por el usuario son más flexibles que la red bridge por defecto: tienes resulución DNS implícita, permiten conexiones "en caliente" de nuevos contenendores (la conexión a la red bridge por defecto sólo puede hacerse en el momento de la creación del contenedor) y ofrecen mayor control y aislamiento.

 

Comandos relevantes para redes definidas por el usuario:

 

PREVIO: Instalación de Docker

Equipos físicos del laboratorio

Ya tienen Docker instalado, con los privilegios adecuados, por lo que se puede usar con cualquier usuario (con el alumno genérico o con el propio de cada alumno)

Equipos propios

Están disponibles las instrucciones de instalación para MS Windows, iOS y diversas distribuciones GNU/Linux en la web de Docker: Docker Engine Instalation

Máquina virtual de prácticas

Scripts de instalación:

  1. Acceder con el usuario root y la contraseña purple y arrancar el entorno gráfico con startx.

  2. Desde un terminal, instalar con aptlos paquetes Docker de la distribución Debian (paquete docker.io) .

    • Nota: La versión de los mantenedores del paquete .deb es un poco más antigua que la disponible en los repositior oficiales de Docker.
  3. Opcionalmente, se puede añadir al usuario sin privilegios usuario al grupo docker para que se le permita ejcutar los comandos de Docker sin necesidad de usar sudo.

Ejemplos

Ejemplo 1: Imágenes y contenendores

 

 

 

Ejemplo 2: Redirección de puertos (-p) y compartición con mount bind (--mount)

Ejemplo 3: Uso conjunto de contenedores y redes (MariaDB + PHPMyAdmin)

Imagen oficial de MariaDB: https://hub.docker.com/_/mariadb

Imagen oficial de PHPMyAdmin: https://hub.docker.com/_/phpmyadmin

 

Ejercicio entregable.

Hacer manualmente un despliegue de contenedores Docker con las siguientes caracterísiticas:

Documentación de las imágenes a utilizar (disponibles en Docker Hub):

NUEVO: Pasos/pistas (el orden es relevante)

  1. Crear en el anfitrión los directorios a usar con --mount

    • para /var/lib/mysql del contenedor MariaDB
    • para /var/www/html/wp-content de los contenedores Wordpress
    • para /usr/local/etc/haproxy del contenedor HAProxy
  2. Crear el fichero de configuración de HAProxy (haproxy.cfg)

    • en frontend ajustar bind a 0.0.0.0:80 ó *:80
    • en backend ajustar la dirección de los server usando los nombres de los contenedores Wordpress
  3. Crear las redes necesarias

  4. Crear los contenedores necesarios, ajustando las variables de entorno (con -e) según corresponda

  5. Establecer las conexiones de red adicionales

 

Nota: La instalación final de Wordpress a partir de la imagen Docker oficial necesitaría configuración adicional para que funcione correctamente con la redirección de puertos utilizada (-p 8080:80)(ver https://www.cloudytuts.com/tutorials/docker/how-to-solve-wordpress-redirects-to-localhost-8080/). Para este ejemplo basta con verificar que se tiene acceso.

 

Entregable