gcm1001 / TFG-CeniehAriadne

CENIEH & Ariadne+ project.
GNU General Public License v3.0
3 stars 2 forks source link

Aprender los conceptos básicos de Docker-Compose #27

Closed gcm1001 closed 4 years ago

gcm1001 commented 4 years ago
gcm1001 commented 4 years ago

Como resultado de la Issue #20 conseguí desarrollar el fichero Dockerfile. Este contiene todas las instrucciones necesarias para automatizar la creación de nuestra imagen personalizada. Dicha imagen ya puede ser montada sobre un contenedor Docker pero, ¿Contiene todos los requisitos software que necesita nuestra aplicación web (Omeka)?

La respuesta es NO. Recordemos que Omeka es un gestor de contenidos que requiere para su despliegue una infraestructura LAMP. Esta se compone fundamentalmente de 4 herramientas:

:heavy_check_mark: Linux como S.O. :heavy_check_mark: Apache como servidor web. :heavy_multiplication_x: Mysql/MariaDB como gestor de base de datos. :heavy_check_mark: PHP como lenguaje de programación.

Como podemos observar, he marcado con un tick verde aquellas herramientas que ya están implementadas en nuestra imagen creada a partir del Dockerfile y con un aspa roja las que no.

Dado que es necesario contar con una base de datos Mysql/MariaDB, el siguiente paso sería ejecutar por separado otro contenedor que contuviera una imagen donde estuviera implementada la base de datos. Llegados a este punto tendríamos dos contenedores a ejecutar:

  1. Contenedor 'LAP': contiene la imagen construida a partir del Dockerfile.
  2. Contenedor 'M': contiene la imagen oficial de Mysql.

Con ambos contenedores ejecutándose simultáneamente Omeka ya estaría listo para funcionar.

Existen dos formas de ejecutar ambos contenedores:

  1. Usar el comando docker run para cada uno de ellos.
  2. Utilizar Docker Compose.

La primera opción es muy inferior en cuanto a comodidad ya que la segunda, Docker Compose, nos permite definir nuestra aplicación multicontenedor en un solo archivo con las mismas propiedades que indicaríamos con el comando docker run individualmente. De esta manera, a través de un único comando, se podría ejecutar todos los contenedores a la vez y en el orden que queramos.

Para utilizar Docker Compose se necesita elaborar un fichero denomindado "descriptor de los contenedores". En él debemos especificar qué contenedores queremos ejecutar junto a sus propiedades (son las mismas que indicaríamos ejecutando los contenedores individualmente con el comando docker run). Este tiene formato .yaml

Dejaré como tarea para más adelante documentar el proceso de creación del descriptor de contenedores.

gcm1001 commented 4 years ago

Antes de empezar a desarrollar el fichero docker-compose.yml (descriptor de contenedores) hay que instalar la herramienta Docker Compose. En mi SO (Arch) se lleva a cabo este proceso a través del siguiente comando:

sudo pacman -S docker-compose 

Una vez instalado, ubicados en la misma carpeta donde se encuentra el fichero Dockerfile, creamos el fichero mencionado anteriormente.

sudo nano docker-compose.yml

En la primera línea del documento se debe indicar la versión del archivo para que este utilice las instrucciones Docker asociadas a dicha versión. En mi caso emplearé la última versión actual para ficheros docker-compose a través de la etiqueta version.

version: '3.7'

La versión 3.7 escogida es compatible con la versión 18.06.0 o superior de Docker.

El siguiente paso que realizaré será especificar los secrets que utilizaré más adelante para establecer las propiedades tanto de la imagen MYSQL como de la imagen que hemos generado con el Dockerfile. Este paso es altamente recomendable ya que no es conveniente, por seguridad, introducir directamente sobre el fichero propiedades como MYSQL_PASSWORD o MYSQL_ROOT_PASSWORD de la imagen MYSQL.

Para ello, utilizaré la etiqueta secrets. En su interior se especifica el nombre de los secrets junto a sus tipos.

secrets:
  db_ini:
    file: './db.ini'
  omeka_db_password:
    external: true
  omeka_db_root_password:
    external: true

Con los secrets ya configurados, podemos hacer uso de ellos en la especificación de las imágenes. Este paso lo documentaré en otra ocasión.

gcm1001 commented 4 years ago

En este apartado configuraré los servicios que necesita mi aplicación, los cuales son:

  1. Base de datos: MySQL
  2. Lenguaje de programación + Servidor: PHP + Apache

El procedimiento que hay que seguir es el siguiente:

  1. Con la etiqueta services indico que a continuación voy a especificar cada uno de los servicios .
  2. Señalo el nombre del servicio a especificar (en nuestro caso será db el nombre del primer servicio y omeka_app el del segundo).
  3. Establezco cada una de las propiedades asociadas a cada servicio .

    Servicio: Base de datos

    Nombre del servicio: db

    services:
      db:

    Propiedades: image: se indica el nombre de la imagen junto a su versión. Formato: nombreImagen:versión

        image: 'mysql:8.0'    

    environment: se especifica el valor de las variables de entorno existentes en la imagen. Formato: nombreVariable:valor. Este es el momento de utilizar nuestros secrets.

        enviroment:
          MYSQL_DATABASE: dbcenieh
          MYSQL_PASSWORD_FILE: /run/secrets/omeka_db_password       
          MYSQL_ROOT_PASSWORD_FILE: /run/secrets/omeka_db_root_password
          MYSQL_USER: cenieh

    volumes: se especifica el volumen para la BD. Necesario si queremos que los cambios en la bd sean persistentes. Formato: nombreVol:directorio.

        volumes:
          - 'db:/var/lib/mysql'

    secrets: se indica el nombre de los secrets utilizados.

        secrets::
          - 'omeka_db_password'
          - 'omeka_db_root_password'

    Servicio: Lenguaje de programación + Servidor

    Nombre del servicio: omeka_app

      omeka_app:

    Propiedades: image: se indica el nombre de la imagen junto a su versión. Formato: nombreImagen:versión. He compilado la imagen con nombre omeka_cenieh y con versión latest. Comando utilizado: docker build -t omeka_cenieh:latest (ejecutar en la misma ubicación que Dockerfile).

        image: 'omeka_cenieh:latest'    

    ports: se especifica el valor de los puertos para el servidor Apache.

        ports:
          - '80:80'

    volumes: se especifica el volumen para el servidor (donde se almacenarán los ficheros web dinámicos). Formato: nombreVol:directorio.

        volumes:
          - 'files:/var/www/html/files'

    secrets: se indica el nombre de los secrets utilizados. En este caso, hay que indicar el destino del fichero secret db_ini. Además, modifico los permisos para que el usuario y el grupo utilizado por Apache (por defecto utiliza el uid y gid 33 ) sea el único que pueda leer el secret (mode 0440).

        secrets::
          - source: db_ini
            target: /var/www/html/db.ini
            uid: '33'
            gid: '33'
            mode: 0440

Por último, especificamos los volúmenes que vamos a utilizar en cada servicio a través de la etiqueta volumes.

volumes:
  db:
  files:

Con esto, ya tendríamos el fichero docker-compose.yml listo para ser ejecutado.