Magento 2 Programación

Entorno de desarrollo Magento 2 con Docker en menos de 10 minutos

single image

Configura tu entorno de desarrollo de Magento 2 con Docker en menos de 10 minutos.

05/05/2022: Nueva versión publicada  (1.1.4).  Releases notes (incluye soporte para Magento 2.4.4)

Con esta publicación estreno sección Magento 2 dentro de la categoría Programación, y, voy a explicarte cómo configurar un entorno de desarrollo para Magento 2 con docker sin gran esfuerzo.

Desde que comencé a trabajar en Arcmedia programo a diario en Magento 2, pero ya con anterioridad había realizado implantaciones y desarrollos a medida en Magento 1 y 2.  Quizás una de las partes más tediosas siempre era crear el entorno de desarrollo local: montar el servidor web, bbdd, instalar y configurar magento,…

Por eso, para simplificar este proceso,  haces unos meses preparé un entorno de desarrollo Magento 2 dockerizado que despliega magento 2 en local en solo unos minutos.

Esta miniguía te ayudará a configurar tu entorno Magento 2 corriendo en tu máquina con un entorno totalmente personalizable durante la instalación según tus necesidades:

  • Versión de Magento configurable: 2.3.0 a 2.4.X (testeado hasta la 2.4.4)
  • Servidor de bases de datos configurable: MariaDB o MySQL
  • Versión de PHP configurable: 7.2 a 8.1
  • Elasticsearch
  • RabbitMQ
  • Nginx
  • Mailhog (herramienta para capturar los emails enviados por Magento)

Requisitos y preparación del entorno

Para poder utilizar este entorno de desarrollo de Magento 2 vamos a necesitar solo tres cosas:

  1. Docker instalado y ejecutándose en tu equipo
  2. Lo mismo con git (no es obligatorio pero es más que recomendable)
  3. Unas API Key de Magento para poder realizar la instalación

En el caso poco probable de que no tengas instalado docker o git, el proceso de instalación es muy sencillo, pero puede variar en función de tu sistema operativo. Te recomiendo que visites la página web de Docker, la página web de git y sigas sus indicaciones.

Para conseguir las API Key de Magento, tienes que crearte una cuenta en el Marketplace de Magento,  y generarlas desde tu perfil en la sección Access Keys:

Magento 2 API Keys

Instalación del entorno de desarrollo en Magento 2

Ahora sí, ¡comenzamos con la instalación del entorno!

En primer lugar, abrimos un terminal, vamos a la carpeta donde queremos guardar nuestro entorno, y clonamos el repositorio de github que contiene magento dockerizado con el comando:

$ git clone https://github.com/pablobae/dockerized-magento2-devel-environment.git

Si no tienes git instalado puedes descargárlo desde la web del entorno en github y descomprimirlo

Ahora nos metemos dentro de la carpeta del proyecto clonado

$ cd dockerized-magento2-devel-environment

Entre otros archivos, encontraremos el script de instalación create-project.sh. Este script permite pasarle tres parámetros:

  • –project, nombre del proyecto.Nos permite tener varios entornos magento2 en docker,  útil si trabajas en varios proyectos distintos
  • –domain, dominio o url local para acceder a la web local de magento
  • –version, release de Magento 2 que deseas instalar.  Las releases disponibles las puedes encontrar en el repo oficial de Magento

El entorno de desarrollo no soporta todavía releases Magento 2.4.x. Espero tenerlo disponible pronto, integrando Elasticsearch.

Este script se encargará de

  • desplegar los contenedores según tu elección,
  • instalar la versión indicada de Magento y
  • configurar tu sistema operativo para poder acceder vía web a tu instancia local de Magento.

Es posible configurar la instalación de magento editando el archivo ./conf/setup_magento_config

ADMIN_FIRST_NAME=MyName
ADMIN_LAST_NAME=LastName
ADMIN_EMAIL=admin@admin.com
ADMIN_USER=admin
ADMIN_PASSWORD=password1234
ADMIN_URL=admin
CURRENCY=EUR
LANGUAGE=en_US

Ejecutamos:

$ bash create-project.sh --project=magento2 --domain=magento2.local --version=2.3.6-p1

A continuación comenzará el proceso de instalación del entorno, y el script nos va a ir preguntado información sobre los distintos servicios que queremos instalar, y las sus versiones. Puedes configurarlo como desees, siempre teniendo en cuenta los requerimientos de Magento.

docker-configuration

Durante este proceso también nos va a solicitar introducir las credenciales de administrador de tu equipo para añadir el dominio elegido en tu archivo /etc/hosts. De esta forma, podremos acceder a Magento a través de la url https://magento2.local una vez finalizada la instalación.

