Synology en Docker: Veel met weinig
Heb je een Synology NAS en wil je er iets meer mee doen dan alleen bestanden opslaan? Met Docker kan je van alles op het apparaat laten draaien!
Heb je een Synology NAS, wil je er iets meer mee doen dan het apparaat alleen als file-storage te gebruiken? Natuurlijk kan dit, maar hoe? In deze blogpost leg ik uit wat je met een oplossing als Docker kan bereiken met je NAS.
Synology
Vanaf versie 5.2 is er een officiële package beschikbaar in het package-center van je Synology beheerdersomgeving, genaamd Docker. Daarover straks meer. Je kunt de package simpelweg installeren en zodra dit gebeurt is, krijg je er een extra 'app' icoon bij in het menu linksboven van je beheerdersinterface met het welbekende Docker logo. Wanneer je hier op klikt, kun je van de grafische interface van Docker gebruik maken, wat zo af en toe zijn voordelen heeft. Als je snel een nieuwe Docker instantie, ook wel 'container' genoemd, wilt opstarten, is het misschien wel handig als je er ook voor zorgt dat je Synology via Telnet of SSH benaderbaar is. Dit kun je instellen in de configuratie center van Synology.
Ik zelf gebruik Putty en je voelt het misschien ook al aankomen, wanneer je hier echt verder mee wilt, ga ik er in dit blog bericht van uit dat je wel een beetje bekend bent met de algemene dingen zoals het werken in een terminal scherm en/of bash commando's kent. Maar goed, met een beetje Googlen kom je er ook wel uiteindelijk.
Wanneer je dus Docker hebt geïnstalleerd als Package en eventueel SSH hebt aangezet en Putty gebruikt, kun je aan de slag met Docker.
Docker
Docker is een lichtgewicht virtualisatie platform wat het enorm gemakkelijk maakt om snel verschillende applicaties het levenslicht te laten zien. En het leukste van dit alles is dat elke applicatie in zijn eigen omgeving draait. Dat brengt als grote voordeel dat je dus makkelijk gescheiden virtuele omgevingen naast elkaar kunt laten draaien en dat wanneer je er 1 kapot maakt of er gebeurt iets mee, niet direct alle anderen ook op hun gat liggen. Sterker nog, je kunt ze gewoon even uitzetten wanneer dit nodig is.
Zo heb ik dus bijvoorbeeld een Docker container draaien waar alleen een MYSQL server in zit. En gelukkig, maar dat is dus echt het sterke van Docker, kan ik deze deels naar buiten (binnen het Docker ecosysteem) beschikbaar stellen voor andere containers.
Ik heb dus een container met MYSQL draaien, maar ook een container met phpMyAdmin, die ik met elkaar heb verbonden. Super handig, ik heb de grafische interface en het gemak van phpMyAdmin, maar kan ook zo even dat gedeelte offline gooien, zonder dat de hele MYSQL server plat ligt. Dus de rest kan gewoon doorgaan terwijl ik alleen de bovenliggende interface heb plat gegooid.
Als je dit principe nog wat verder doortrekt, zou je dus bijvoorbeeld een CMS van jouw keuze in een eigen container kunnen draaien, die verbonden is met de MYSQL container. En nog een CMS, en nog een ander platform.
Zo heb ik dus zelf nu een MYSQL container draaiend, verbonden met phpMyAdmin, en dit Ghost blog draaien. Daarnaast staat nog een Nginx proxy, ook in zijn eigen container, die automatisch kijkt naar het starten en stoppen van containers. Zodra er een container start, wordt deze opgepikt door de Nginx proxy, en met behulp van container instellingen op basis van environment variabelen, heb ik deze dus toegewezen aan mijn domein timhuesken.nl op een eigen poort.
Mijn Nginx proxy zit dus op poort 80 te luisteren, en als er iemand naar timhuesken.nl wil gaan, wordt dit opgevangen en intern naar mijn Ghost blog container doorgezet, welke binnen Docker op poort 84 aanspreekbaar is. De Ghost container zelf routeert dan weer dit verkeer naar poort 2386, waar Ghost zelf standaard op luistert.
Docker & Synology & websites
Er is 1 klein narigheidje in deze combinatie van opties, en dat is het feit dat Synology als software systeem zelf, poort 80 op een gruwelijk, platte manier voor zichzelf claimt. Het is wel aan te passen, maar bij elke update van het Synology software pakket, kun je dat dan weer gaan aanpassen in de httpd.conf. Zie hier hoe je dat zou kunnen doen (vanaf DSM 5.x is het zelfs httpd-user.conf).
Dus ik dacht, ik doe het eenvoudiger. Gelukkig heb ik ook nog een router die voor mijn server zit.
Ik heb een Nginx proxy in Docker aangemaakt, die op externe poort 8080 luistert, en op mijn router ingesteld dat poort 80 doorgestuurd wordt naar poort 8080. Veel persistenter dan iedere keer de httpd.conf weer aanpassen.
Dus poort 80 van buitenaf gaat naar 8080, waar mijn nginx proxy zit en deze verdeeld vervolgens al het verkeer weer naast de verschillende containers, zoals Joomla, Drupal, Wordpress, Ghost, phpMyAdmin, of zelfs een mediawiki instantie. Zelfs die draait lekker op mijn Synology servertje.
Super simpel en super efficiënt!
Aanpassen bestanden binnen CMS-omgevingen
Nu kun je veelal de meeste zaken bij CMS-systemen gewoon via de webbased administrator pagina inrichten en aanpassen, maar stel nu dat je gewoon bij de bestanden moet kunnen. Om bijvoorbeeld een thema aan te passen qua css-styling of andere zaken. Misschien een plugin uploaden om die daarna te kunnen aanzetten. Wat dan?
Gelukkig kun je verbinding leggen met je containers binnen Docker. Dit kan via de terminal, maar ik vond het zelf nogal omslachtig om heel eerlijk te zijn. Ik wil gewoon even op mijn Synology in een foldertje iets kunnen dumpen, en niet een connectie moeten maken binnen Docker containers en dan enigzins omslachtig bestanden gaan overzetten.
Gelukkig hebben de makers van Docker daarover nagedacht. Je kunt namelijk gewoon de interne volumes van je container, delen met de host. Je stelt bij de omgevingsvariabelen van je Docker container gewoon in (voorbeeld via SSH terminal) dat je de folders buiten de docker container op je eigen synology file-storage wilt linken aan de folders binnen de docker container:
-v /jouw eigen host folders:/folders binnen container
Nu is er gewoon een symlink gelegd tussen de container volumes in kwestie, en het host systeem.
Hoppa, hoe makkelijk kan het zijn? Veel met weinig! Mijn server heeft 2Gb geheugen en een dual core Celeron cpu, maar de footprint van dit alles is niet meer dan 500 mb, en dan draai ik dus een Nginx proxy, MYSQL server, phpMyAdmin, Drupal, Wordpress, Joomla, Ghost blog en Mediawiki omgeving/container.
Ja, bij veel bezoek zal dit wel gaan toenemen, maar dat zien we dan wel weer. Mijn uitdaging zit em meer in het feit dat Synology zelf niet meer dan 30 concurrent connections toestaat haha.
Happy
Ik ben dan ook helemaal in mijn nopjes met deze oplossing. Ik moet alleen uitkijken dat ik mijn arme Synology servertje binnenkort niet helemaal gek maak met al die containers die weer wat CPU en RAM kosten haha. Gelukkig kan ik ze gewoon tijdelijk uitzetten, alsof er niets aan de hand is, zonder dataverlies! En dit alles dankzij persistente folders met de host via symlink, en het apart hebben van een MYSQL container voor de databases.
Het enige waar ik op dit moment niet helemaal happy mee ben, maar dat is niet Docker of Synology gerelateerd, is het onhandige systeem van Ghost voor wat betreft permanente URLs. Als je een aanpassing wilt doen, moet je handmatig redirects gaan aanmaken, en daar heb ik geen trek in haha. Dat zou mooi zijn als ik dat nog op weet te lossen.
In detail
Allemaal leuk en aardig dit verhaal hierboven, maar hoe nu daadwerkelijk van A tot Z opzetten van zo'n Docker container structuur als ik hierboven beschrijf? Ik zal dit in een serie gaan bespreken, waar ik hopelijk elke week een moment vind om weer een container te bespreken.
Binnenkort zal ik proberen in detail te beschrijven hoe je start (met screenshots en uitleg) op de eigen Synology en je thuisnetwerk zo instelt dat je kunt gaan starten met Docker.
Ik heb een poging gewaagd om dit in detail uit te leggen: Zelf een eigen blog hosten met Synology