Yii Framework es uno de los Framework PHP más utilizados en la actualidad. Su facilidad de manejo, rapidez y sus muchas extensiones lo convierten en una opción muy seria a tener en cuenta a la hora de desarrollar en PHP.
Para facilitar aún más el desarrollo con Yii podemos utilizar un entorno creado con Docker compose. Usando Docker compose reducimos el tiempo necesario para empezar a trabajar en un proyecto, estandarizamos nuestros entorno de desarrollo e incluso podemos ampliarlo de forma muy sencilla para añadir características como Codeception.
Requisitos
Para poder levantar nuestro entorno vamos a necesitar:
- php-cli instalado en nuestro ordenador, con las extensiones php-dom y php-mbstring
- composer
- Docker
- Docker compose
Creando la aplicación Yii
En primer lugar, vamos a crear una aplicación de Yii en nuestra máquina local, con los comandos:
composer global require "fxp/composer-asset-plugin:^1.4.1"
composer create-project --prefer-dist yiisoft/yii2-app-basic basic
Una vez instalada la aplicación, dentro del directorio encontraremos el archivo docker-compose.yml, que define la estructura que queremos crear, y que por defecto contiene:
version: '2'
services:
php:
image: yiisoftware/yii2-php:7.1-apache
volumes:
- ~/.composer-docker/cache:/root/.composer/cache:delegated
- ./:/app:delegated
ports:
- '8000:80'
En ésta configuración base hay varias cosas que no me acaban de convencer:
- Se abre el puerto 8000 en lugar del puerto 80, que lo veo más cómodo
- No se crea contenedor con base de datos
- No se crea contenedor con caché como memcached
Así que en mi caso, lo primero que hago es poner una configuración adaptada, como la que os muestro aquí:
version: '2'
services:
php:
image: yiisoftware/yii2-php:7.3-apache
volumes:
- ~/.composer-docker/cache:/root/.composer/cache:delegated
- ./:/app:delegated
ports:
- '80:80'
networks:
- my-network
db:
image: mysql:5.7
restart: always
environment:
- MYSQL_DATABASE=yii_db
- MYSQL_USER=yii_db
- MYSQL_PASSWORD=user_password
- MYSQL_ROOT_PASSWORD=root_password
ports:
- '3306:3306'
expose:
- '3306'
volumes:
- my-db:/var/lib/mysql
#volumes:
# - ~/mysql:/var/lib/mysql
networks:
- my-network
memcached:
container_name: memcached
image: memcached:latest
ports:
- "0.0.0.0:11211:11211"
volumes:
my-db:
networks:
my-network:
driver: bridge
Esta configuración añade dos contenedores más, con las siguientes características:
- PHP 7.3 (para proyectos nuevos siempre empiezo con la última versión estable)
- Acceso al proyecto por el puerto 80
- MySQL versión 5.7
- Memcached para caché de datos.
- Un volumen de datos persistente para la base de datos.
- Se configura automaticamente la base de datos con usuario y contraseña, para el acceso directo desde la aplicación.
Así, con cada nuevo proyecto, solo tengo que copiar ese archivo, personalizar la configuración, y ya dispongo de un entorno de trabajo similar al que voy a usar en producción.
Una vez que hemos copiado la nueva configuración, solo necesitamos 4 comandos para trabajar, que ejecutaremos dentro del directorio de la aplicación:
docker-compose up # Levantamos el entorno
docker ps --all # Vemos los contenedores levantados, y sus nombres
docker exec -it $NOMBRE_DE_CONTENEDOR bash # entramos en ese contenedor
Es importante tener en cuenta que, para poder ejecutar con seguridad comandos como ./yii para comandos de consola, es necesario entrar en el contenedor de PHP, y para conectar con la base de datos debemos hacerlo o con cliente en el puerto 3306, o conectando directamente con el contenedor de base de datos.
Con esto, usando un único archivo de configuración que además es muy sencillo de gestionar, podemos levantar un entorno para desarrollo en menos de 10 minutos.