GNU/Linux >> Tutoriales Linux >  >> Ubuntu

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

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:

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


Ubuntu
  1. Ubuntu 20.04:instalación de WordPress con Nginx

  2. Configurar el entorno de desarrollo de Ruby on Rails con Docker y Docker Compose en Ubuntu

  3. Dockerización de Wordpress con Nginx y PHP-FPM en Ubuntu 16.04

  4. Cómo instalar Phorum con Nginx en Ubuntu 18.04 LTS

  5. Cómo instalar Nginx con PHP5 y MySQL en Ubuntu 11.10

Alojamiento virtual con Proftpd y MySQL (incluida la cuota) en Ubuntu 8.04 LTS

Instalación de Nginx con PHP5 (y PHP-FPM) y compatibilidad con MySQL (LEMP) en Ubuntu 12.04 LTS

Instalación de Nginx con PHP5 (y PHP-FPM) y compatibilidad con MySQL (LEMP) en Ubuntu 13.04

Instalación de Nginx con compatibilidad con PHP5 y MySQL en Ubuntu 8.10

Cómo instalar y configurar Laravel con Docker Compose en Ubuntu 22.04

Cómo instalar y configurar Laravel con Docker Compose en Ubuntu 20.04