Introducción a Docker: Nginx + PHP + Redis

Continuando la serie de publicaciones dedicada a los conceptos básicos de Docker, hoy vamos a jugar a añadir almacenamiento al entorno que ya teníamos, en este caso la elección es Redis. Esta maravilla del código abierto es famosa por su versatilidad, confiabilidad y eficiencia, que de forma general funciona como almacenamiento en memoria de estructuras de datos. Tiene muchísimos casos de uso: hacer de caché de grandes volúmenes de información, gestión de sesiones en aplicaciones, etc. Redis es capaz de almacenar cadenas de texto de hasta 512MB como valor de una determinada clave.

Preparando el entorno

Vamos a retomar el entorno que conseguimos construir en el anterior post, para ello lo primero que necesitamos es tener clonado el repositorio https://github.com/avcconti/ph-docker-intro , y nos iremos a la carpeta /3-Redis. Si abrís el index.php veréis que tiene cierta modificaciones en la parte superior:

<?php 
/*
Default config
 */
error_reporting(E_ALL);
ini_set('display_errors', 'On');
date_default_timezone_set('UTC');
/*redis*/
$redis = new Redis();
$connect=$redis->connect("redis", 6379,3);
if(!$connect){
    error_log("Could not locate redis server");
}
?>

Y en la cabecera:

<h1>3-REDIS-share-data <?php echo $redis->incr("counter");?></h1>

Al haber sufrido modificaciones con respecto a las imágenes que ya teníamos, vamos a rehacerlas con los comandos:

docker image build -t test-nginx -f Dockerfile .
docker image build -t test-php-fpm -f DockerfilePHP .

Ahora arrancamos los contenedores de Nginx y PHP-FPM:

docker container run --rm -it -v $PWD:/www/myapp --name test-php-fpm -p 9000:9000 --net mynet test-php-fpm
docker container run --rm -it -v $PWD:/www/myapp --name test-nginx -p 8082:80 --net mynet test-nginx

NOTA: si no encuentra la red "mynet", la podéis crear con:

docker network create mynet

Con esto funcionando vamos a visitar nuestra URL favorita en el navegador: http://localhost:8082/

Y BOOOOMMMMMM fallo de PHP que hará las delicias de sus detractores:

No nos pongamos nerviosos… “emosido engañados”.

Le toca a Redis

Esto va a ser rápido, ejecutad el siguiente comando en otra terminal sin parar los otros dos contenedores:

docker container run -it --rm -p 6379:6379 --name redis --net mynet redis

Ya está Redis funcionando en nuestro sistema:

No hemos necesitado usar ningún Dockerfile para modificar comportamiento, directamente nos hemos bajado la imagen existente en DockerHub y la hemos ejecutado tal cual. Ahora volvemos al navegador y recargamos la página:

¡TACHÁN!

 

Y volvemos a recargar:

 

Y ahora paramos el contenedor de Redis con CTRL+C (En MacOS):

 

Y volvemos arrancarlo con el mismo comando de antes:

docker container run -it --rm -p 6379:6379 --name redis --net mynet redis

 

Recargamos el navegador de nuevo:

¿¿¿¿TACHÁN????

 

¿Pero esta publicación no iba de almacenamiento y persistencia? La gracia de Redis estaba en usarlo como caché y persistencia de datos temporal, ¿correcto? Los datos generados dentro del contenedor de Redis se pierden si lo paramos. Para poder tener persistencia de datos vamos a recurrir a la misma técnica que usamos anteriormente para enlazar los volúmenes de Nginx y Php:

docker container run -it --rm -p 6379:6379 --name redis --net mynet -v redis_data:/data redis

 

Traducción:

Monta el como volumen el directorio redis_data en el path del contenedor /data , pero:

  • ¿Dónde está redis_data? Cuando no existe, Docker lo crea automáticamente como un volumen, en caso de existir lo reutiliza copiando todos los datos al path destino.
  • ¿Dónde puedo verlo? Ejecuta el comando docker volume ls y lo verás allí.

Con nuestro “nuevo” Redis persistente arrancado, recarga un par de veces el navegador, apaga Redis, vuelve a arrancarlo, recarga el navegador, y ahora:

¡TACHÁN!

 

Hasta aquí hemos llegado en esta ocasión, muy hartos de introducir comandos largos en la terminal, pero eso se va acabar. En la próxima publicación hablaremos de auténtica brujería “docker-composiana”.

Serie de introducción a Docker

  1. Introducción a Docker: Nginx
  2. Introducción a Docker: Nginx + PHP
  3. Introducción a Docker: Nginx + PHP + Redis

Leave a Reply