Macklus.Net

Desarrollo con Yii2 y docker-compose

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:

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:

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:

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.