tutorial docker y php

1. Introducción

El objetivo de esta entrada es conseguir un completo entorno de trabajo local desde el que poder desarrollar cualquier proyecto PHP de la forma más organizada y fácil posible. Para ello se explicará como construir este ecosistema mediante Docker sobre un entorno Windows.

Imagina desarrollar un proyecto PHP en tu entorno local (windows, mac o linux) que requiere, como suele ser habitual: nginx/apache y mysql. En este caso puedes instalarte un paquete como WAMP, MAMP, etc o incluso una máquina virtual. y configurarlo posteriormente, hasta aquí todo genial.

Pero ¿y si tienes varios proyectos PHP de los cuales cada uno requiere una versión de PHP diferente? ¿o de MySQL? ¿o unos usan nginx y otros apache? ¿y si otros tantos usan: MongoDB, PostgreSQL, etc? Esta bien… puedes configurar todo en tu entorno local con paciencia y si procede, cambiar manualmente las versiones de cada software si no coinciden en ese momento con las que requiere el proyecto. Pero… ¿Y si ahora nos vamos a otro ordenador diferente? ¿o si queremos que todo el equipo que trabaja en el mismo proyecto relique todo el entorno? Entonces tenemos que repetir todo este proceso de instalación y configuración de software. Aquí es donde entra en juego Docker!

Con Docker podrás construir todo el entorno necesario (nginx, mysql, redis, etc) con las versiones adecuadas y todo ya configurado para que tu proyecto funcione a la perfección ejecutando un solo comando.

2. Definiciones y conceptos

Antes de empezar a meter mano a todo esto, hay que tener claros ciertos conceptos a los que se harán referencia durante todo el post.

¿Qué es Docker?

Explicar a fondo el funcionamiento de Docker podría dar para uno o varios post, por lo que intentaré dejar clara la idea principal que persigue esta herramienta ya que con eso nos bastará para una primera toma de contacto.

Docker trata de aislar las aplicaciones y de generar un entorno replicable y estable para que funcionen haciendo uso de los contenedores.

A diferencia de una máquina virtual, los contenedores no necesitan un sistema operativo completo sino que reutilizan el subyacente y esto reduce mucho la carga que debe soportar la máquina física, el espacio de almacenamiento usado y el tiempo necesarios para lanzar las aplicaciones.

Docker aprovecha mucho mejor el hardware que una máquina virtual. A una máquina virtual se le asigna previamente cuántos recursos físicos consumirá, los vaya a usar todos o no. Docker, en cambio, va en función de las necesidades de cada momento y asigna lo necesario para que los contenedores funcionen correctamente.

Por otra parte, Docker no puede utilizar en un sistema operativo «host» contenedores o aplicaciones que no sean para ese mismo sistema operativo. En otras palabras, no se puede ejecutar un contenedor con una aplicación para Linux en Windows, o al revés.

Ey! pero… si mis proyectos PHP están destinados a servidores Linux y hacen uso de software de Linux, ¿como voy a usar un entorno local con Docker sobre Windows?

Que no cunda el pánico. Docker para Windows, utiliza una máquina virtual Linux en segundo plano para poder ejecutar aplicaciones Linux. Los contenedores Windows se ejecutan de forma nativa en Windows.

¿Qué es LaraDock?

Laradock es un completo entorno de desarrollo PHP para Docker.

Incluye imágenes Docker preempaquetadas, todas preconfiguradas para proporcionar un fantástico entorno de desarrollo PHP.

Es muy conocido en la comunidad Laravel, ya que el proyecto comenzó con un enfoque único en la ejecución de proyectos Laravel en Docker. 

Posteriormente y debido a la gran adopción de la comunidad PHP, comenzó a apoyar otros proyectos de PHP como Symfony, CodeIgniter, WordPress, Drupal …

