Logo
June 12, 2020
Door Paul Hachmang
Docker

Magento 2 Docker - Gedeelde bestandstoegang voor developer en virtual machine

Bij Reach Digital richten we ons altijd op het zo snel en efficiënt mogelijk kunnen ontwikkelen van stabiele code. Om efficiënt te kunnen werken, maken we gebruik van gevirtualiseerde ontwikkelomgevingen (virtual machines). Met gevirtualiseerde ontwikkelomgevingen kan voor elke klant een eigen unieke Ubuntu omgeving draaien op macOS. Deze omgeving is gelijk is aan de live omgeving. Wanneer de developer de code test in de gevirtualiseerde omgeving, kan hij er dus vanuit gaan dat deze exact hetzelfde functioneert en presteert (qua performance) als op de live omgeving. Dit biedt de mogelijkheid om bugs lokaal (in macOS) te reproduceren en vervolgens te fixen.

Geïnteresseerd in onze oplossing? Onze Magento 2 Docker ontwikkelomgeving met mogelijkheid tot lokale bestandstoegang (PHP bestanden) is beschikbaar op Github: https://github.com/ho-nl/docker-development-box

Vagrant om Magento virtual machines te beheren

Om lokaal te kunnen ontwikkelen in een gevirtualiseerde omgeving hebben we de afgelopen jaren gebruik gemaakt van Vagrant. Met Vagrant kunnen we eenvoudig een nieuwe virtual machine opzetten op basis van bestaande kant-en-klare images. In ons geval maakten we gebruik van een Byte Hypernode Ubuntu image als basis voor deze omgevingen. Om deze Ubuntu virtual machine specifiek naar onze wensen en per klant te kunnen configureren, hebben we eigen tooling geschreven (zie https://github.com/ho-nl/vagrant-development-box).

Een developer kan, na configuratie van het project, de virtual machine starten door vagrant up te draaien, wat resulteert in een werkende PHP-, MySQL-, Redis- en Nginx omgeving. De developer kan vervolgens lokaal werken aan het project en via versiebeheer (git) nieuwe ontwikkelingen en/of bugfixes volledig geautomatiseerd uitrollen op de testomgeving en productieomgeving.

Limitaties van Vagrant

Door de jaren heen zijn we met Vagrant tegen een aantal limitaties aangelopen, namelijk:

  • De onderliggende Byte Hypernode Ubuntu image wordt niet meer bijgewerkt, waardoor we op een bepaald moment een eigen image zullen moeten gaan onderhouden.
  • Het is complex om op een goede manier Varnish te configureren.
  • Het is complex om Elasticsearch te installeren en te onderhouden.
  • https en http/2 kan zonder veel complexe configuratie niet worden gebruikt.
  • Vagrant is niet cloud-ready, alles draait op één virtual machine.

Docker als devbox voor Magento

Een alternatief voor Vagrant is Docker. Het principe van Docker is hetzelfde als dat van Vagrant, namelijk een gevirtualiseerde ontwikkelomgeving waarbinnen services zoals PHP, MySQL of Elastic Search draaien. Echter, met Docker kunnen al deze individuele services in een eigen ‘container’ draaien. In plaats van één image met Ubuntu omgeving zoals bij Vagrant, kunnen we in het geval van Docker individuele containers downloaden en het geheel als lokale ontwikkelomgeving gebruiken. De services die we voor Magento nodig hebben en waarvoor dus losse containers te downloaden zijn:

  • MySQL
  • PHP
  • Nginx
  • Varnish
  • Mailhog
  • Elastic Search
  • RabbitMQ
  • Sphinx
  • etc.

Na een aantal jaar met Vagrant gewerkt te hebben, stappen we over naar Docker, omdat het werken met deze losse containers veel flexibiliteit biedt. We kunnen eenvoudig services upgraden naar een nieuwe versie, of voor specifiek één project een oude versie draaien.

Daarnaast gebruikt virtualisatie met Docker veel minder opslag en geheugen. We draaien geen volledige Ubuntu installatie, maar slechts een superkleine Alpine Linux distributie. In rust gebruikt Nginx maar 6 MB aan geheugen.

De performance bottleneck van Virtual Machines

Werken met een Virtual Machine heeft in zijn algemeenheid een belangrijke performance limitatie. Een developer moet namelijk lokaal (in macOS) toegang hebben tot de codebase om bewerkingen te kunnen doen. Om pagina’s snel te kunnen renderen, heeft de webserver toegang nodig tot diezelfde bestanden, maar binnen de scope van de gevirtualiseerde omgeving.

Na elke wijziging die een developer maakt aan de code, moet deze worden gesynchroniseerd met (als het ware ‘geüpload’ naar) de virtual machine. Hiervoor hebben we tijdens het gebruiken van Vagrant, Unison en Mutagen gebruikt. Dit zijn tools die continu de twee omgevingen (lokaal bestand en bestand in Vagrant) vergelijken en voor data-duplicatie zorgen. Dit werkt redelijk, maar doordat deze tools continu aan het scannen zijn, krijgt de computer het zwaar: de processor is continu druk bezig, het kost veel geheugen en de ssd is druk. Hierdoor moeten developers bij grote bewerkingen wachten tot synchronisatie voltooid is.

Gedeelde bestandstoegang voor developer en virtual machine

De overstap van Vagrant op Docker triggerde ons om opnieuw na te denken over deze performance limitatie, wat resulteerde in de volgende oplossing: https://github.com/ho-nl/docker-development-box.

We draaien de belangrijkste service, PHP, lokaal in macOS en niet binnen de virtual machine. Hierdoor heeft PHP razendsnelle bestandstoegang en is de synchronisatie van PHP-bestanden tussen virtuele omgeving en lokaal niet meer nodig. Dit laatste maakt het gebruik van Unison of Mutagen overbodig, wat veel minder belasting voor de CPU betekent.

Een bijkomend voordeel is omdat we PHP via Brew installeren, we eenvoudig kunnen switchen tussen verschillende PHP versies. Dit is handig, omdat er bij verschillende klanten nog gebruik wordt gemaakt van oudere versies van PHP (bijvoorbeeld bij overgenomen projecten).

Toekomst

Bij Reach Digital zijn we blij dat we zijn overgestapt op de Docker gevirtualiseerde ontwikkelomgeving. De komende jaren zullen we dan ook veel met Docker blijven werken. De tooling die we hebben geschreven om de performance bottleneck op te lossen is open source, zodat de community er vrij gebruik van kan maken. We vind het erg leuk om reacties vanuit de community te krijgen, dus maak je gebruik van onze oplossing? Laat het ons weten! Natuurlijk zijn vragen of suggesties ter verbetering ook altijd welkom.

June 12, 2020
Door Paul Hachmang

Op zoek naar een Magento webshop specialist?

We komen graag met je in gesprek. Direct een Magento webshop project opstarten?