Windows WSL: si estás usando WSL en windows, no es posible editar el archivo hosts de Windows desde WSL, y lo haremos manualmente después de finalizar la instalación del entorno

Después comenzará la descarga de las distintas imágenes de los servidores utilizados, y una vez completadas, se levantará el entorno y veremos algo así en la pantalla:

entorno-desarrollo-magento-2-con-docker-step-3

A continuación se realiza la instalación de Magento, y es ahora cuando el instalador nos va a solicitar que introduzcamos las API Key de Magento:

magento-2-enter-api-keys

Introducimos nuestra public key como username, y nuestra private key como password.

En este momento comienza la instalación de todos los paquetes de Magento, y la generación de los certificados SSL para la web. Tras finalizar nos muestra la información de acceso a Magento:

entorno-desarrollo-magento2-docker-success

Y ya podremos acceder a nuestro recién instalado magento en la url indicada:

entorno-desarrollo-magento2-docker-success-web

Windows WSL: si estás usando WSL, justo antes de finalizar el script de instalación nos indicará que debemos realizar varios pasos manualmente

entorno-desarrollo-magento-2-con-docker-windows-wsl-steps

En este caso tendremos que seguir los pasos indicados, para poder acceder a nuestro Magento recién instalado.

Primero, editamos el archivo C:\Windows\System32\drivers\etc\hosts en Windows y agregamos al final del archivo nuestro nuevo host: 127.0.0.1 magento2.local.

Por último tenemos que importar  el certificado CA en windows para que cuando accedamos a la web local de magento los navegadores no nos indiquen que la web no es segura:

  • abrimos un terminal de PowerShell como administrador,
  • ejecutamos el comando mmc.exe,
  • vamos Certificados > Entidades de certificación raiz de confianza, e
  • importamos el certificado rootCA.pem que se ha generado durante la instalación del entorno y está en la carpeta del mismo.

Detalles del entorno de desarrollo en Magento 2

Código fuente y volumenes docker

Una vez instalado, tendemos todo el código de nuestro magento en la carpeta src:

$ ls -l src
-rw-r--r--  1 aradaen aradaen 775488 Mar 19 12:30 CHANGELOG.md
-rw-r--r--  1 aradaen aradaen    650 Mar 19 12:30 COPYING.txt
-rw-r--r--  1 aradaen aradaen   2994 Mar 19 12:30 Gruntfile.js.sample
-rw-r--r--  1 aradaen aradaen  10364 Mar 19 12:30 LICENSE.txt
-rw-r--r--  1 aradaen aradaen  10376 Mar 19 12:30 LICENSE_AFL.txt
-rw-r--r--  1 aradaen aradaen    700 Mar 19 12:30 SECURITY.md
drwxr-xr-x  4 aradaen aradaen   4096 Mar 19 12:30 app
-rw-r--r--  1 aradaen aradaen    150 Mar 19 12:30 auth.json.sample
drwxr-xr-x  2 aradaen aradaen   4096 Mar 19 12:30 bin
-rw-r--r--  1 aradaen aradaen   2635 Dec 18 22:26 composer.json
-rw-r--r--  1 aradaen aradaen 794852 Mar 19 12:30 composer.lock
drwxr-xr-x  5 aradaen aradaen   4096 Mar 19 12:30 dev
drwxr-xr-x  3 aradaen aradaen   4096 Mar 19 12:31 generated
-rw-r--r--  1 aradaen aradaen     57 Mar 19 12:30 grunt-config.json.sample
-rw-r--r--  1 aradaen aradaen   1370 Mar 19 12:30 index.php
drwxr-xr-x  4 aradaen aradaen   4096 Mar 19 12:30 lib
-rw-r--r--  1 aradaen aradaen   5814 Mar 19 12:30 nginx.conf.sample
-rw-r--r--  1 aradaen aradaen   1416 Mar 19 12:30 package.json.sample
drwxr-xr-x  2 aradaen aradaen   4096 Mar 19 12:30 phpserver
drwxr-xr-x  6 aradaen aradaen   4096 Mar 19 12:30 pub
drwxr-xr-x  7 aradaen aradaen   4096 Mar 19 12:30 setup
drwxr-xr-x  9 aradaen aradaen   4096 Mar 19 12:31 var
drwxr-xr-x 83 aradaen aradaen   4096 Mar 19 12:30 vendor

Estas carpetas se encuentran también en el contenedor de docker, pero para optimizar el rendimiento de docker en Mac y Windows WSL, solo algunas carpetas y archivos se encuentran montados y sincronizados con el contenedor:

  • app
  • vendor
  • composer.json
  • composer.lock

