Laravel installeren op Docker Windows 10

In dit artikel een uitleg hoe ik een lokale Laravel werkomgeving opzet met Docker.
Voordat je hiermee begint heb je de Docker desktop applicatie nodig, deze kan je hier downloaden.

Maak een folder waar je Laravel wilt installeren. Let wel op dat je dit doet waar Docker bij kan. Je kan dit bij filesharing zien, in de instelling in de Docker Desktop applicatie.

Docker filesharing locatie

 

Clone vanaf Github

Ik heb mijn default Docker bestanden op Github staan, clone mijn Github repo in dit mapje https://github.com/mvd81/docker-laravel. Verwijder daarna de .git folder en maak een src folder aan.


git clone git@github.com:mvd81/docker-laravel.git .
rm -r .git --force
mkdir src

Bestanden in je project

  • docker-compose.yml, hierin geven we aan welke Docker containers we willen opzetten (NGNX webserver, PHP, Mysql enz.)
  • Dockerfile, hier staan wat Docker container settings, zoals de rechten en PHP packages om te installeren
  • nginx/default, de instellingen voor de NGNIX webserver.
  • sql_scripts/create_test_db.sql, in dit bestandje installeer je meteen een test database voor Laravel (unit) testing
  • src, deze folder is leeg maar hier gaan we Laravel installeren

docker-compose.yml bestand aanpassen

Open dit bestand in een edit (bijvoorbeeld PHPstorm). Pas nu het volgende aan

  • De ‘networks’ naam, projectname -> naar de naam van je project (komt meerdere keren voor)
  • Prefix voor de container namen, bijvoorbeeld project_name_nginx en project_name_php. Naar bijvoorbeeld laravel_app_nginx en laravel_app_php
  • De Docker container poorten zodat als je straks meerdere projecten hebt deze niet dezelfde poort hebben.
     ports:
          - "8074:80"

    . Je hoeft alleen de poort voor de : aan te passen, dus 8074 naar 8075 bijvoorbeeld. Doet dit ook ook voor PHP en Mysql ports.

  • Pas de Mysql database naam en eventueel credentials aan,
    environment:
            MYSQL_DATABASE: project_db
            MYSQL_PASSWORD: secret
            MYSQL_ROOT_PASSWORD: secret567
            SERVICE_TAGS: dev
            SERVICE_NAME: mysql

In het bestand ‘sql_scripts/create_test_db.sql’ kan je ook de naam van de test database aanpassen.

CREATE DATABASE test_name_db;

Containers opstarten

Ga nu met de CLI naar je de root van je project (waar o.a. het composer.yml bestand staat).
Voor daar nu uit.

docker-compose up -d --build

Wat gaat Docker nu doen

  • De container images downloaden
  • Containers opzetten
  • Webserver configuratie doen
  • Rechten en PHP extensies downloaden/installeren
  • De database en test database opzetten

De eerste keer zal dit even duren omdat Docker de images moet downloaden.

Nadat Docker alles heeft opgezet zou je een melding zoals dit moeten zien als alles goed is gegaan:


Creating laravel_app_mysql ... done
Creating laravel_app_npm      ... done
Creating laravel_app_php     ... done
Creating laravel_app_artisan  ... done
Creating laravel_app_nginx    ... done
Creating laravel_app_composer ... done

Project openen in de browser

Ga nu met je internet browser naar http://localhost:[de poort die je hebt gekozen bij de nginx service in bestand docker-compose.yml, bijvoorbeeld, http://localhost:8074 ]

Als het goed is zal je een 404 pagina moeten zijn, dit komt omdat we nog niets in de src folder hebben.

Laravel installeren

Ga naar de CLI om Laravel te installeren, Dit kan je doen met het volgende commando:

composer create-project --prefer-dist laravel/laravel src

Laravel zal de installatie doen in het mapje src.

Laravel configuratie / .env bestand aanpassen

Open het .env bestand in het mapje src.
Pas de URL aan

APP_URL=http://localhost

