GNU/Linux >> Linux Esercitazione >  >> Ubuntu

Dockerizzazione di Laravel con Nginx MySQL e Docker Compose su Ubuntu 18.04 LTS

Laravel è un framework PHP gratuito e open source che implementa il modello di progettazione MVC (Model-View-Controller). È progettato con facilità d'uso e consente agli sviluppatori di creare applicazioni semplici e complesse in pochissimo tempo. Laravel è stato creato da Taylor Otwell nel 2011, come tentativo di fornire un'alternativa avanzata al framework CodeIgniter (CI). Nel 2011, Laravel ha rilasciato la versione 1 e la versione 2 e l'ultima versione 5.6 include funzionalità più e migliorate come il supporto della riga di comando (CLI) denominato "artisan", il supporto per diversi sistemi di database, miglioramenti del percorso, ecc.

In questa guida, ti mostreremo come Dockerizzare il progetto Laravel con PHP-FPM, database MySQL e il server Web Nginx utilizzando Docker Compose su Ubuntu Server 18.04. Creeremo una nuova immagine docker per il progetto Laravel, quindi creeremo lo script docker-compose.yml che contiene alcuni servizi tra cui l'App/Laravel stessa, il server Web Nginx e il database MySQL.

Prerequisiti

  • Ubuntu 18.04
  • Privilegi di root

Cosa faremo:

  1. Installa Docker e Docker Compose
  2. Scarica Laravel e installa le dipendenze
  3. Dockerizzare il progetto Laravel
    • Definisci il servizio app Laravel
    • Definisci il servizio HTTP Nginx
    • Definisci il servizio di database MySQL
    • Crea host virtuale Nginx per Laravel
    • Crea Dockerfile per l'app Laravel
  4. Costruisci il progetto Laravel
  5. Post-installazione Laravel

Passaggio 1:installazione di Docker e Docker Compose

In primo luogo, installeremo i pacchetti Docker e Docker Compose sul sistema Ubuntu. E useremo i pacchetti Docker dal repository ufficiale di Ubuntu.

Prima di andare oltre, dobbiamo aggiornare i repository sul sistema Ubuntu. Semplicemente eseguendo il comando seguente.

sudo apt update

Ora installa i pacchetti Docker e Docker Compose usando il comando apt di seguito.

sudo apt install docker.io -y
sudo apt install docker-compose -y

I pacchetti Docker e Docker Compose dovrebbero ora essere installati sul sistema, controllalo usando i seguenti comandi.

docker version
docker-compose version

Di conseguenza, otterrai la versione di Docker e Docker Compose sul sistema.

Successivamente, dobbiamo assegnare l'utente non root al gruppo Docker per eseguire il contenitore Docker per gli utenti non root.

In questo caso, aggiungeremo l'utente chiamato 'hakase' al gruppo Docker eseguendo il comando seguente.

usermod -a -G docker hakase

E dopo, accedi alla shell utente 'hakase' ed esegui il comando 'hello-world' della finestra mobile.

su - hakase
docker run hello-world

Ora ti verrà visualizzato il messaggio "Hello World" da Docker e l'installazione di Docker è stata completata.

Passaggio 2:scarica Laravel e installa le dipendenze

In questo passaggio, scaricheremo il framework web di Laravel nella home directory "hakase" e quindi installeremo le dipendenze di Laravel utilizzando l'immagine docker "compositore" di PHP. Quindi, assicurati di aver effettuato l'accesso al server come utente non root.

Scarica il progetto Laravel nella directory 'myapp' ed entraci.

git clone https://github.com/laravel/laravel.git myapp/
cd myapp/

Ora esegui il seguente comando docker per installare le dipendenze di Laravel.

docker run --rm -v $(pwd):/app composer install