Cualquier cambio en alguno de estos archivos se reflejará en el contenedor (y al contrario, si cambia en el contenedor, cambiará para nosotros)

Es posible configurar qué archivos y carpetas se montan en docker editando el archivo docker-compose.yml y reiniciando el entorno.

Comandos útiles

En la carpeta bin del entorno se encuentran varios comandos que facilitan la interacción con el entorno entre los que destacan:

  • bin/start, levanta el entorno docker del proyecto
  • bin/restart, reinicia el entorno
  • bin/stop, detiene el entorno
  • bin/bash, abre un terminal dentro del contenedor en el documentroot de Magento
  • bin/magento, permite ejecutar comandos magento dentro del contenedor
  • bin/xdebug, permite habilitar y deshabilitar el modo debug de php

Puedes encontrar más información de los comandos disponibles en la página del repositorio.

Instalación Magento 2 sample data

Desde la versión 1.1.3 durante el proceso de creación del proyecto se nos pregunta si deseamos o no instalar automáticamente Magento Sample Data.

Llegados a este punto ya tenemos nuestro entorno de desarrollo Magento 2 con docker configurado y listo para programar.

Opcionalmente, es posible instalar el paquete de datos de ejemplo de Magento 2, que incluye productos, clientes, etc. Vamos a ello. Ejecutamos el comando:

$ bin/magento sampledata:deploy

De nuevo Magento va a solicitarnos las credenciales API Key de Magento. Las introducimos y proseguimos.

A continuación actualizamos la base de datos

$ bin/magento setup:upgrade

Al finalizar este comando ya dispondremos los datos demo de Magento en nuestra instancia.

entorno-desarrollo-magento-2-con-docker-sample-data

Y hasta aquí la miniguía!

¡Saludos!

Si tienes alguna duda, deja un comentario o únete a mi canal de SLACK a través de este enlace.

