Closed gcm1001 closed 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:
Dockerfile
.Con ambos contenedores ejecutándose simultáneamente Omeka ya estaría listo para funcionar.
Existen dos formas de ejecutar ambos contenedores:
docker run
para cada uno de ellos.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.
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
db_ini
: DockerCompose crea automáticamente el secreo db_ini
durante la "composición" utilizando el fichero ./db.ini
Necesitamos tener en la misma ruta que docker-compose.yml
el fichero db.ini
, en cuyo interior se encuentra el contenido del secreto db_ini
.
Este fichero es utilizado por Omeka para establecer conexión con la base de datos. Su contenido es el siguiente:
[database] host = "XXXXX" username = "XXXXX" password = "XXXXX" dbname = "XXXXX" prefix = "omeka_" charset = "utf8" ;port = ""
omeka_db_password
y omeka_db_root_password
: DockerCompose recoge de Docker ambos secretos.
omeka_db_password
y omeka_db_root_password
. Para ello, se ejecutan los siguientes comandos:
echo 'contra_de_la_bd' | docker secret create omeka_db_password -
echo 'contra_del_user_root_de_la_bd' | docker secret create omeka_db_root_password -
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.
En este apartado configuraré los servicios que necesita mi aplicación, los cuales son:
El procedimiento que hay que seguir es el siguiente:
services
indico que a continuación voy a especificar cada uno de los servicios .db
el nombre del primer servicio y omeka_app
el del segundo).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 nuestrossecrets
.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 nombreomeka_cenieh
y con versiónlatest
. 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 secretdb_ini
. Además, modifico los permisos para que el usuario y el grupo utilizado por Apache (por defecto utiliza eluid
ygid
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.