Con il comando precedente, eseguiremo un nuovo contenitore Docker temporaneo e monteremo la directory del progetto 'myapp' nella directory '/app' del contenitore. Il contenitore è basato sull'immagine della finestra mobile "compositore" e stiamo installando le dipendenze di Laravel utilizzando il comando "compositore" all'interno di quel contenitore temporaneo.

Una volta terminata l'installazione delle dipendenze di Laravel, dobbiamo cambiare il proprietario della directory 'myapp' con il nostro utente usando il comando sudo di seguito.

sudo chown -R $USER:$USER ~/myapp

Fase 3:Dockerizzazione del progetto Laravel

Dopo aver scaricato Laravel e installato le sue dipendenze, creeremo un nuovo script docker-compose.yml e creeremo un nuovo Dockerfile per il progetto Laravel.

cd myapp/
vim docker-compose.yml

- Definisci il servizio app Laravel

In primo luogo, definiremo il progetto Laravel stesso e costruiremo l'immagine della finestra mobile per il progetto Laravel utilizzando il Dockerfile.

Incolla lo script di composizione della finestra mobile al suo interno.

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

Dettagli del servizio container Laravel:

  • Il servizio container Laravel sarà denominato 'app'. Si basa sulla nostra immagine Docker personalizzata che verrà creata con il nostro "Dockerfile" e la nuova immagine sarà denominata "hakase-labs/laravel".
  • Vogliamo montare la directory del progetto 'myapp' in '/var/www/html' all'interno del servizio contenitore.
  • Stiamo utilizzando la rete Docker personalizzata per la nostra configurazione, la rete verrà denominata 'mynet'.

- Definisci il servizio HTTP Nginx

Ora definiremo il servizio contenitore nginx.

Incolla la seguente configurazione dopo la riga di servizio del contenitore "app".

  #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

Dettagli di configurazione del servizio contenitore nginx:

  • Vogliamo creare un nuovo contenitore chiamato 'nginx' basato sull'immagine della finestra mobile 'nginx:alpine'.
  • Il servizio container aprirà le porte HTTP e HTTPS.
  • Il container monterà tre volumi diversi. La directory del progetto 'myapp' nella directory '/var/www/html', la configurazione dell'host virtuale nginx 'nginx/conf.d/' nella directory '/etc/nginx/conf.d' e monta i file del certificato ' nginx/ssl/' nella directory '/etc/nginx/ssl' sul contenitore.
  • Il servizio container utilizzerà la stessa rete denominata 'mynet'.

- Definisci il servizio di database MySQL

E l'ultimo, definiamo il servizio di database MySQL.

Incolla la seguente configurazione dopo la riga di servizio del contenitore '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

Salva e chiudi la configurazione.

Dettagli Servizio contenitore MySQL:

  • Il servizio del contenitore MySQL sarà denominato 'db', in base all'immagine della finestra mobile 'mysql:5.7'.
  • Il servizio 'db' aprirà la porta MySQL predefinita '3306'.
  • Il progetto Laravel utilizzerà il database, l'utente e la password in base alla variabile d'ambiente del servizio 'db'.
  • Il servizio MySQL 'db' monterà il volume denominato 'mysqldata' e avrà la stessa rete 'mynet'.
  • E definiamo la rete personalizzata 'mynet' con il driver 'bridge' e il volume 'mysqldata' utilizzerà il driver 'local'.

Di seguito è riportata la configurazione 'docker-compose.yml' completata:

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

- Crea host virtuale Nginx per Laravel

All'interno della directory del progetto 'myapp', crea una nuova directory denominata 'nginx' che conterrà altre due directory 'conf.d' e 'ssl'. Quindi crea una nuova configurazione di host virtuale nginx 'laravel.conf' all'interno della directory 'conf.d'.

Esegui il comando seguente.

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;
    }
}

Salva e chiudi.

Successivamente, copia il file del certificato SSL nella directory 'nginx/ssl/'.

sudo cp /path/to/ssl/fullchain.pem nginx/ssl/
sudo cp /path/to/ssl/privkey.pem nginx/ssl/

