¿Quieres pasar al siguiente nivel y utilizar Docker para tus desarrollos en Laravel? Me alegro mucho que así sea y en esta guía vamos a explicar como instalar y utilizar Laravel junto con Docker, para que tus desarrollos funcionen exactamente igual en tu computadora como en producción.
¿Qué es Docker?
Docker es una tecnología que nos permite empaquetar nuestra aplicación junto con sus dependencias: MySQL, Redis, Apache o Nginx, etc. A estos paquetes se los llama Contenedores y podemos desplegarlos en cualquier maquina o servidor haciendo que nuestra aplicación funcionara exactamente igual en cualquier ambiente.
Diferencias entre Docker y Homestead de Laravel
Tal vez te estés preguntando ¿cuál es la diferencia entre Docker y Homestead? y, ¿por que no utilizar Homestead que tiene el respaldo de los creadores de Laravel? Bueno, la diferencia es que Homestead es un box de Vagrant, el cual corre sobre una maquina virtual y Docker corre sobre nuestra computadora.
Las maquinas virtuales son programas que simulan ser computadoras dentro de nuestra PC. Necesitan tener instalado su propio sistema operativo y programas necesarios para nuestra aplicación. Para esto, la maquina virtual toma parte del disco duro y memoria RAM para poder funcionar.
Por lo tanto, una parte de los recursos están asignados al sistema operativo de la maquina virtual.
En cambio, los contenedores de Docker no necesitan de una maquina virtual ya que utilizan directamente los recursos de la computadora, cargando solamente la aplicación y las dependencias que necesita tu aplicación para funcionar. Utilizan el sistema operativo y los recursos de nuestra PC y no es necesario que instalemos nada para nuestro ambiente.
Otra de las grandes diferencias es que Homestead fue pensando para ser utilizado únicamente en el ambiente de desarrollo. Pero los contenedores de Docker podemos utilizarlos en cualquiera de nuestros ambientes, incluido producción.
Paso 1 – Instalar Docker
Instalar Docker es realmente sencillo, para este ejemplo vamos a instalarlo en una computadora con Ubuntu 16.04. Debemos abrir una terminal y ejecutar los siguientes comandos.
Primero actualizamos y agregamos los paquetes necesarios de Docker:
$ sudo apt-get update $ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - $ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
Ahora, instalamos Docker CE (CE es la versión gratuita de Docker):
$ sudo apt-get update $ sudo apt-get install docker-ce
¡Y listo! Con estos simples comandos ya tenemos instalado Docker para nosotros. Para verificar que se haya instalado correctamente, podemos ejecutar el siguiente comando y deberíamos ver la versión de Docker:
$ docker --version Docker version 18.09.1, build 4c52b90
Paso 2 – Instalar Docker-Compose para utilizar con Laravel
Como vamos a utilizar Laravel junto con distintos servicios (como MySQL, Nginx, Redis, etc.) Docker-Compose nos permite crear y administrar los contenedores necesarios para nuestro proyecto de Laravel.
Instalar la ultima versión de Docker-Compose en Linux
La instalación de docker-compose es muy fácil. Debemos ejecutar el siguiente comando:
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Y aplicamos los permisos necesarios:
$ sudo chmod +x /usr/local/bin/docker-compose
¡Listo! Para verificar que docker-compose se instalo correctamente, ejecutamos el siguiente comando. Si vemos la versión, es que la instalación se realizó correctamente:
$ docker-compose --version docker-compose version 1.23.2, build 1110ad01
Paso 3 – Generar contenedores para Laravel
Antes de instalar Laravel, debemos generar los contenedores. Para esto, vamos a utilizar Docker-Compose y LaraDock.
LaraDock es una herramienta creada por la comunidad de Laravel y nos brinda todo lo necesario para tener un entorno PHP completo.
Instalar y configurar LaraDock
Clonamos el repositorio de LaraDock:
$ git clone https://github.com/Laradock/laradock.git $ cd laradock $ cp .env-example .env
Editamos el archivo .env
(este es el archivo de entorno de LaraDock, no tiene relación con el que conocemos de Laravel).
Buscamos la variable DOCKER_HOST_IP
y modificamos su valor por la IP de localhost.
$ nano .env
Generar contenedores para Laravel
Si listamos los archivos que se encuentran en la carpeta laradock
, veremos todos los servicios que nos provee:
Para nuestro ejemplo, vamos a generar contenedores para Nginx, MySQL, Phpmyadmin que son mas que necesarios para nuestro proyecto de Laravel.
$ sudo docker-compose up -d nginx mysql phpmyadmin
Este comando comenzará a descargar los servicios que le pasamos al comando. Como es la primera vez que lo hacemos, tardará unos minutos.
Al finalizar, ya tendremos nuestros contenedores corriendo y los podemos ver con el comando docker-compose ps
En el contenedor laradock_workspace_1
es donde trabajaremos con Laravel. Así que, debemos entrar al contenedor e instalar un nuevo proyecto de Laravel (o clonar tu proyecto si ya tienes uno existente).
Para esto, vamos a ejecutar el programa bash
en el contenedor y así tendremos una terminal en el contenedor:
$ sudo docker-compose exec workspace bash
Como verán, no hace falta poner laradock_workspace_1
, solo con workspace
es suficiente.
Ahora nuestro propt se verá algo así: root@0bd8859e9750:/var/www
y si listamos los archivos que contiene la carpeta /var/www/
, nos mostrará los archivos de nuestra computadora…😱 ¿Qué paso aquí? Bueno, el contenedor workspace por defecto mapea con el directorio raíz de nuestra computadora (puedes modificar la ruta por defecto en el archivo .env de Docker).
Ahora llego el momento de instalar Laravel:
Paso 4 – Instalar Laravel dentro del Contenedor de Docker
Para instalar Laravel dentro del contenedor es lo mismo de siempre. Puedes clonar un proyecto que tengas en Github, o puedes instalar un nuevo proyecto de Laravel, yo haré esto ultimo:
root@0bd8859e9750:/var/www# composer create-project --prefer-dist laravel/laravel blog root@0bd8859e9750:/var/www# cp .env.example .env root@0bd8859e9750:/var/www# artisan key:generate root@0bd8859e9750:/var/www# exit $ cd .. $ cd blog/ $ sudo chmod -R 777 storage bootstrap/cache
Ahora debemos hacer que Nginx apunte a nuestra carpeta de Laravel. Para esto editamos el archivo .env
de LaraDock y ponemos el nombre de la carpeta de nuestro proyecto en la variable APP_CODE_PATH_HOST
, en mi caso se llama blog
.
$ nano .env
APP_CODE_PATH_HOST=../blog
Reiniciamos los servicios de docker:
$ sudo docker-compose down $ sudo docker-compose up -d nginx mysql phpmyadmin
Con esto ya podemos ingresar a http://localhost/
con nuestro navegador y veremos la aplicación de Laravel corriendo correctamente.
¡👏👏👏!
Paso 5 – Crear Base de Datos para Laravel
Para crear una base de datos que utilizará Laravel, lo podemos hacer con phpmyadmin o por comandos SQL. Vamos a hacerlo por SQL.
Configurar contenedor MySQL para utilizar en Laravel
Editamos el archivo .env
de LaraDock y buscamos las variables MYSQL_DATABASE
y MYSQL_ROOT_PASSWORD
, a esta última debemos ingresar una contraseña para el usuario root de nuestra base de datos.
$ nano .env
También debemos editar el archivo my.cnf que se encuentra en la carpeta de laradock y agregar la ultima linea que se ve en la imagen:
$ nano laradock/mysql/my.cnf
Guardamos las modificaciones y salimos del archivo.
Ahora ingresamos al contenedor de MySQL, le damos los permisos necesarios a nuestro usuario y creamos la base de datos:
$ sudo docker-compose exec mysql bash
root@c9525b8e5105:/# mysql -u root -p
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
mysql> ALTER USER 'default'@'%' IDENTIFIED WITH mysql_native_password BY 'secret';
mysql> create database blog;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| blog |
| default |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.17 sec)
Ya casi terminamos. Ahora debemos configurar el archivo .env de Laravel para ingresar los datos de la conexión a la base de datos. Nos desconectamos de MySQL y salimos del contenedor.
mysql> exit
root@c9525b8e5105:/# exit
$ cd ../blog/
$ nano .env
Reiniciamos todos los contenedores:
$ cd ../laradock/ $ sudo docker-compose down $ sudo docker-compose up -r nginx mysql
Paso 6 – Ejecutar migraciones
Para ejecutar las migraciones debemos ingresar a la carpeta laradock
, entrar al contenedor workspace y ejecutar el comando artisan.
$ sudo docker-compose exec workspace bash root@0031095f86de:/var/www# artisan migrate
Listo, ya tenemos todo instalado y podemos empezar a desarrollar nuestra aplicación de Laravel. No hace falta que ingreses al contenedor workspace para desarrollar, lo podes hacer directamente desde la carpeta donde esta tu proyecto.
Esto fue todo, espero que les haya servido esta guía para utilizar Laravel con Docker. Cualquier duda la pueden dejar en los comentarios. En un próximo artículo voy a escribir como activar SSL con Docker, como lo hicimos con Apache y Nginx. Si te gusto, no dudes en compartirlo. 😁👍
Justo con lo que me estaba pelando muchas gracias
Puedo tener mas proyectos de laravel en el mismo contenedor? Y si es asi se puede llamar los dos proyectos al mismo tiempo en diferentes pestañas
Si, podes tener mas de un proyecto ejecutándose a la vez.
Cómo sería para usar Apache en lugar de Nginx?
Gracias!
Al comando
docker-compose up
le pasasapache
en vez denginx
no acepta el comando apache, alguna otra alternativa?
ya lo resolví en lugar de poner apache coloque apache2 al final quedo así:
sudo docker-compose up -d apache2 mysql phpmyadmin
Muchas gracias por el tutorial seria genial en proximas entregas que expliques como se lleva a producción, que hay que hacer para hacer cambios, se cambia solo en el código o todo el contenedor, se ve interesante Docker saludos
Ya lo estoy por publicar 😉
Genial!
Muchas gracias.. Un buen aporte.. Como feedback diría que estaría mejor realizar la instalación y/o configuraciones necesarias desde el archivo de configuración dockerfile y no así ingresando al contenedor y ejecutar comandos…
Con la finalidad de poder reutilizar dichas configuraciones para posteriores proyectos Laravel.
Me gustaría mucho que tocaras el tema de microservicios con Docker y Laravel..
Saludos y una ves más gracias por el aporte
Hola, de casualidad ya tienes conocimiento del tema de microservicios con laravel y docker?
GRACIASSSSSSS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Y para windows?
windows y docker jajaja
Linux es una MIERDA para los que trabajamos con diseño en Adobe y Laravel sin tener que montar una VM, no veo por que hay gente que se burla de windows, cuando todo el hpta mundo lo usa.
Fanboy detected
Hola, excelente post, quisiera saber cómo se agregaría un virtualhost con docket, que se necesitaría. Sería de mucha ayuda gracias.
hola, instalo el docker en mi localhost, configuro mi laravel lo dejo funcionando todo en desarrollo pero que subo despues al hosting para lanzarlo a produccion? cuando quiero llevarlo al host definitivo?
Próximamente voy a publicar un articulo sobre este tema.
Hay un error en el tutorial revisen que default-authentication-plugin este con guiones y no con guion bajo
Hola, buen día, gracias por el artículo, muy bueno, una pregunta, cómo cambio de usuario en el contenedor? cuando creé el proyecto de Laravel, me lo puso como root, afecta en algo?
Gracias
Como hago para mapear las carpetas de mi computadora en el .env? Porque sólo me muestra las carpetas del dock. Como sería la ruta?
Que se debería hacer para desplegarlo en un entorno de producción?
Muchas gracias!
Próximamente voy a publicar un articulo sobre este tema.
Lo publicaste amigo ?
Si, pero de otra forma más simple de la que esta acá. Te dejo el link: https://www.laraveltip.com/como-dockerizar-un-proyecto-laravel-y-subirlo-a-clouding-io/
Se puede realizar proyectos con otro framework o php puro en laradock?
Hola Luciano. Si es posible, en su documentación dice que arrancó como un proyecto para Laravel pero ya se puede utilizar para otros frameworks como Symfony, CodeIgniter, WordPress, Drupal, etc. Saludos.
Yo tengo un problema que detecte con Laradock, y no se si sea porque estoy usando Docker con Ubuntu WSL en Windows 10, pero a la hora de reiniciar la maquina e iniciar el docker-compose me borra las base de datos(y no estoy seguro si haga lo mismo en el codigo). No se si ya te haya pasado esto y como se resuelve?. Muy buen articulo por cierto. Saludos.
Hola gente. Muchas gracias por este material. Fantástico para acelerar la vida.
Vengo de Windows (peores cosas he hecho), así que disculpen la pregunta tonta para quien sabe Linux (como se debe).
Cuando ejecuto el composer (sudo docker-compose up -d nginx mysql phpmyadmin), no reconoce ninguna de las variables que se definen en env.
Los errores son del tipo:
WARNING: The PHP_VERSION variable is not set. Defaulting to a blank string.
WARNING: The PHALCON_VERSION variable is not set. Defaulting to a blank string.
…
Debo estudiar más Linux, pero algun consejo rápido que me saque del pantano?
Gracias.
Buenas tardes, como podría hacer para ejecutar el container workspace con otro usuario diferente a root?
Gracias
Saludos
Hola Nicolas.
Debes agregar la option –user=[usuario] por ejemplo:
docker-compose exec --user=nicolas workspace bash
Saludos.
Hola Matias, gracias por tu rta. Ejecuté con la option –user y arrojó el siguiente mensaje «unable to find user nico: no matching entries in passwd file»
Saludos
El erro dice que el usuario «nico» no existe. El comando que te pase es de ejemplo. Tu debes ingresar un usuario que tengas creado, distinto a root. Saludos.
Perdón Matias, olvidé aclarar que ese usuario que te pasé si existe, pero por algún motivo no me lo toma para ejecutar el docker. Saludos
Prueba agregar estas lineas al dockerfile de nginx (o apache, si estas usando este):
RUN useradd -ms /bin/bash nico
USER nico
WORKDIR /home/nico
excelete guia felicitaciones
Ya hay docker para windows, y no hay nada de malo usarlo así, quizás es nuevo y no conoce mucho de Linux. sería un primer paso.
Compa la neta esta bien chido el tutorial.. Me sirvio de mucho…
Muchas gracias bro!
Todo perfecto, excepto al reiniciar contenedores con el comando:
$ sudo docker-compose up -r nginx mysql
los levanté de nuevo con:
$ sudo docker-compose up -d nginx mysql phpmyadmin
y todo funcionó perfecto.
Gracias
De todos maneras me pide la contraseña en MySQL
Una excelente guía, fácil de seguir para quienes nos estamos iniciando en este mundo. Saludos y Muchas gracias.
Gracias por tu comentario!
Excelente tutorial para comenzar con docker y laravel.
Muchas gracias por el aporte.
Excelente es sumamente sencillo y fácil de entender. Gracias por el aporte.
Lo que veo es que esto no termina de ser un contenedor light, tienes todas las dependencys cargadas y un paso a prod es mover unos cuantos megas, ¿Podias hacer una versión lite con php, mysql y nginx y luego si quieres más cargar otros ficheros? Es algo complicado entre dockerfile, .env y algun file más yo me he perdido.
Buenas, ¿alguien que me ayude? No logro pasar de este punto:
sudo docker-compose up -d nginx mysql phpmyadmin
Me sale:
ERROR: Service ‘workspace’ failed to build: The command ‘/bin/sh -c if [ ${INSTALL_NODE} = true ]; then mkdir -p $NVM_DIR && curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash && . $NVM_DIR/nvm.sh && nvm install ${NODE_VERSION} && nvm use ${NODE_VERSION} && nvm alias ${NODE_VERSION} && if [ ${NPM_REGISTRY} ]; then npm config set registry ${NPM_REGISTRY} ;fi && if [ ${INSTALL_NPM_GULP} = true ]; then npm install -g gulp ;fi && if [ ${INSTALL_NPM_BOWER} = true ]; then npm install -g bower ;fi && if [ ${INSTALL_NPM_VUE_CLI} = true ]; then npm install -g @vue/cli ;fi && if [ ${INSTALL_NPM_ANGULAR_CLI} = true ]; then npm install -g @angular/cli ;fi && ln -s `npm bin –global` /home/laradock/.node-bin ;fi’ returned a non-zero code: 1
Lo solucione cambiando la condicional,
if [ ${INSTALL_NODE} = false ]
//Seguido de eso me salieron errores parecidos e hice lo mismo y me funciono.
No logro cambiar la versión de PHP, no sé cual es el detalle de configuración
Excelente el post muy fácil y genial tengo 2 Preguntas: 1: ¿Como puedo acceder al phpmyadmin? 2: ¿Como puedo conectarme a mi db desde un gestor instalado en mi maquina? PD: soy nuevo en docker muy nuevo, gracias !!
una pregunta para consumir un microservicio que esta en docker desde laravel como se hace
El microservicio seguramente tiene una IP publica a la que los demás servicios pueden pegarle, por ejemplo Laravel.
eso es lo que no se nunca he usado docker pero me estan pidiendo que haga una aplicacion laravel basada en microservicios y que estos esten en docker y debo montarlo en un servidor no se como hacer esa configuracion y busco y busco y no consigo nada
Al 2021 .env-example no existe en el repo de laradock
Buenas, muy bueno el tutorial , quisiera saber si LaravelDock es similar a LaravelSail y en todo caso , en este momento cual es el mas recomendable utilizar?. gracias
Hola Claudio, como estas?
Hoy en día lo mejor es escribir tu propio Dockerfile como explico en otro articulo.
LaravelSail no se debe usar en producción. Solamente es para usar en entorno local.
Saludos.