Docker y Laravel
Ya hace un tiempo que se prefiere usar Docker en vez de homestead, u otras forma de probar nuestros proyectos, aunque a mí generalmente me gusta utilizar directamente la máquina virtual, esto consume bastantes recursos. Así pues, en este post veremos como utilizar laravel con docker.
Introducción a Docker
¿Bueno, primero que nada que es Docker? Para descubrir eso veamos la definición misma que se da en el sitio oficial de Docker.
Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production.
https://docs.docker.com/get-started/overview/
Docker es una plataforma abierta que permite el desarrollo, entrega o envió(shipping), y correr Aplicaciones.
La plataforma permite la separación de tu aplicación de tu infraestructura y, por lo tanto, permite la entrega de software de una manera más rápida/eficiente. Puedes gestionar tu infraestructura de la misma manera en la que puedes gestionar tus aplicaciones. Al tomar ventaja de las metodologías de Docket puedes reducir en forma significante el tiempo entre escritura de código y correr el proyecto en producción.
En pocas palabras podremos correr una app en varios OS e incluso servidores para realizar las pruebas sin necesidad de ligar nuestra app a un servidor por ejemplo correr mi app en Apache o NGINX, LInux, Windows, MAC.
Y como permitiría esto en Windows por tirar un ejemplo, al parecer Docker utiliza Windows Subsystem for Linux que es un kernel de Linux creado por Microsoft. Permitiendo los contenedores Linux correr nativamente(sin emulación alguna).
Instalando Docker
Instalar docker no tiene mayor dificultad que ir a la página oficial, he instalado. En tanto a Windows al usar docker por primera vez corriendo el código de ejemplo le pedirá instalar WSL.
docker run -d -p 80:80 docker/getting-started
Creará nuestro primer contenedor en docker.
Containers de Docker
Es un proceso en modo sandbox en tu maquina que esta aislado del os otros procesos en la maquina que es host(directamente tu pc). Ese proceso aislado utilizara los namespaces y cgroups de kernel, caracteristicas que han estado en linux por un largo tiempo.
Docker ha trabajado para que estas capacidades sean accesibles y fáciles de usar.
A esto le llamamos contenedor o container.
- is a runnable instance of an image. You can create, start, stop, move, or delete a container using the DockerAPI or CLI.
- can be run on local machines, virtual machines or deployed to the cloud.
- is portable (can be run on any OS)
- Containers are isolated from each other and run their own software, binaries, and configurations.
OK OK entiendo esto es parecido a las maquinas virtuales no?
Windows
Ahora si vamos al panel de docker y una vez corramos el container nos pedirá instalar el WSL( caso de windows)
En caso de que no pida su instalación, puedes instalar el WSL desde Windows con el siguiente comando
wsl --install
Chequea que la versión de wsl sea WSL2.
wsl -l -v
NAME STATE VERSION * docker-desktop Running 2 docker-desktop-data Running 2
En caso de no ser WSL2 corre el comando para ponerla por defecto:
wsl --set-default-version
La mayoria de las veces el WSL por defecto es la version 2 por lo que es posible que el comando anterior no lo necesites.
Instalando Linux-distros con WSL
Por lo general WSL viene sin ninguna distro, por lo que la tendrás que instalar, puedes ver las distros y también que WSL estás usando en setting> resources>WSL integration y setting> resources>advanced respectivamente.
Hay algunas distros que puedes bajar y ejecutar directamente. Para poder ver estas distros he instalarla usa:
wsl --list --online
NAME FRIENDLY NAME Ubuntu Ubuntu Debian Debian GNU/Linux kali-linux Kali Linux Rolling openSUSE-42 openSUSE Leap 42 SLES-12 SUSE Linux Enterprise Server v12 Ubuntu-16.04 Ubuntu 16.04 LTS Ubuntu-18.04 Ubuntu 18.04 LTS Ubuntu-20.04 Ubuntu 20.04 LTS
Ahora tendríamos que instalar alguna de estas que nos interese:
wsl --install -d Ubuntu-20.04
si vamos a resources tendriamos que ver Ubuntu-20.04 el cual tendremos que activar, y darle a apply y restart.
También deberíamos poner la distro y versión por defecto, en este caso pondremos la distro Ubuntu-20-04.
wsl --set-version Ubuntu-20.04 2
La limitación de Windows 10 home
Lamentablemente amigos yo no pude seguir esta aventura de Docker en Windows, ya que WSL necesita Hyper-V el cual trate de activar corriendo la terminal power Shell corriendo este comando-
Power ShellEnable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
Enable-WindowsOptionalFeature : Feature name Microsoft-Hyper-V is unknown. En línea: 1 Carácter: 1 + Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Enable-WindowsOptionalFeature], COMException + FullyQualifiedErrorId : Microsoft.Dism.Commands.EnableWindowsOptionalFeatureCommand
terminando en esta respuesta nuestra aventura. La razón de esto la encontré en un foro de Microsoft y es que aunque mi pc soporta Hyper-V tengo instalado Windows Home 10 en el que no podemos activar esta funcionalidad.
Aquí dejo la lista de los Windows que podrás usar Docker:
Puede ser habilitado en:
Windows 10 Enterprise
Windows 10 Professional
Windows 10 Education
Hyper-V no puede ser instalado o activado en:
Windows 10 Home
Windows 10 Mobile
Windows 10 Mobile Enterprise
En caso de que puedas instalar Hyper-V, hay una manera aún más fácil de correr un Ubuntu, recuerdas la lista de distros disponibles? Puedes realizar un docker run -i -t ubuntu /bin/bash y tambien deberia hacer la magia instalando la distro + creando el container.
Una vez tengas el container si lo pusiste como el por defecto podrás correrlo con el comando wsl dentro de la terminal del conteiner podras correr el clasico comando para instalar tu laravel
Corriendo el proyecto ejempl de laravel
Fuera del contenedor, en la power shell o cmd puedes correr esto, docker tiene que ser capaz de correr ya vimos anteriormente que en windows 10 home no correrá
curl -s https://laravel.build/example-app | bash
para instalar el proyecto de ejemplo y para correrlo:
cd example-app ./vendor/bin/sail up
Cuando corras sails creara el container
Linux y MAC
Para Linux y Mac la instalación no tiene gran complicación, al parecer, si corremos:
curl -s https://laravel.build/example-app | bash
en la terminal podrás crear el proyecto de ejemplo y
cd example-app ./vendor/bin/sail up
Este último comando creará el contenedor.
Recuerde que su Mac o Linux no tiene por qué venir con curl así que es probable que lo tenga que instalar
sudo apt-get update sudo apt-get install curl
Al parecer usuarios de Linux han tenido algún problema con los permisos, no permitiendo correr docker,»Docker is not running» al correr curl -s https://laravel.build/example-app | bash y la solucion que encontraron es la siguiente:
sudo chmod 666 /var/run/docker.sock
Puedes ver más acerca de este problema en https://laracasts.com/discuss/channels/laravel/docker-is-not-running-when-installing-laravel-from-linux