- Crea Dockerfile per l'app Laravel

Quindi, crea un nuovo Dockerfile per il progetto Laravel.

Esegui il comando seguente.

vim Dockerfile

Incolla la configurazione di seguito.

# 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"]

Salva e chiudi la configurazione.

E siamo pronti per creare il progetto Laravel "myapp" ed eseguire i servizi container che abbiamo definito.

Fase 4:crea Laravel con Nginx e MySQL Services

Costruisci l'immagine della finestra mobile personalizzata per il nostro progetto Laravel usando il comando seguente.

docker-compose build

Quindi esegui di nuovo il comando seguente.

docker-compose up -d

Scaricherà tutte le immagini docker di cui abbiamo bisogno e quindi creerà servizi container basati sulla configurazione 'docker-compose.yml'.

Al termine, verifica utilizzando il comando docker-compose di seguito.

docker-compose ps

E di conseguenza, otterrai che i tre servizi container saranno attivi e funzionanti. L'"app" in esecuzione sulla porta predefinita "9000" PHP-FPM, il servizio "nginx" è sulle porte HTTP e HTTPS e il servizio MySQL "db" sulla porta MySQL predefinita "3306".

Successivamente, verifica nuovamente tutte le immagini Docker disponibili e le porte aperte sul sistema.

docker-compose images
netstat -plntu

Otterrai l'immagine della finestra mobile personalizzata "hakase-labs/laravel" nell'elenco e le porte HTTP e HTTPS sono nello stato "LISTEN".

Fase 5 - Post-installazione di Laravel

Fino a questa fase, il progetto Laravel è attivo e funzionante come container Docker. E ora creeremo un nuovo file '.env', genereremo la chiave e migreremo i dati di Laravel utilizzando la riga di comando di Laravel 'artisan'.

Copia l'esempio del file '.env' e modificalo all'interno del contenitore.

cp .env.example .env
docker-compose exec app vim .env

Modifica la configurazione del database come di seguito.

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laraveldb
DB_USERNAME=laravel
DB_PASSWORD=laravelpassworddb

Salva e chiudi.

Quindi, genera la chiave dell'applicazione Laravel e cancella la configurazione della cache.

docker-compose exec app php artisan key:generate
docker-compose exec app php artisan config:cache

Successivamente, migra il database utilizzando il seguente comando.

docker-compose exec app php artisan migrate

Assicurati che non ci siano errori.

Ora apri il tuo browser web e digita il nome di dominio del tuo progetto.

http://laravel.hakase-labs.io/

E verrai reindirizzato alla connessione HTTPS sicura e verrà visualizzata la home page di Laravel predefinita come di seguito.

Infine, il progetto Dockerizing of Laravel con web server Nginx e database MySQL è stato completato con successo.


Ubuntu
  1. Ubuntu 20.04:WordPress con installazione di Nginx

  2. Configurazione dell'ambiente di sviluppo Ruby on Rails con Docker e Docker Compose su Ubuntu

  3. Dockerizzazione di Wordpress con Nginx e PHP-FPM su Ubuntu 16.04

  4. Come installare Phorum con Nginx su Ubuntu 18.04 LTS

  5. Come installare Nginx con PHP5 e MySQL su Ubuntu 11.10

Hosting virtuale con Proftpd e MySQL (quota inclusa) su Ubuntu 8.04 LTS

Installazione di Nginx con PHP5 (e PHP-FPM) e supporto MySQL (LEMP) su Ubuntu 12.04 LTS

Installazione di Nginx con PHP5 (e PHP-FPM) e supporto MySQL (LEMP) su Ubuntu 13.04

Installazione di Nginx con supporto PHP5 e MySQL su Ubuntu 8.10

Come installare e configurare Laravel con Docker Compose su Ubuntu 22.04

Come installare e configurare Laravel con Docker Compose su Ubuntu 20.04