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