Desde la web oficial de laradock puedes consultar todos los servicios de los que dispones:

  • Bases de datos: MySQL – MariaDB – Percona – MongoDB – Neo4j – RethinkDB – MSSQL – PostgreSQL –
    Postgres-PostGIS .
  • Gestores de bases de datos:
    PhpMyAdmin – Adminer – PgAdmin
  • Motores de cache:
    Redis – Memcached – Aerospike
  • Servidores PHP:
    NGINX – Apache2 – Caddy
  • Compiladores PHP:
    PHP FPM – HHVM
  • Cola de mensajes:
    Beanstalkd – RabbitMQ – PHP Worker
  • Gestor de colas:
    Beanstalkd Console – RabbitMQ Console
  • Herramientas variadas:
     Mailu – HAProxy – Certbot – Blackfire – Selenium – Jenkins – ElasticSearch – Kibana – Grafana – Gitlab – Mailhog – MailDev – Minio – Varnish – Swoole – NetData – Portainer – Laravel Echo – Phalcon…
  • Workspace:
    PHP CLI – Composer – Git – Linuxbrew – Node – V8JS – Gulp – SQLite – xDebug – Envoy – Deployer – Vim – Yarn – SOAP – Drush – WP-CLI…

3. Instalar Docker en Windows 10

Ha llegado el momento! es hora de instalar Docker en nuestra máquina Windows 10!

Accede a la web oficial pinchando aquí, para comenzar la descarga será necesario que te registres si no dispones de una cuenta ya.

Una vez descargado procede a su instalación, cuando está finalice, te solicitará que cierres sesión en Windows. Posteriormente, te pedirá que habilites las funciones de Hyper-V y Contenedores, prosigue y tu máquina se reiniciará.

Tras el reinicio, ya tendrás Docker corriendo en tu máquina, solo te queda loguearte para poder hacer uso de él y listo! todo hecho por aquí!

4. Crear contenedores para proyecto PHP

Instalar LaraDock

Clona el repositorio de LaraDock y copia su fichero .env-example bajo el nombre .env. Desde este fichero podrás establecer una configuración personalizada para los contenedores y servicios a usar.

$ git clone https://github.com/Laradock/laradock.git
$ cd laradock
$ cp .env-example .env

Por ejemplo, si vas a hacer uso MySQL, desde aquí puedes establecer su configuración:

Te recomiendo que revises este fichero con calma y puedas ver así todos los parámetros configurables de los que dispones, así como su valor por defecto.

Arrancar contenedores

Vamos a arrancar los contenedores de los servicios más comunes que se suelen utilizar en cualquier proyecto PHP ( nginx, mysql y workspace). Para ello, nos ubicamos en el directorio laradock y ejecutamos el comando:

docker-compose up -d nginx mysql workspace 

Si es la primera vez que ejecutas este comando, el proceso demorará unos minutos, ya que los servicios indicados deben ser descargados. Cuando el proceso haya finalizado, ya tendremos arrancados los contenedores. Podemos ver los contenedores que hay corriendo utilizando el comando:

docker-compose ps

El contenedor workspace

Es una imagen de linux muy reducida únicamente con lo necesario para funcionar y un conjunto de herramientas útiles y preconfiguradas para funcionar e integrarse con casi cualquier combinación de contenedores.

Algunas de las herramientas que incluye son:
PHP CLI – Composer – Git – Linuxbrew – Node – V8JS – Gulp – SQLite – xDebug – Envoy – Deployer – Vim – Yarn, …

Puedes seleccionar qué herramientas instalar en tu workspace y otros contenedores desde el fichero .env

Para acceder a la terminal del workspace vamos a ejecutar el programa bash del servicio workspace:

docker-compose exec workspace bash

Ahora en el propt debería verse como una terminal linux y ubicado en el directorio /var/www En este directorio es donde debemos ubicar nuestro proyecto PHP. Por defecto será el directorio de nivel superior al de laradock. Ahí será donde alojemos nuestro proyecto PHP (aunque esto ya puede ir al gusto de cada uno, ya que la ruta es editable desde el .env)

Ahora ya tienes configurado y listo para usar un completo entorno de trabajo local para empezar tu proyecto PHP!

Hello Docker

El servicio Nginx lleva una configuración establecida por defecto (nginx/sites/default.conf) en la que se establece el directorio /var/www/public para el host localhost.

Para comprobar que el entorno está ya funcionando correctamente, vamos a crear un fichero index.php con el siguiente contenido:

<?php
echo "Hola Docker";

