Laravel es un framework PHP gratuito y de código abierto que implementa el patrón de diseño MVC (Model-View-Controller). Está diseñado para ser fácil de usar y permite a los desarrolladores crear aplicaciones simples y complejas en muy poco tiempo. Laravel fue creado por Taylor Otwell en 2011, como un intento de proporcionar una alternativa avanzada al marco CodeIgniter (CI). En 2011, Laravel lanzó la versión 1 y la versión 2, y la última versión 5.6 viene con más funciones mejoradas, como la compatibilidad con la línea de comandos (CLI) denominada 'artisan', compatibilidad con diferentes sistemas de bases de datos, mejoras en las rutas, etc.
En esta guía, le mostraremos cómo dockerizar el proyecto Laravel con PHP-FPM, la base de datos MySQL y el servidor web Nginx usando Docker Compose en Ubuntu Server 18.04. Vamos a crear una nueva imagen acoplable para el Proyecto Laravel y luego crearemos el script docker-compose.yml que contiene algunos servicios, incluidos la propia aplicación/Laravel, el servidor web Nginx y la base de datos MySQL.
Requisitos previos
- Ubuntu 18.04
- Privilegios de raíz
Qué haremos:
- Instalar Docker y Docker Compose
- Descargar Laravel e Instalar Dependencias
- Dockerización del Proyecto Laravel
- Definir el servicio de aplicaciones de Laravel
- Definir el servicio HTTP de Nginx
- Definir el servicio de base de datos MySQL
- Crear host virtual Nginx para Laravel
- Crear Dockerfile para la aplicación Laravel
- Construye el Proyecto Laravel
- Post-instalación de Laravel
Paso 1:instalar Docker y Docker Compose
En primer lugar, instalaremos los paquetes Docker y Docker Compose en el sistema Ubuntu. Y usaremos paquetes Docker del repositorio oficial de Ubuntu.
Antes de continuar, necesitamos actualizar los repositorios en el sistema Ubuntu. Simplemente ejecutando el siguiente comando.
sudo apt update
Ahora instale los paquetes Docker y Docker Compose usando el comando apt a continuación.
sudo apt install docker.io -y
sudo apt install docker-compose -y
Los paquetes Docker y Docker Compose ahora deberían estar instalados en el sistema, verifíquelo usando los siguientes comandos.
docker version
docker-compose version
Como resultado, obtendrá la versión de Docker y Docker Compose en el sistema.
A continuación, debemos asignar el usuario no root al grupo docker para ejecutar el contenedor Docker para usuarios no root.
Para este caso, agregaremos el usuario llamado 'hakase' al grupo docker ejecutando el siguiente comando.
usermod -a -G docker hakase
Y después de eso, inicie sesión en el shell de usuario 'hakase' y ejecute el comando docker 'hello-world'.
su - hakase
docker run hello-world
Ahora se le mostrará el mensaje 'Hello World' de Docker y la instalación de Docker se habrá completado.
Paso 2:descarga Laravel e instala las dependencias
En este paso, vamos a descargar el marco web de Laravel en el directorio de inicio 'hakase' y luego instalaremos las dependencias de Laravel usando la imagen acoplable PHP 'compositor'. Por lo tanto, asegúrese de haber iniciado sesión en el servidor como usuario no root.
Descargue el proyecto Laravel en el directorio 'myapp' y acceda a él.
git clone https://github.com/laravel/laravel.git myapp/
cd myapp/
Ahora ejecute el siguiente comando docker para instalar las dependencias de Laravel.
docker run --rm -v $(pwd):/app composer install
Con el comando anterior, ejecutaremos un nuevo contenedor docker temporal y montaremos el directorio del proyecto 'myapp' en el directorio '/app' del contenedor. El contenedor se basa en la imagen acoplable 'compositor' y estamos instalando las dependencias de Laravel usando el comando 'compositor' dentro de ese contenedor temporal.
Una vez que finaliza la instalación de las dependencias de Laravel, debemos cambiar el propietario del directorio 'myapp' a nuestro propio usuario usando el comando sudo a continuación.
sudo chown -R $USER:$USER ~/myapp
Paso 3:Dockerización del proyecto Laravel
Después de descargar Laravel e instalar sus dependencias, crearemos un nuevo script docker-compose.yml y crearemos un nuevo Dockerfile para el proyecto Laravel.
cd myapp/
vim docker-compose.yml
- Definir el servicio de aplicaciones de Laravel
En primer lugar, definiremos el proyecto Laravel en sí mismo y crearemos la imagen acoplable para el proyecto Laravel utilizando Dockerfile.
Pegue el script de composición de la ventana acoplable en él.
version: '3'
services:
#Laravel App
app:
build:
context: .
dockerfile: Dockerfile
image: hakase-labs/laravel
container_name: app
restart: unless-stopped
tty: true
environment:
SERVICE_NAME: app
SERVICE_TAGS: dev
working_dir: /var/www/html
volumes:
- ./:/var/www/html
networks:
- mynet
Detalles del servicio de contenedor de Laravel:
- El servicio de contenedor de Laravel se llamará 'aplicación'. Se basa en nuestra imagen acoplable personalizada que se creará con nuestro 'Dockerfile', y la nueva imagen se llamará 'hakase-labs/laravel'.
- Queremos montar el directorio del proyecto 'myapp' en '/var/www/html' dentro del servicio contenedor.
- Usamos la red docker personalizada para nuestra configuración, la red se llamará 'mynet'.
- Definir el servicio HTTP de Nginx
Ahora definiremos el servicio de contenedor nginx.
Pegue la siguiente configuración después de la línea de servicio del contenedor 'aplicación'.
#Nginx Service
nginx:
image: nginx:alpine
container_name: nginx
restart: unless-stopped
tty: true
ports:
- "80:80"
- "443:443"
volumes:
- ./:/var/www/html
- ./nginx/conf.d/:/etc/nginx/conf.d/
- ./nginx/ssl/:/etc/nginx/ssl/
networks:
- mynet
Detalles de configuración del servicio de contenedor nginx:
- Queremos crear un nuevo contenedor llamado 'nginx' basado en la imagen acoplable 'nginx:alpine'.
- El servicio de contenedor abrirá los puertos HTTP y HTTPS.
- El contenedor montará tres volúmenes diferentes. El directorio del proyecto 'myapp' al directorio '/var/www/html', la configuración del host virtual nginx 'nginx/conf.d/' al directorio '/etc/nginx/conf.d' y los archivos de certificado de montaje ' nginx/ssl/' al directorio '/etc/nginx/ssl' en el contenedor.
- El servicio de contenedores usará la misma red llamada 'mynet'.
- Definir el servicio de base de datos MySQL
Y por último, definimos el servicio de base de datos MySQL.
Pegue la siguiente configuración después de la línea de servicio del contenedor 'nginx'.
#MySQL Service
db:
image: mysql:5.7
container_name: db
restart: unless-stopped
tty: true
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: laraveldb
MYSQL_USER: laravel
MYSQL_PASSWORD: laravelpassworddb
MYSQL_ROOT_PASSWORD: rootpasswordmysql
volumes:
- mysqldata:/var/lib/mysql/
networks:
- mynet
#Docker Networks
networks:
mynet:
driver: bridge
#Volumes
volumes:
mysqldata:
driver: local
Guarde y cierre la configuración.
Detalles del servicio de contenedor de MySQL:
- El servicio de contenedor de MySQL se llamará 'db', según la imagen acoplable 'mysql:5.7'.
- El servicio 'db' abrirá el puerto MySQL predeterminado '3306'.
- El proyecto Laravel utilizará la base de datos, el usuario y la contraseña en función de la variable de entorno del servicio 'db'.
- El servicio MySQL 'db' montará el volumen llamado 'mysqldata' y tendrá la misma red 'mynet'.
- Y definimos la red personalizada 'mynet' con el controlador 'puente', y el volumen 'mysqldata' usará el controlador 'local'.
A continuación se muestra la configuración completa de 'docker-compose.yml':
version: '3' services: #Laravel App app: build: context: . dockerfile: Dockerfile image: hakase-labs/laravel container_name: app restart: unless-stopped tty: true environment: SERVICE_NAME: app SERVICE_TAGS: dev working_dir: /var/www/html volumes: - ./:/var/www/html networks: - mynet #Nginx Service nginx: image: nginx:alpine container_name: nginx restart: unless-stopped tty: true ports: - "80:80" - "443:443" volumes: - ./:/var/www/html - ./nginx/conf.d/:/etc/nginx/conf.d/ - ./nginx/ssl/:/etc/nginx/ssl/ networks: - mynet #MySQL Service db: image: mysql:5.7 container_name: db restart: unless-stopped tty: true ports: - "3306:3306" environment: MYSQL_DATABASE: laraveldb MYSQL_USER: laravel MYSQL_PASSWORD: laravelpassworddb MYSQL_ROOT_PASSWORD: rootpasswordmysql volumes: - mysqldata:/var/lib/mysql/ networks: - mynet #Docker Networks networks: mynet: driver: bridge #Volumes volumes: mysqldata: driver: local
- Crear host virtual Nginx para Laravel
Dentro del directorio del proyecto 'myapp', cree un nuevo directorio llamado 'nginx' que contendrá otros dos directorios 'conf.d' y 'ssl'. Luego cree una nueva configuración de host virtual nginx 'laravel.conf' dentro del directorio 'conf.d'.
Ejecute el siguiente comando.
mkdir -p nginx/{conf.d,ssl}
vim nginx/conf.d/laravel.conf
server { listen 80; server_name laravel.hakase-labs.io; return 301 https://laravel.hakase-labs.io$request_uri; } server { listen 443 ssl http2; server_name laravel.hakase-labs.io; ssl_certificate /etc/nginx/ssl/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/privkey.pem; # Log files for Debug error_log /var/log/nginx/error.log; access_log /var/log/nginx/access.log; # Laravel web root directory root /var/www/html/public; index index.php index.html; location / { try_files $uri $uri/ /index.php?$query_string; gzip_static on; } # Nginx Pass requests to PHP-FPM location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass app:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } }
Guardar y cerrar.
Después de eso, copie su archivo de certificado SSL en el directorio 'nginx/ssl/'.
sudo cp /path/to/ssl/fullchain.pem nginx/ssl/
sudo cp /path/to/ssl/privkey.pem nginx/ssl/
- Crear Dockerfile para la aplicación Laravel
Luego, crea un nuevo Dockerfile para el proyecto Laravel.
Ejecute el siguiente comando.
vim Dockerfile
Pegue la configuración a continuación.
# Set master image FROM php:7.2-fpm-alpine # Copy composer.lock and composer.json COPY composer.lock composer.json /var/www/html/ # Set working directory WORKDIR /var/www/html # Install Additional dependencies RUN apk update && apk add --no-cache \ build-base shadow vim curl \ php7 \ php7-fpm \ php7-common \ php7-pdo \ php7-pdo_mysql \ php7-mysqli \ php7-mcrypt \ php7-mbstring \ php7-xml \ php7-openssl \ php7-json \ php7-phar \ php7-zip \ php7-gd \ php7-dom \ php7-session \ php7-zlib # Add and Enable PHP-PDO Extenstions RUN docker-php-ext-install pdo pdo_mysql RUN docker-php-ext-enable pdo_mysql # Install PHP Composer RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer # Remove Cache RUN rm -rf /var/cache/apk/* # Add UID '1000' to www-data RUN usermod -u 1000 www-data # Copy existing application directory permissions COPY --chown=www-data:www-data . /var/www/html # Change current user to www USER www-data # Expose port 9000 and start php-fpm server EXPOSE 9000 CMD ["php-fpm"]
Guarde y cierre la configuración.
Y estamos listos para construir el proyecto Laravel 'myapp' y ejecutar los servicios de contenedores que hemos definido.
Paso 4:Compilación de Laravel con Nginx y MySQL Services
Cree la imagen de la ventana acoplable personalizada para nuestro proyecto Laravel usando el siguiente comando.
docker-compose build
Luego ejecute nuevamente el siguiente comando.
docker-compose up -d
Descargará todas las imágenes de la ventana acoplable que necesitemos y luego creará servicios de contenedor basados en la configuración 'docker-compose.yml'.
Cuando esté completo, verifíquelo con el siguiente comando docker-compose.
docker-compose ps
Y como resultado, obtendrá los tres servicios de contenedores en funcionamiento. La 'aplicación' que se ejecuta en el puerto predeterminado '9000' PHP-FPM, el servicio 'nginx' está en los puertos HTTP y HTTPS, y el servicio MySQL 'db' en el puerto predeterminado de MySQL '3306'.
Después de eso, verifique nuevamente todas las imágenes acoplables disponibles y los puertos abiertos en el sistema.
docker-compose images
netstat -plntu
Obtendrá la imagen de la ventana acoplable personalizada 'hakase-labs/laravel' en la lista, y el puerto HTTP y HTTPS están en el estado 'ESCUCHAR'.
Paso 5 - Posinstalación de Laravel
Hasta esta etapa, el proyecto Laravel está funcionando como un contenedor Docker. Y ahora vamos a crear un nuevo archivo '.env', generar la clave y migrar los datos de Laravel usando la línea de comandos de Laravel 'artisan'.
Copie el ejemplo del archivo '.env' y edítelo dentro del contenedor.
cp .env.example .env
docker-compose exec app vim .env
Cambie la configuración de la base de datos como se muestra a continuación.
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laraveldb
DB_USERNAME=laravel
DB_PASSWORD=laravelpassworddb
Guardar y cerrar.
A continuación, genere la clave de la aplicación Laravel y borre la configuración de caché.
docker-compose exec app php artisan key:generate
docker-compose exec app php artisan config:cache
Después de eso, migre la base de datos usando el siguiente comando.
docker-compose exec app php artisan migrate
Asegúrese de que no haya ningún error.
Ahora abra su navegador web y escriba el nombre de dominio de su proyecto.
http://laravel.hakase-labs.io/
Y será redirigido a la conexión HTTPS segura y se mostrará la página de inicio predeterminada de Laravel como se muestra a continuación.
Finalmente, el proyecto Dockerizing of Laravel con el servidor web Nginx y la base de datos MySQL se completó con éxito.