Nieuwe dev-laptop, geen bloatware installeren dus. Docker it is!

Ingediend door Dirk Hornstra op 03-jan-2023 19:30

Ik heb een nieuwe dev-laptop, 16 GB intern geheugen, 1 TB SSD schijf, dus "aan ruimte en mogelijkheden geen gebrek". Maar voordat ik klakkeloos allemaal spul ga installeren, even op de rem trappen. Want ik heb het wel eerder gedaan. Had ik een Microsoft SQL Server database nodig die moest draaien. Dan installeer je "even" de Developer of Express editie en kun je aan de slag. Hetzelfde geldt voor je PHP-projecten "even" XAMPP installeren en je hebt Apache (webserver), mySQL (database) en nog wat spul draaien. En heb je een andere PHP versie nodig, dan installeer je die in een andere map. Maar ja...

Dan staat er spul op je pc wat je vaker niet dan wel gebruikt. Waar toch Windows services voor draaien. En bij mijn werk-laptop ooit heeft gezorgd voor een bijna volle schijf (er werden continu back-ups van grote databases gemaakt).

Dan zijn containers een goede oplossing. Je start die dingen op als je ze nodig hebt, en ben je alleen wat aan het surfen, mail aan het checken of zoals nu, een blog aan het uittikken, dan draait dat spul niet.

Ik had al eens eerder "wat" met Docker Desktop gedaan (linkje) en ik zou daar nog eens verder naar kijken. Maar ja, dan ben je weer met andere dingen bezig. En dan... in je vrije week waar je eindelijk met je eigen spul aan de slag zou gaan, heeft één van mijn kennissen problemen met de website. Ik heb het ooit opgezet, hiervoor heb ik het CMS "Bolt" gebruikt, wat qua interface net wat handiger werkte dan Wordpress. Maar ja, nu blijkt (nu de hosting aangepast is) dat er nogal wat foutieve SQL-query's uitgevoerd worden. Werden die in de oude mySQL weggemoffeld, nu sterft de boel af.

Ik had dus even snel wat lokaal kunnen installeren, maar ik besluit: hoe lang dit ook gaat duren, dit gaan we met Docker fixen! Waar ik in onderstaand verhaal mySQL zeg kan het zijn dat ik mariaDB bedoel, ik bedoel dus "de database".

Stap 1: Docker Desktop downloaden.

Link: https://www.docker.com/products/docker-desktop/

Stap 2: Via FTP de bestanden binnen halen en een dump van de database.

Stap 3: Check welke PHP versie en mySQL versie ik daar draai.

PHP: 7.3.33 (verouderd), kan later naar  8.0.25 of 8.1.12
mySQL: 10.3.34-MariaDB-0ubuntu0.20.04.1 - Ubuntu 20.04

Stap 4: Start Docker Desktop.

Dat is 'n goeie, want bij mijn nieuwe dev-laptop heb ik mijn gebruiker geen admin gemaakt, maar "gewoon" gebruiker. Dat is is eigenlijk iets wat je altijd moet doen: de gebruiker die je in Windows-gebruikt moet geen admin zijn! Als je  admin-bevoegdheden nodig hebt, vraagt Windows je wel als die hoofdgebruiker rechten te geven, of je start het programma als administrator, waarbij je het wachtwoord/de pincode van jouw admin-user invoert.
Ik krijg bij opstarten de foutmelding dat ik niet in de "docker-users" group zit.
Gelukkig staat dit in de documentatie van docker: link.



net localgroup docker-users <user> /add
 

Als administrator een command-prompt gestart, in bovenstaande <user> vervangen door mijn gebruikersnaam.
Hierna moet je even uit- en inloggen en je kunt Docker Desktop starten.
Maar: dan krijg je de melding dat de installatie incompleet is. WSL 2 is namelijk ook nodig.
Je moet nog een kernel update installeren. Deze verwijst naar deze pagina: link.
Hierna moet je herstarten. Je komt uit op deze pagina: link, download en installatie uitgevoerd.

WSL2 nog even als standaard instellen:



wsl --set-default-version 2
 

Daar krijg je nog even de melding dat info te lezen is op aka.ms/wsl2
Vervolgens via de Microsoft Store naar Ubuntu gaan zoeken en geïnstalleerd.

Installatie doorgelopen, user aangemaakt.

Stap 5: Om te zorgen dat je Apache webserver bij je mySQL database kan komen, moet je beide dockers in hetzelfde netwerk draaien.

Je maakt dus eerst een netwerk aan:



docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 project-net
 


Stap 6: Kan ik de  MariaDB container draaiend krijgen?

Eerst even gekeken op de Docker hub: link.



docker run --detach -dp 3306:3306 --name some-mariadb --env MARIADB_USER=example-user --env MARIADB_PASSWORD=my_cool_secret --env MARIADB_ROOT_PASSWORD=my-secret-pw  mariadb:latest --network=project-net mariadb:10.3.34

docker inspect "containernaam" uitvoeren om in die rits met data het IP-adres op te vragen.

Stap 7: PHP draaiend krijgen. Nou ja, eigenlijk Apache met PHP.

Gezien de melding van MariaDB draait de boel op Ubuntu 20.04, weer even op de Docker hub kijken: link.

Dat werkt niet, als je die container start, stopt ie meteen ook weer.
Hierna naar php apache: link.