naar de URL + poort, bijvoorbeeld http://localhost:8074

Database

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

Deze gegevens kan je terugvinden in het composer.yml bestand:


MYSQL_DATABASE: laravel_app
MYSQL_PASSWORD: secret
MYSQL_ROOT_PASSWORD: secret567

Je ziet de user daar niet terug maar dat is: root. Voorbeeld hoe je database .env file eruit zou moeten zien.


DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=project_db
DB_USERNAME=root
DB_PASSWORD=secret567

Je ziet bij DB_CONNECTION mysql in plaats van localhost of 127.0.0.1. Je moet hier de naam van je Mysql service gebruiken uit je docker-compose.yml file:

Test database

Ik gebruik ook een Mysql database in plaats van SqlLite, zet dit ook bij je .env bestand


TEST_DB_CONNECTION=mysql
TEST_DB_HOST=mysql
TEST_DB_PORT=3306
TEST_DB_DATABASE=test_db_name
TEST_DB_USERNAME=root
TEST_DB_PASSWORD=secret567

De naam van de test database’test_db_name’ kan je terugvinden in het bestand sql_scripts/create_test_db.sql.

Laravel config

Laravel moet nu nog weten dat we een test database gebruiken, open het bestand src/config/database.php en voeg nu het volgende toe aan de array ‘connections’.


'test_db' => [
            'driver' => 'mysql',
            'host' => env('TEST_DB_HOST', '127.0.0.1'),
            'port' => env('TEST_DB_PORT', '3306'),
            'database' => env('TEST_DB_DATABASE', 'forge'),
            'username' => env('TEST_DB_USERNAME', 'forge'),
            'password' => env('TEST_DB_PASSWORD', ''),
        ],

Aan unit testing database

Ook moeten we aan Unit testing doorgeven dat we deze database gebruiken, open het bestand src/phpunit.xml
je ziet nu voor de test database:


<!-- <server name="DB_CONNECTION" value="sqlite"/> -->
<!-- <server name="DB_DATABASE" value=":memory:"/> -->

Pas dat aan naar:


 
 <!-- <server name="DB_DATABASE" value=":memory:"/> -->

PHP artisan gebruiken in Docker

Omdat we PHP draaien in een Docker container kunnen we niet php artisan gebruiken.
Want nu refereer je aan php van je machine in plaats van de docker container. Je kan op de volgende manier een artisan commando uitvoeren in een Docker container

docker-compose run artisan 

Database migraties

Je hebt nu een Lokale installatie van Laravel klaar voor gebruik, we moeten alleen nog de migraties uitvoeren.

docker-compose run artisan migrate

Connecten naar de database met een GUI

Ik gebruik hiervoor Sqlyog, er is hier ook een gratis versie van (Sql community edition).
Je zou nu met zo’n tool de database kunnen connecten met de gegevens uit je docker-compose.yml / .env bestand.

Docker mysql connectie

 

 

 

 

 

 

Let er even op dat je de poort van de Docker Mysql container pakt.

Bash alias

Om een artisan commando uit te voeren moet je nu wat meer typen, handig is om hiervoor een alias the maken in je bash profile.
Open het bestand door

cd ~ & vi .bashrc

of als je geen/weinig kennis hebt van VIM in je kladblok

cd ~ & notepad .bashrc

Ik heb daar het volgende staan voor Docker

// Docker container opstarten
alias drup="docker-compose up -d --build"
// Run commando
alias dr="docker-compose run"
// Alle (unit) testen uitvoeren
alias drt="docker-compose exec php ./vendor/bin/phpunit"
// Filteren op (unit) test
alias drtf="docker-compose exec php ./vendor/bin/phpunit --filter"

Vergeet na opslaan niet om bash te herladen, door in te typen

bash

Nu kan je een artisan uitvoeren door:

dr artisan <commando>

Composer en Node JS gebruiken in Docker

Omdat we in de docker container werken moeten we via de container Composer en Node JS gebruiken.


dr composer <command>
dr npm <command>