PrestaShop con Docker y Docker Compose

Implantación de Aplicaciones Web

José Juan Sánchez Hernández

Curso 2023/2024



1 Despliegue de PrestaShop usando contenedores Docker y Docker Compose

En esta práctica tendremos que realizar la implantación de un sitio PrestaShop en Amazon Web Services (AWS) haciendo uso de contenedores Docker y la herramienta Docker Compose.

1.1 Tareas a realizar

A continuación se describen muy brevemente algunas de las tareas que tendrá que realizar.

  1. Crear una máquina virtual Amazon EC2. Para evitar posibles problemas con el instalador de PrestaShop asegúrese que su máquina virtual tiene al menos 2 GB de memoria RAM

  2. Instalar y configurar Docker y Docker compose en la máquina virtual.

  3. Crear un archivo docker-compose.yml para poder desplegar los servicios de PrestaShop, MySQL y phpMyAdmin. Deberá utilizar las imágenes oficiales de Docker Hub. La imagen de PrestaShop que debe utilizar es la de Bitnami (bitnami/prestashop).

  4. Buscar cuál es la dirección IP pública de su instancia en AWS y comprobar que puede acceder a los servicios de PrestaShop y phpMyAdmin desde una navegador web.

  5. Una vez que tenga el archivo docker-compose.yml configurado de forma correcta, se propone añadir el servicio https-portal para poder acceder al servicio de PrestaShop a través de un nombre de dominio por HTTPS.

1.2 Requisitos del archivo docker-compose.yml

1.2.1 Networks

Los servicios definidos en el archivo docker-compose.yml deberán usar dos redes:

En la red frontend-network estarán los servicios:

Y en la red backend-network sólo estará el servicio:

Sólo los servicios que están en la red frontend-network expondrán sus puertos en el host. Por lo tanto, el servicio mysql no deberá estar accesible desde el host.

A continuación se muestra un diagrama con las redes y los servicios que tiene que crear:

1.2.2 Docker restart policies

Deberá utilizar alguna política de reinicio para que los contenedores se reinicien cada vez que se detengan de forma inesperada.

Se recomienda consultar la documentación oficial de la opción restart.

1.2.3 Variables de entorno

Deberá hacer uso de un archivo .env para almacenar todas las variables de entorno que necesite en el archivo docker-compose.yml.

En la documentación oficial puede encontrar más información sobre cómo hacer uso de variables de entorno en el archivo docker-compose.yml.

1.2.4 Orden en el que se inician los servicios

Deberá indicar el orden en el que se deben iniciar los servicios con la opción depends_on. Se recomienda la lectura del artículo Control startup and shutdown order in Compose

Para garantizar que el servicio de MySQL está listo para aceptar conexiones, deberá utilizar la opción healthcheck del archivo docker-compose.yml. Se recomienda la lectura del artículo Healthcheck. Compose file version 3 reference.

1.3 Ejemplo de archivo docker-compose.yml utilizando la imagen prestashop/prestashop

A continuación se muestra una posible solución de la práctica utilizando la imagen de PrestaShop prestashop/prestashop.

Este ejemplo también está disponible en siguiente repositorio en GitHub:

Recuerde que tendrá que modificar el archivo docker-compose.yml de ejemplo para utilizar la imagen de PrestaShop de Bitnami (bitnami/prestashop).

Contenido del archivo docker-compose.yml:

version: '3.3'

services:
  prestashop:
    image: prestashop/prestashop:1.7
    environment:
      - PS_INSTALL_AUTO=${PS_INSTALL_AUTO:-1}
      - DB_SERVER=${DB_SERVER:-mysql}
      - DB_USER=${MYSQL_USER}
      - DB_PASSWD=${MYSQL_PASSWORD}
      - DB_NAME=${MYSQL_DATABASE}
      - PS_DOMAIN=${PS_DOMAIN}
      - PS_ENABLE_SSL=${PS_ENABLE_SSL:-1}
      - PS_FOLDER_INSTALL=${PS_FOLDER_INSTALL:-install-dev}
      - PS_FOLDER_ADMIN=${PS_FOLDER_ADMIN:-admin-dev}
      - PS_COUNTRY=${PS_COUNTRY:-es}
      - PS_LANGUAGE=${PS_LANGUAGE:-es}
      - ADMIN_MAIL=${ADMIN_MAIL}
      - ADMIN_PASSWD=${ADMIN_PASSWD}
    restart: always
    volumes:
      - prestashop_data:/var/www/html
    depends_on:
      - mysql
    networks:
      - frontend_network
      - backend_network
  
  mysql:
    image: mysql:8
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_DATABASE=${MYSQL_DATABASE}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
    restart: always
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - backend_network
    security_opt:
      - seccomp:unconfined

  phpmyadmin:
    image: phpmyadmin:5
    restart: always
    ports:
      - 8080:80
    environment:
      - PMA_HOST=mysql
    depends_on:
      - mysql
    networks:
      - frontend_network
      - backend_network

  https-portal:
    image: steveltn/https-portal:1
    ports:
      - 80:80
      - 443:443
    environment:
      DOMAINS: 'localhost -> http://prestashop:80 #local'
      #DOMAINS: '${PS_DOMAIN} -> http://prestashop:80 #production'
    volumes:
      - ssl_certs_data:/var/lib/https-portal
    depends_on:
      - prestashop
    restart: always
    networks:
      - frontend_network

volumes:
  prestashop_data:
  mysql_data:
  ssl_certs_data:

networks:
  frontend_network:
  backend_network:

Contenido del archivo .env:

# Configuración de acceso a la base de datos
MYSQL_ROOT_PASSWORD=password
MYSQL_DATABASE=prestashop_db
MYSQL_USER=prestashop_user
MYSQL_PASSWORD=prestashop_password

# Configuración de PrestaShop
PS_DOMAIN=localhost
#PS_DOMAIN=iaw-test.ddns.net
ADMIN_MAIL=admin@mail.es
ADMIN_PASSWD=admin_password

1.4 Posibles errores que le pueden aparecer

1.4.1 Error: mbind: Operation not permitted

Si utiliza la imagen de MySQL etiquetada como mysql:8, puede ser que obtenga el siguiente mensaje de error: mbind: Operation not permitted.

Para solucionarlo tiene que ejecutar el contenedor sin el perfil seccomp (Secure Computing mode) predeterminado.

seccomp es una característica del kernel de Linux que permite limitar las llamadas al sistema que puede realizar un proceso.

Solución:

  mysql:
    image: mysql:8
    ...
    security_opt:
      - seccomp:unconfined

Referencias:

1.5 Entregables

En esta práctica habrá que entregar un documento técnico con la descripción de los pasos que se han llevado a cabo durante todo el proceso.

El documento debe incluir como mínimo lo siguientes contenidos:

2 Referencias

3 Licencia

Licencia de Creative Commons
Esta página forma parte del curso Implantación de Aplicaciones Web de José Juan Sánchez Hernández y su contenido se distribuye bajo una licencia Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional.