Blog


Usar Docker en un proyecto Symfony

USAR DOCKER EN UN PROYECTO SYMFONY

27 / 02 / 2023 Symfony

Docker es una plataforma de contenedores que permite a los desarrolladores empaquetar y ejecutar aplicaciones en cualquier entorno. Esto significa que puedes desarrollar y probar tu aplicación en un entorno aislado en tu propio equipo, y luego desplegarla en producción sin preocuparte por la configuración del sistema o las dependencias. En este artículo, vamos a ver cómo utilizar Docker en un proyecto Symfony con PHP 8.1 y MySQL. 

Instalar Docker

Antes de comenzar, es necesario tener Docker instalado en tu máquina. Puedes descargar Docker Desktop para Windows o Mac desde la página oficial de Docker. En caso de que uses Linux, busca las instrucciones específicas para tu distribución.

 Una vez que lo tengas instalado, abre la terminal y ejecuta el siguiente comando para asegurarte de que Docker está funcionando correctamente:

$ docker run hola-mundo

Crear un nuevo proyecto Symfony

$ symfony new --webapp my_project

Configurar Docker

Crea un archivo Dockerfile en la raíz del proyecto con el siguiente contenido:

# Utilizamos una imagen oficial de PHP 8.1 como imagen base
FROM php:8.1-apache

# Instalamos los paquetes necesarios
RUN apt-get update && apt-get install -y \
    git \ 
    curl \
    vim \
    unzip \
    && rm -rf /var/lib/apt/lists/*

# Configuramos los módulos de PHP
RUN docker-php-ext-install pdo pdo_mysql

# Habilita mod_rewrite
RUN a2enmod rewrite

# Establecemos la raíz web de Apache en el directorio público del proyecto
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
ENV APACHE_DOCUMENT_ROOT /var/www/html/public

# Copiamos nuestra aplicación a la carpeta de trabajo del contenedor
COPY . /var/www/html/

# Establecemos la carpeta de trabajo
WORKDIR /var/www/html/

# Ejecutamos los comandos necesarios para instalar las dependencias de PHP y ejecutar nuestro proyecto
RUN curl -sS https://getcomposer.org/installer | php \
    && php composer.phar install \
    && chown -R www-data:www-data /var/www/html \
    && chmod -R 777 /var/www/html/var

# Exponemos el puerto 80 para el tráfico HTTP
EXPOSE 80

# Iniciamos el servidor Apache en primer plano
CMD ["apache2-foreground"]

Este archivo Dockerfile utiliza una imagen oficial de Docker que contiene PHP 8.1 junto con Apache y añade los módulos necesarios para ejecutar Symfony, además de instalar las dependencias del proyecto con Composer.

Crear un archivo docker-compose.yml

Crea un archivo docker-compose.yml en la raíz del proyecto con el siguiente contenido:

version: '3'

services:
  # Define el servicio web
  web:
    build: .
    ports:
      - "8080:80"
    depends_on:
      - db

  # Define el servicio de la base de datos
  db:
    image: mysql:8
    environment:
      MYSQL_DATABASE: symfony
      MYSQL_USER: symfony
      MYSQL_PASSWORD: secret
      MYSQL_ROOT_PASSWORD: root
    ports:
      - "3306:3306"

Este archivo contiene la configuración básica necesaria para ejecutar tu proyecto en un contenedor Docker. En él definimos dos servicios:

  • web: servicio que ejecuta Apache y PHP y expone el puerto 8080. El contenedor se construye a partir de la imagen definida en el Dockerfile en el directorio actual (.) y se monta un volumen para compartir el código fuente entre el contenedor y el host. Este servicio depende del servicio db para funcionar correctamente.
  • db: servicio que ejecuta MySQL y expone el puerto 3306. Se utiliza la imagen oficial de MySQL y se definen las variables de entorno necesarias para configurar la base de datos. También se monta un volumen para persistir los datos de la base de datos en el host.

Ejecutar Docker

Para ejecutar Docker, abre una terminal en la raíz del proyecto y ejecuta el siguiente comando:

$ docker-compose up

Este comando construirá la imagen de Docker y ejecutará los contenedores necesarios. Si todo va bien, podrás ver la salida del servidor de desarrollo de Symfony en la consola.

Comprobar tu proyecto

Abre tu navegador y navega a http://localhost:8080. Si todo ha ido bien, deberías ver la página principal de tu proyecto Symfony.

¡Eso es todo! Ahora tienes un entorno de desarrollo de Symfony totalmente funcional en Docker.

Ejecutar comandos Symfony

Para ejecutar comandos Symfony, como bin/console, desde dentro del contenedor Docker, necesitamos ejecutarlos dentro del contenedor. Para hacerlo, ejecuta el siguiente comando:

$ docker-compose exec web php bin/console <comando>

Por ejemplo, para ejecutar el comando cache:clear, ejecuta el siguiente comando:

$ docker-compose exec web php bin/console cache:clear

Depurar problemas

Si encuentras problemas al ejecutar tu proyecto en Docker, hay algunas cosas que puedes hacer para depurarlos. Primero, revisa la salida del comando docker-compose up para ver si hay algún error o advertencia. Si ves algún error, trata de solucionarlo.

Si el problema persiste, puedes ejecutar un contenedor interactivo para inspeccionar el contenedor. Para hacerlo, ejecuta el siguiente comando:

$ docker-compose run --rm --entrypoint /bin/bash web

Esto abrirá una sesión interactiva dentro del contenedor. Desde aquí, puedes ejecutar comandos para inspeccionar el sistema y solucionar problemas.

Comandos útiles

Para terminar, dejamos algunos comandos útiles para trabajar con Docker en un proyecto Symfony:

  • docker run: Este comando es utilizado para crear y ejecutar un contenedor.
  • docker ps: Muestra la lista de contenedores en ejecución.
  • docker images: Muestra la lista de imágenes disponibles localmente.
  • docker pull: Descarga una imagen desde un registro de Docker.
  • docker push: Sube una imagen a un registro de Docker.
  • docker inspect: Devuelve información detallada sobre un contenedor o imagen.
  • docker logs: Muestra los registros de un contenedor en ejecución.
  • docker stop: Detiene un contenedor en ejecución.
  • docker rm: Elimina uno o varios contenedores.
  • docker rmi: Elimina una o varias imágenes.
  • docker network: Gestiona las redes de Docker, permitiendo crear, inspectar y eliminar redes.
  • docker-compose up: Este comando levanta y configura los servicios definidos en un archivo docker-compose.yml.
  • docker-compose down: Detiene y elimina los servicios y las redes definidos en un archivo docker-compose.yml.
  • docker-compose ps: Muestra el estado de los contenedores especificados en el archivo docker-compose.yml.
  • docker-compose exec [servicio] [comando]: Ejecuta un comando en un servicio específico. Por ejemplo, docker-compose exec app php bin/console doctrine:schema:update --force.
  • docker-compose logs [servicio]: Muestra los registros de un servicio específico. Por ejemplo, docker-compose logs app.

 



ARTÍCULOS RELACIONADOS