Dockerización de Laravel con Nginx MySQL y Docker Compose en Ubuntu 18.04 LTS

Comprobar la versión de la ventana acoplable

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 características mejoradas como soporte de línea de comandos (CLI) llamado ‘artisan’, soporte para diferentes sistemas de bases de datos, mejoras de ruta, 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 de la ventana acoplable para el proyecto Laravel y luego crearemos el script docker-compose.yml que contiene algunos servicios, incluidos la aplicación/Laravel en sí, el servidor web Nginx y la base de datos MySQL.

requisitos previos

  • Ubuntu 18.04
  • Privilegios de raíz

Lo que haremos:

  1. Instalar Docker y Docker Compose
  2. Descargar Laravel e Instalar Dependencias
  3. Dockerizando el 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
  4. Construye el Proyecto Laravel
  5. Post-instalación de Laravel

Paso 1: instale 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.

Comprobar la versión de la ventana acoplable

A continuación, debemos asignar el usuario no root al grupo docker para ejecutar el contenedor Docker para usuarios no root.

Para este caso, vamos a agregar 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.

Añadir usuario acoplable

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.

Obtener el marco de Laravel

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

Cambiar propietario del directorio de la aplicación

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 construiremos la imagen acoplable para el proyecto Laravel usando 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 de contenedor.
  • Estamos usando la red acoplable 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 contenedor utilizará 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: crea 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

Cree Laravel con Nginx y MySQL Services

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’.

Descargar imágenes acoplables

Cuando esté completo, verifíquelo con el comando docker-compose a continuación.

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’.

Verifique la configuración de la ventana acoplable con netstat

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.

Luego, genere la clave de la aplicación Laravel y borre la configuración del 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.

Instalación posterior de Laravel

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.

Laravel con Docker instalado correctamente

Finalmente, el proyecto Dockerizing de Laravel con el servidor web Nginx y la base de datos MySQL se ha completado con éxito.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *