Clouding.io: Prestashop sobre Docker en servidor CentOS 7.0
Introducción
Clouding.io es una empresa española que ofrece servicios de hosting en la nube, más concretamente servidores Cloud. Recientemente se pusieron en contacto conmigo para que pusiera a prueba sus VPS Cloud desplegando un servidor Linux con Docker y una instancia de Prestashop.
En este tutorial veremos cómo crear un nuevo servidor CentOS 7.0 desde la intuitiva interfaz de clouding.io y como instalar y configurar Docker-ce para el despliegue de una tienda virtual Prestashop. Para este último paso emplearemos una imagen Docker de Prestahsop y otra de MySQL para crear una base de datos exclusiva para la tienda.
Clouding.io
Despliegue del servidor
El primer paso será crear un nuevo servidor, para ello, desde nuestra cuenta accedemos a la sección servidores y presionamos sobre el botón ‘+’ para crear un nuevo servidor.
Desde esta pantalla elegiremos la distribución Linux de nuestra preferencia, en nuestro caso CentOS 7.0 (64 Bit) y las características del servidor. Para nuestra prueba hemos configurado un servidor con 2 VCores, 4 GiB de memoria RAM y 15 GiB de espacio en disco, no obstante, estos valores deben definirse en función del uso definitivo que se le vaya a dar al servidor.
Una vez confirmada nuestra selección volveremos al listado de servidores, dónde ya aparecerá el servidor que hemos creado.
Acceso al servidor
El acceso al servidor lo haremos a través de SSH. El usuario con el que podemos acceder es root
, su contraseña está disponible en la pantalla de detalles del servidor.
Para acceder a los detalles del servidor, simplemente tenemos que pinchar en el nombre del servidor desde la pantalla anterior donde se mostraba el listado de servidores.
Docker
Instalando Docker-ce en CentOS 7
El primer paso para poder desplegar cualquier imagen de Docker en el servidor es instalar Docker-ce, para ello seguiremos la guía que hay disponible en su web.
En primer lugar debemos habilitar el repositorio, para ello debemos instalar algunas dependencias de Docker.
1yum install yum-utils device-mapper-persistent-data lvm2
El siguiente paso es añadir el repositorio estable de Docker-ce. Este es el repositorio que se utilizará siempre, incluso cuando queramos instalar builds de Docker del repositorio edge o test.
1yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
En este momento ya podemos instalar docker en el servidor:
1yum install docker-ce
Servicio Docker-ce en CentOS 7
Una vez termine el proceso de instalación correctamente ya podremos arrancar el servicio de docker:
1systemctl start docker
Finalmente, para que Docker arranque automáticamente si el servidor se reinicia habilitaremos el servicio:
1systemctl enable docker
Portainer
Una vez Docker ya se encuentra disponible en nuestra máquina, podemos proceder con el despliegue de algunos contenedores.
Una de las aplicaciones más utilizadas en Docker es Portainer, ya que permite la gestión de Docker a través de una intuitiva aplicación web.
Despliegue de Portainer
El primer paso para desplegar Portainer es crear un directorio que mapearemos como volumen en el contenedor de modo que si el contenedor se destruyese o recrease, Portainer no perdería sus datos.
1mkdir /opt/portainer
El siguiente paso es el despliegue del contenedor:
1docker run -d -p 9123:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v /opt/portainer:/data portainer/portainer
El comando anterior desplegará la imagen de Portainer en el puerto 9123
con el nombre “portainer” habilitando su reinicio automático en el caso en que Docker se reiniciara (reinicio de la máquina, reinicio manual del servicio de Docker, etc.).
A su vez mapeamos dos volúmenes en la máquina, el primero docker.sock
, permitirá a Portainer comunicarse con el proceso de Docker en el servidor (host machine) e invocar comandos.
El segundo volumen mapea el directorio creado anteriormente con la ubicación donde la imagen de Portainer almacena sus datos (usuarios, configuraciones…), de modo que si accidentalmente destruyésemos el contenedor, esta información no se perdería.
Clouding.io firewall
Clouding.io ofrece una capa de firewall por encima de los servidores. El firewall por defecto contiene normas para permitir tráfico por el puerto SSH, FTP, HTTP…. Sin embargo, el puerto que hemos asignado a Portainer 9123
se encuentra bloqueado por defecto.
Para poder acceder a la interfaz debemos de agregar una nueva norma al firewall. En la pestaña “RED” encontramos los Firewalls vinculados con la máquina:
Para agregar la nueva norma, presionamos sobre el menú contextual del Firewall asignado default
y accedemos a la opción editar para acceder a la pantalla de gestión de Firewalls.
Desde aquí podemos presionar sobre el botón ‘+’ en la sección de “Normas del Firewall” para agregar la nueva regla:
Configuración de Portainer
En estos momentos ya podemos acceder a la interfaz de Portainer a través de un navegador accediendo a http://ip-publica-servidor:9123.
Como es la primera vez que accedemos, Portainer nos va a pedir crear un usuario administrador y el tipo de entorno que queremos gestionar.
Una vez hemos dado de alta el usuario y hemos elegido el entorno “Local” ya dispondremos de acceso a la aplicación y podremos listar los contenedores. Si todo ha ido bien, en la lista de contenedores únicamente debería de figurar “portainer”.
Prestashop
Finalmente y a modo de ejemplo, vamos a desplegar una instancia de Prestashop en el entorno Docker que hemos puesto a punto.
MySQL
Prestashop depende de MySQL para almacenar sus datos. Lo primero que haremos será desplegar una imagen compatible de MySQL.
Del mismo modo que hicimos para Portainer, en la máquina host crearemos un directorio para almacenar los datos de MySQL de modo que si el contenedor se destruyese la información de la tienda no se perdería.
1mkdir -p /opt/prestashop/mysql
El siguiente paso será desplegar el contenedor de MySQL, para ello lanzamos el siguiente comando:
1docker run --name prestashop-db --restart always -v /opt/prestashop/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root_password -e MYSQL_DATABASE=prestashop -e MYSQL_USER=prestaUser -e MYSQL_PASSWORD=prestaPassword -d mysql:8.0 --default-authentication-plugin=mysql_native_password --character-set-server=utf8
--restart always
: Indica a Docker que el contenedor siempre debe de reiniciarse-v /opt/prestashop/mysql:/var/lib/mysql
: Mapea el primer directorio en la máquina host contra el segundo en el contenedor-e MYSQL_ROOT_PASSWORD=root_password
: Establece la contraseña del usuario root dentro del contenedor-e MYSQL_DATABASE=prestashop
: Crea una base de datos inicial con el nombre ‘prestahsop’-e MYSQL_USER=prestaUser
: Crea un usuario inicial con el nombre ‘prestaUser’-e MYSQL_PASSWORD=prestaPassword
: Asigna una contraseña al usuario inicial--default-authentication-plugin=mysql_native_password
: Parámetro de MySQL que permite modificar la forma de autenticación por defecto. Necesario por compatibilidad con Prestashop--character-set-server=utf8
: Parámetro de MySQL que permite modificar el juego de caracteres por defecto en el servidor. Necesario por compatibilidad con Prestashop
En el comando anterior debemos reemplazar en las variables de entorno las contraseñas (root_password
, prestaPassword
) por valores más seguros y conocidos de modo que las podamos emplear en el caso que hubiese que hacer una intervención manual en la base de datos.
Contenedor Prestashop
Una vez MySQL esté disponible podemos proceder al despliegue del contenedor con Prestashop. Al igual que en los casos anteriores, crearemos un directorio en la máquina host para poder persistir la información del contenedor.
1mkdir -p /opt/prestashop/html
A continuación lanzamos el siguiente comando para iniciar el contenedor:
1docker run --name prestashop --restart always --link prestashop-db -v /opt/prestashop/html:/var/www/html -e DB_SERVER=prestashop-db -e DB_USER=prestaUser -e DB_PASSWD=prestaPassword -e PS_LANGUAGE=es -e PS_COUNTRY=ES -e PS_DOMAIN=185.166.213.138 -e ADMIN_MAIL=mr@pink.com -e ADMIN_PASSWD=mr_pink_demo -e PS_INSTALL_AUTO=1 -p 80:80 -d prestashop/prestashop:1.7
-v /opt/prestashop/html:/var/www/html
: Mapea el primer directorio en la máquina host contra el segundo en el contenedor-e DB_SERVER=prestashop-db
: Establece el nombre del host de MySQL al que debe de conectarse Prestashop. Debe coincidir con el nombre del contenedor de MySQL creado anteriormente-e DB_USER=prestaUser
: Nombre del usuario de la base de datos-e DB_PASSWD=prestaPassword
: Contraseña del usuario de base de datos-e PS_LANGUAGE=es
: Idioma en el que se instalará Prestashop-e PS_COUNTRY=ES
: País para el que se instalará Prestashop-e PS_DOMAIN=185.166.213.138
: Nombre de dominio en el que correrá la aplicación. En nuestro caso apuntamos directamente a la IP pública del servidor creado en clouding.io. Debería de sustituirse por un nombre de dominio real que apuntase a esa misma IP-e ADMIN_MAIL=mr@pink.com
: Email y nombre de usuario administrador que se creará para la tienda-e ADMIN_PASSWD=mr_pink_demo
: Contraseña para el usuario administrador-e PS_INSTALL_AUTO=1
: Flag para que el proceso de instalación se inicia automáticamente
Una vez lanzado el comando, desde la interfaz de Portainer visualizaremos los logs del contenedor para controlar cuándo se completa la instalación:
Cuando se muestre la línea Command line: 'apache2 -D FOREGROUND'
en el log el servidor estará disponible.
Nos quedará un último paso y es renombrar los directorios install
y admin
por otros más secretos. Como disponemos de acceso al directorio donde Prestashop almacena su información (directorio mapeado), podemos acceder hasta este a través de la consola SSH y renombrar los directorios.
Es importante elegir un nombre más complicado y que evite ataques indeseados. Hecho esto ya podemos acceder a la consola de administración de la tienda y a la tienda en sí.
Conclusión
En este tutorial hemos visto cómo crear un nuevo servidor CentOS 7 empleando los servicios en la nube de clouding.io y como instalar y configurar Docker-ce para el despliegue de una tienda virtual Prestashop.
A pesar de que Prestashop es una aplicación monolítica y no está diseñada para desplegarse como un microservicio, hacer todo el procedimiento de instalación empleando Docker resulta mucho más rápido.
El despliegue del servidor empleando la interfaz de Clouding.io ha resultado muy sencillo, en menos de dos minutos hemos podido desplegar un nuevo servidor y disponer de todo lo necesario para acceder mediante SSH al mismo. Además, la capa de Firewall nos permite disponer de mecanismos de seguridad sin tener que configurarlos en la propia máquina y poderlo configurar a través de la interfaz web con efecto inmediato.
En cuanto al rendimiento del servidor, a pesar de estar probando una tienda Prestashop sin ningún tipo de optimización, el tiempo de carga total de la página es inferior a 3 segundos. En este aspecto podemos concluir que la red de clouding.io donde se aloja el servidor es bastante rápida y estable.