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:
- Installa Docker e Docker Compose
- Scarica Laravel e installa le dipendenze
- 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
- Costruisci il progetto Laravel
- 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.