29 Comentarios
  1. Manuel Castillo 2 años ago
    Contestar

    Hola. Es posible usarlo desde un mac, pero corriendo docker desde otra máquina, por ejemplo una raspberry pi 4 con un disco ssd?

    • Pablo Baenas 2 años ago
      Contestar

      Hola Manuel, no se hasta qué punto daría de si una raspberry pi para tener docker corriendo con Magento, pero en cualquier caso si montaras el entorno en otro equipo, y abrieras los puertos necesarios en la rbpi para dar acceso al servidor web, y modificaras en el mac el host para hacerle saber que el dominio web que utilices en el proyecto de docker está en la rbpi, creo que no habría problema en acceder a tu instancia de Magento de rbpi desde el Mac.

  2. Manuel Castillo 1 año ago
    Contestar

    Pablo… tienes una version actualizada para Magento 2.4.X Es que ahi se requiere usar elastic search obligadamente, entonces hay que agregarlo. Ademas cambia la version de PHP y de MySql

    • Pablo Baenas 1 año ago
      Contestar

      Hola Manuel, disculpa la demora en contestarte. Pues lo tengo en mente, pero no he tenido tiempo de ponerme manos a la obra. A ver si las próximas semanas le puedo dedicar un tiempo.

    • Pablo Baenas 1 año ago
      Contestar

      Hola Manuel, acabo de publicar una nueva release del proyecto que incluye entre otras cosas soporte para Magento 2.4, elección de versiones, elasticsearch opcional,…
      Cualquier cosa me dices. Espero en breve actualizar esta entrada con los cambios.

  3. Freddy Cruz 1 año ago
    Contestar

    Hola, tienes pensado sacar la versión para Magento 2.4.x?

    • Pablo Baenas 1 año ago
      Contestar

      Hola Freddy, lo tengo en mente, pero no encuentro el momento de ponerme manos a la obra 🙁

    • Pablo Baenas 1 año ago
      Contestar

      Hola Freddy, pues ya está publicada la nueva release en github que tiene soporte hasta la última versión de magento 2.4.3, además incluye otras mejoras.
      En breve actualizaré este post, aunque básicamente ahora cuando creas un proyecto, te pregunta también por las versiones que quieres utilizar de php, elasticsearch, mysql, … etc..

  4. David 1 año ago
    Contestar

    Muy buen articulo, estoy trabajando con docker y magento 2 en linux ubuntu 20.04. Tengo varios proyectos de magento 2 ya creados pero me esta costando mucho levantar un entorno de desarrollo (Estoy usando un entorno dockerizado para M2 creado por Mark Shust) y poder correr con facilidad mis proyectos. Cuales serian los pasos a seguir para usar tu entorno con un proyecto de M2 ya creado? Muchas gracias, espero tu respuesta

    • Pablo Baenas 1 año ago
      Contestar

      Hola David, pues dependerá un poco del tipo de proyecto, pero básicamente lo que haría sería lo siguiente: clonarme el repo de mi proyecto, y configurar una instalación limpia de magento con la misma versión de magento, php, mysql, elasticsearch (si lo estás usando) que tienes actualmente. A continuación copiaría tu código en la carpeta src y después utilizar el comando bin/sync para traerme la bbdd y la carpeta media. Para que funcione tienes que crear el archivo syncservers.conf a partir de este https://github.com/pablobae/dockerized-magento2-devel-environment/blob/master/conf/syncservers.conf.dist.

  5. Josu 9 meses ago
    Contestar

    Hola,

    Como podría crear diferentes proyectos al mismo tiempo. El comando de composer me da el error:
    [InvalidArgumentException]
    Project directory “/var/www/html/.” is not empty.

    Gracias

  6. Ma 9 meses ago
    Contestar

    Hola Pablo

    Excelente tutorial me ha funcionado bastante para montar mi Magento de pruebas y comenzar a conocerlo, solo me encuentro algo atascado en el último paso de importar el certificado rootCA.pem, no logro encontrarlo ni encontrar la ruta del proyecto por ningún lado y seguí paso a paso el tutorial.

    Soy muy principiante en esto y espero puedas orientarme un poco

    Saludos

    • Pablo Baenas 9 meses ago
      Contestar

      Hola Ma,

      Claro, en principio el archivo en cuestión se genera en la misma carpeta en la que te encuentras (la carpeta desde la que ejecuta las instalación del entorno).

  7. Alejandro 8 meses ago
    Contestar

    Hola que tal, estuve intentando instalar en MacOs pero en el punto donde clona el repo de magento me arroja este error:

    Creating composer magento 2 project…

    [UnexpectedValueException]
    Your github oauth token for github.com contains invalid characters: “”

    Loading Magento and environment configuration…
    mkdir: src: File exists
    Generating auth.json file with Magento credentials:
    File auth.json already exists.
    Do you want generate it again and override the existing files? [Yes/No]n
    Installing Magento…
    Your github oauth token for github.com contains invalid characters: “”#0 /var/www/html/vendor/composer/composer/src/Composer/Factory.php(325): Composer\IO\BaseIO->loadConfiguration(Object(Composer\Config))
    #1 /var/www/html/vendor/composer/composer/src/Composer/Factory.php(576): Composer\Factory->createComposer(Object(Composer\IO\BufferIO), Array, false)
    #2 /var/www/html/vendor/magento/framework/Composer/ComposerFactory.php(47): Composer\Factory::create(Object(Composer\IO\BufferIO), ‘/var/www/html/c…’)
    #3 /var/www/html/vendor/magento/framework/Composer/ComposerInformation.php(362): Magento\Framework\Composer\ComposerFactory->create()
    #4 /var/www/html/vendor/magento/framework/Composer/ComposerInformation.php(375): Magento\Framework\Composer\ComposerInformation->getComposer()
    #5 /var/www/html/vendor/magento/framework/Composer/ComposerInformation.php(242): Magento\Framework\Composer\ComposerInformation->getLocker()
    #6 /var/www/html/vendor/magento/framework/App/ProductMetadata.php(104): Magento\Framework\Composer\ComposerInformation->getSystemPackages()
    #7 /var/www/html/vendor/magento/framework/App/ProductMetadata.php(65): Magento\Framework\App\ProductMetadata->getSystemPackageVersion()
    #8 /var/www/html/vendor/magento/framework/Console/Cli.php(89): Magento\Framework\App\ProductMetadata->getVersion()
    #9 /var/www/html/bin/magento(22): Magento\Framework\Console\Cli->__construct(‘Magento CLI’)
    #10 {main}

    por mas que reemplazo el auth.json me genera el mismo y no puedo continuar con la instalación.

    • Pablo Baenas 8 meses ago
      Contestar

      Hola Alberto, comprobando la imagen, parece que has ejecutado el script de instalación varias veces, ¿puede ser? Si es así, intenta hacerlo en una carpeta limpia. Si te sigue sucediendo, podemos intentar resolverlo juntos. Saludos

  8. Enrique 8 meses ago
    Contestar

    Perdona Pablo, pero al ejecutar el script en windows10 con wsl2 me da los siguientes errores que no consigo solucionar:

    create-project.sh: line 2: $’\r’: command not found
    create-project.sh: line 7: $’\r’: command not found
    create-project.sh: line 8: $’\r’: command not found
    create-project.sh: line 10: syntax error near unexpected token `$’do\r”
    ‘reate-project.sh: line 10: `do

    Muchas gracias

    Muchas gracias.

    • Pablo Baenas 8 meses ago
      Contestar

      Hola Enrique,
      parece que se ha cambiado el carácter final de linea.
      Sigue los pasos que te indico a continuación.

      Dentro de WSL:

      sudo apt-get install dos2unix

      Y después,

      dos2unix create-project.sh

      Con esto el formato del archivo se habrá cambiado de nuevo a formato unix y ya debería de funcionarte.

      • Enrique 8 meses ago
        Contestar

        Claro, que mendrugo. Había abierto el archivo con el notepad para ojearlo y lo había desgraciado. ¡Muchas gracias!

  9. Alejandro Muñoz 7 meses ago
    Contestar

    Hola muy buen día.

    He realizado todo el proceso como se menciona, pero al momento que magento termina su instalacion y comienza a instalarse genera un nuevo auth.json y al momento de hacerel install de magento da un error, posteriormente ya no es posible instalarlo. Revisando el auth.json le agrega unas lineas de un repositorio de github y por lo cual esto genera un error en el install.

    Habrá manera de solucionar este paso? estoy intentando en MacOs.

    • Pablo Baenas 7 meses ago
      Contestar

      Hola Alejandro,
      ¿Qué error te devuelve?
      Puedes indicarme también los pasos y configuraciones que has intentado instalar para replicarlo?

      Saludos!

      • Alejandro Muñoz 7 meses ago
        Contestar

        Pasos:

        1- Clono el repo en la carpeta FDA
        2- Ingreso a la carpeta y ejecuto el script asi: sudo bash create-project.sh –project=magento2 –domain=fahorro-dev.com –version=2.3.1
        3- Versiones de dependencias: composer1, mysql 5.7, php 7.2.
        4- ingreso PK y SK de magento generadas desde Adobe.
        5- Descarga todo el paquete de magento.
        6- al finalizar la descarga vuelve a pedir la PK y la SK de magento, despues de este proceso intenta instalar y da el error:

        Creating composer magento 2 project…

        [UnexpectedValueException]
        Your github oauth token for github.com contains invalid characters: “”

        No se si las segundas credenciales que solicita son de mi repo de github.

      • Alejandro Muñoz 7 meses ago
        Contestar

        Writing lock file
        Generating autoload files
        52 packages you are using are looking for funding.
        Use the `composer fund` command to find out more!
        Loading Magento and environment configuration…
        mkdir: src: File exists
        Generating auth.json file with Magento credentials:
        Copying from container…
        Completed copying auth.json.sample from container to host
        Please, enter your Magento public key: f81d3064da4134577f136886db769fff
        Enter your magento private key: 7c95e1bce127409adefe2b977d76d170
        Copying to container: auth.json
        Completed copying auth.json from host to container
        Correcting filesystem ownerships…
        Filesystem ownerships corrected.
        Correcting filesystem permissions…
        Filesystem permissions corrected.
        File generated
        Installing Magento…
        Your github oauth token for github.com contains invalid characters: “”#0 /var/www/html/vendor/composer/composer/src/Composer/Factory.php(325): Composer\IO\BaseIO->loadConfiguration(Object(Composer\Config))
        #1 /var/www/html/vendor/composer/composer/src/Composer/Factory.php(576): Composer\Factory->createComposer(Object(Composer\IO\BufferIO), Array, false)

        Este es el error completo

  10. Josu 3 meses ago
    Contestar

    Hola,

    He instalado correctamente pero al acceder a la web me da error 403 de ngix.

    A que se puede deber?

    • Pablo Baenas 3 meses ago
      Contestar

      Hola Jose, ¿puedes indicarme los parámetros de instalación introducidos, y también tu tipo de entorno (Mac, Linux, WSL)?

  11. Ainoa 3 meses ago
    Contestar

    Hola Pablo,

    Has planteado alguna vez como hacer el proceso de upgrade entre versiones de magento cuando estas necesiten un cambio de versión de PHP?

    Gracias

    • Pablo Baenas 3 meses ago
      Contestar

      Hola Ainoa, en tal caso lo que haría sería crearme un entorno nuevo acorde a la versión a la que quieres actualizar, e importaría la bbdd del entorno actual, al entorno nuevo, y lo mismo con los archivos del proyecto.

Escribir comentario

Tu email no será publicado.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Otras noticias de interés