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:
- Docker instalado y ejecutándose en tu equipo
- Lo mismo con git (no es obligatorio pero es más que recomendable)
- 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:
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
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
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.
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.
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.
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:
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:
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:
Y ya podremos acceder a nuestro recién instalado magento en la url indicada:
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)
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
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.
Y hasta aquí la miniguía!
¡Saludos!
Hola. Es posible usarlo desde un mac, pero corriendo docker desde otra máquina, por ejemplo una raspberry pi 4 con un disco ssd?
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.
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
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.
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.
Hola, tienes pensado sacar la versión para Magento 2.4.x?
Hola Freddy, lo tengo en mente, pero no encuentro el momento de ponerme manos a la obra 🙁
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..
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
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.
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
Hola Jose,
Al mismo tiempo y con la misma instalación no es posible crearlos pero puedes crearlos de forma separada. Para ello solo tienes que clonar el repositorio en carpetas diferentes (tantas como proyectos quieras utilizar). Por ejemplo:
$ git clone https://github.com/pablobae/dockerized-magento2-devel-environment.git proyecto1
$ git clone https://github.com/pablobae/dockerized-magento2-devel-environment.git proyecto2
$ git clone https://github.com/pablobae/dockerized-magento2-devel-environment.git otroproyecto
Y ejecutas el script de instalación en cada carpeta.
Cualquier cosa me dices.
Saludos!
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
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).
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.
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
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.
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.
Claro, que mendrugo. Había abierto el archivo con el notepad para ojearlo y lo había desgraciado. ¡Muchas gracias!
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.
Hola Alejandro,
¿Qué error te devuelve?
Puedes indicarme también los pasos y configuraciones que has intentado instalar para replicarlo?
Saludos!
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.
Acabo de enviarte por email una invitación a Slack, para poder hablar.
No, no, de tu github no se pide nada. Son las mismas credenciales que has introducido anteriormente. Acabo de replicar el problema. Te aviso en tenerlo resuelto. Si quieres puedes acceder al slack de Aradaen a través de este enlace: https://join.slack.com/t/aradaen/shared_invite/zt-182u0exau-Kt9YRcDG8QqRZbOyskFXaQ
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
Hola,
He instalado correctamente pero al acceder a la web me da error 403 de ngix.
A que se puede deber?
Hola Jose, ¿puedes indicarme los parámetros de instalación introducidos, y también tu tipo de entorno (Mac, Linux, WSL)?
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
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.
Hola, instale este manual en WSL, al momento de correr la URL me marca error de DNS que es el siguiente: Comprueba si hay un error de escritura en magento2.local. No se si tuve un error de compilación, gracias de antemano y buen manual con la informacion Puntual.
Intente montarlo en local con la version 2.3.5 que es la que necesito para hacer unas pruebas, pero al final me dio unos errores y no pude montarlo.
no me aparece la carpeta bin/magento y por ende no me cargan los comandos de magento en el docker
/bin # ls
arch chown dumpkmap fsync ipcalc ls mountpoint pipe_progress run-parts su watch
ash conspy echo getopt kbd_mode lzop mpstat printenv sed sync zcat
base64 cp ed grep kill makemime mv ps setpriv tar
bbconfig date egrep gunzip link mkdir netstat pwd setserial touch
busybox dd false gzip linux32 mknod nice reformime sh true
cat df fatattr hostname linux64 mktemp pidof rev sleep umount
chgrp dmesg fdflush ionice ln more ping rm stat uname
chmod dnsdomainname fgrep iostat login mount ping6 rmdir stty usleep
/bin/sh: bin/magento: not found