ubuntu-16.04 dan maar?



docker run --detach --name 'project_phpapache' --network=project-net -p 80:80 webdevops/php-apache:ubuntu-16.04
 

Hiermee krijg ik een werkende container.
Even kijken of ik een dirk.php werkend kan krijgen;


docker ps
-- hiermee zie je de actieve containers.

docker exec -it project_phpapache /bin/bash
-- dit is de moeilijke manier. in docker desktop kun je via het klikken op de container en dan in het tabblad Terminal hetzelfde doen

Bij dit image is je root de map /app
Dus hier: vi dirk.php en daar mijn php-code in zetten en opslaan: vervolgens kan ik op http://localhost/dirk.php de inhoud zien. Works!

Maar even later kom ik er achter dat er geen mySQL in dit image zit. Dus ik kan niet connecten met de database: 500 error, vage shit!

Bij bovenstaande heb je dus niet de juiste container te pakken, na wat zoeken op LAMP en Docker kom ik uit op de Docker Hub: link.



docker run --detach --name 'project_phpapache' --network=project-net -p 80:80 mattrayner/lamp:latest-1804-php7
 


Stap 8: Oké, hoe krijg ik mijn bestanden nu "in de container"?


docker ps

-- hiermee zie je het ID van de container

docker cp site/ 55cb0c6a7ac1:/app
-- hiermee kopieer je de map site met alles erin naar de docker-container, map /app

Dit werkt.

In dit geval werk ik met bolt en is de standaard-document-root niet de root, maar de submap "public". Ik moet dus wat knutselen met de instellingen van Apache:


- cd /etc/apache2/sites-available.
- vi 000-default.conf
- pas het pad aan: DocumentRoot /var/www/public
- service apache2 restart

-- in de map app/app/cache nog even een chmod -R 777 uitvoeren om schrijfrechten te geven.

Ik krijg nu de foutmelding dat er geen connectie met de database gemaakt kan worden.
Dat kan kloppen, want ik heb de database nog niet aangemaakt.

Stap 9: Kan ik vanuit de Apache-docker überhaupt connectie krijgen?


mysql -h172.17.0.1 -uroot -pmy-secret-pw
show databases;

Ja, dit werkt. Dus ik moet nu in mijn MariaDB-docker de database aanmaken.
Laat ik dat eerst doen. En ook meteen de gebruiker aanmaken en alle rechten geven, dan kan ik "overal" bij. Op productie niet gewenst, maar nu voor lokaal testen prima.



create database devdatabase;
create user 'gebruiker' IDENTIFIED BY 'goedwachtwoord';
GRANT ALL PRIVILEGES ON *.* TO 'gebruiker' WITH GRANT OPTION;
FLUSH PRIVILEGES;
 

Nu moet ik nog de export die ik eerder gemaakt heb importeren in deze database.
Niet heel moeilijk, want op de Apache-docker draait phpmyadmin, bereikbaar via http://localhost:80/phpmyadmin

Dus via /var/www/phpmyadmin het bestand config.inc.php aanpassen, waar nu bij de host "localhost" staat het IP-adres van de mariaDB-server invullen en opslaan.
En ja, in de browser kun je dan inloggen met jouw gebruiker of de "root" gebruiker met je eigen opgegeven wachtwoord.

Stap 10: Krijgen we beeld?

Ik krijg nog geen beeld, maar dat komt doordat je nog wat zaken moet tunen. Zo pas ik in /etc/apache2/apache2.conf het deel aan <Directory var/www>.
Daarin staat een  AllowOverride None, dat wordt een AllowOverride All

Dan werkt je .htaccess en gaat de routering allemaal goed. In mijn container draai ik nu de "oude site" en de "oude database" en ik krijg daar geen foutmelding.

Omdat ik Bolt bijwerk naar de meest up to date versie maak ik een nieuwe container, die laat ik op poort 90 draaien, zodat ik de 2 sites naast elkaar kan draaien:



docker run --detach --name 'project_new' --network=project-net -p 90:80 mattrayner/lamp:latest-1804-php7
 

Appendix: Wat was nu het SQL probleem?

Waarom ben ik hiermee gestart? Omdat er foutmeldingen ontstonden. Niet in mijn Docker-containers.

In phpmyadmin heb ik dit statement uitgevoerd:



SELECT @@sql_mode;
-- hiermee krijg je de huidige sql_mode terug. Die bevatte bij mij geen ONLY_FULL_GROUP_BY

SET GLOBAL sql_mode=(SELECT CONCAT(@@sql_mode, ',ONLY_FULL_GROUP_BY'));
 

Nadat ik het SET GLOBAL statement uitgevoerd had was het klaar: dezelfde foutmelding. Op deze site van mySQL kun je de verdere uitleg lezen: link.

Ik vind het wel goed dat die foutmelding nu gegeven wordt. Want als je in SQL Server van Microsoft werkt krijg je altijd deze foutmelding, zou je iets als dit proberen:



SELECT voornaam, achternaam FROM person GROUP BY achternaam
-- geeft een fout: voornaam zit niet in de GROUP BY
-- in BOLT werd het volgens mij gebruikt om aantallen te kunnen tonen
 

 

In ieder geval, werkende containers, kennis van Docker is uitgebreid en ik ga dit voor meer projecten/uitzoekklussen gebruiken!