Y lo ubicamos en el directorio /var/www/public, que en nuestra máquina windows se corresponde con el configurado en la variable «APP_CODE_PATH_HOST» del fichero .env. Si no lo hemos modificado, por defecto viene como «../«, lo que quiere decir, un nivel superior a donde esta ubicado tu directorio laradock ahora mismo.

Ahora accede desde el navegador a la dirección localhost, como puedes ver, se muestra el mensaje «Hola Docker», lo que quiere decir que el servidor nginx está corriendo y funcionando correctamente.

También puedes aprovechar para ver toda la configuración del servidor php llamando a phpinfo();

Hello DataBase

Si has levantado el servicio de mysql (puedes revisarlo mediante el comando: docker-compose ps, en caso de no estarlo, ejecuta: docker-compose up -d mysql para levantar el servicio), puedes probar a acceder a la base de datos. Abre tu cliente de base de dato preferido y conectate con las credenciales establecidas en el fichero .env para verificar que dicho servicio está ejecutándose y funcionando.

5. Estructura del proyecto PHP

Aunque todos los proyectos sean PHP, cada uno es un mundo y cada uno puede utilizar diferentes servicios o diferentes versiones de los mismos.

Cuando estos servicios son configurados para un proyecto concreto haciendo uso de los contenedores, lo recomendado es adjuntar dicha configuración al propio proyecto. De forma que cuando se clone el proyecto desde su repositorio se disponga de toda la configuración necesaria para arrancar los servicios adecuados de forma casi instantánea.

Toda la configuración correspondiente a los contenedores y sus servicios se realiza modificando los ficheros incluidos en el directorio laradock. Por lo tanto, lo que vamos a hacer es incluir este directorio como un submódulo de git de nuestro proyecto.

Crea un nuevo repositorio remoto en el que ubicar el directorio laradock para mantener en el todas las configuraciones que realices en los servicios para tu proyecto.

git remote rename origin old-origin
git remote add origin "url de nuestro repositorio remoto"
git push -u origin --all
git push -u origin --tags

Ahora puedes editar los ficheros de configuración de servicios como los .conf de Nginx, etc y commitear los cambios. Ahora cualquier cambio de configuración de los servicios quedará reflejado junto al proyecto.

*Si modificas los ficheros docker-compose.yml, .env o dockerfile, debes reconstruir los contenedores para que los cambios sean aplicados. Puedes hacerlo con el siguiente comando:

docker-compose build workspace nginx mysql

6. Comandos más importantes de Docker

Algunos de los comandos básicos y más utilizados de Docker son:

  • docker-compose up -d <CONTAINER_1>
    <CONTAINER_N>
    : levantar servicios (nginx, mysql workspace, etc)
  • docker-compose down: apagar servicios
  • docker images: para ver la lista de imágenes descargadas.
  • docker ps: para ver la lista de contenedores en ejecución.
  • docker ps -a: para ver la lista de todos los contenedores ejecutados.
  • docker rm: para borrar contenedores en nuestro equipo.
  • docker rmi: para borrar imágenes en nuestro equipo.
  • docker search: para buscar imágenes en el Docker Hub.
  • docker pull: para descargar imágenes desde Docker Hub.
  • docker logs -f <CONTAINER>: para ver logs de un servicio
  • docker-compose exec <CONTAINER> bash: para entrar al promt de un servicio.

Conclusión

Gracias a Docker se pueden tener entornos de desarrollo replicables entre todos los miembros de un equipo y asegurar que las aplicaciones se van a ejecutar igual en todos las máquinas.

¿Mi opinión? Si eres una persona que trabaja de forma individual haciendo proyectos muy similares siempre y con la misma arquitectura, seguramente te sea más ágil hacer uso de un entorno local como Laragon, Wamp, Mamp, o incluso una máquina virtual.

Si en cambio trabajas con proyectos donde cada uno es diferente o trabajas en equipo junto a más personas, entonces te recomiendo hacer uso de Docker sin lugar a dudas. Aunque al principio cueste un pequeño esfuerzo adicional, después todo serán ventajas para ti y tu equipo.

Esto no acaba aquí! Aprende cómo activar el servicio Xdebug en Docker para que puedas depurar tu proyecto PHP

Comparte el post