CAPSLOCK2000 schreef op donderdag 9 augustus 2018 @ 18:14:
Het eerste probleem is dat heel veel mensen kant-en-klare docker-images gebruiken die ze van hun leverancier krijgen. Helaas zitten die typisch vol verouderde software omdat de leverancier alleen update als z'n eigen software dat nodig heeft. In plaats van twee keer per week een nieuw image te bouwen en daarin alle dependencies bijwerken. Het is minder hard nodig als je met goede base-images werkt, maar ik zie het vaker fout dan goed gaan.
Dan adviseer ik je om eens naar Red Hat, SUSE, Debian, FreeBSD, OpenBSD, etc. te gaan kijken. Geen van allen hebben actuele software in hun standaard versies omwille van security. Wat ze wel hebben is oude software die door en door is getest en waar heel wat patches overheen zijn gegaan. Voor heel veel bedrijven is dit model juist de reden waarom ze die software gebruiken
Het is dus pertinent onjuist om te roepen dat verouderde software onveilig is. Dat is het alleen wanneer het niet goed wordt onderhouden. En laat dat nou ook opgaan voor hele actuele software. Het is namelijk niet de leeftijd dat iets veilig of onveilig maakt, maar de mate van onderhoud en het soort onderhoud wat men er aan pleegt. Dit geldt niet alleen voor containers maar voor alle soorten software. Dit zie je inderdaad vaak misgaan en daarbij maakt het dan ook geen drol uit of dit nou software is dat in een container of native draait.
Daarbij komt dat in veel gevallen men juist containers (en dat is niet per definitie Docker!) gebruikt om een bepaalde mate van scheiding aan te brengen. Dan worden containers juist gebruikt voor security omdat je er bijv. heel wat aan tools omheen kunt zetten om het veilig te houden. Bij FreeBSD is het zelfs dit zelfs de hoofdreden waarom ze daar überhaupt iets als containerisatie hebben (lees: jails).
Tot slot snijdt je hier ook een dilemma aan: ga je voor software waarvan de leverancier daar garantie en een SLA op levert qua werking of niet? In dat laatste geval betekent het in 99,99% van de gevallen dat je alleen de software geleverd krijgt en je het verder allemaal zelf mag uitzoeken (installatie, support, etc.).
Voor containers geldt hier exact hetzelfde als voor native software en in feite voor alle soorten software: haal ze bij een betrouwbare bron vandaan, zorg dat ze signed zijn (en check dat ook) en kijk wat ze doen alvorens je er gebruik van gaat maken. Dat betekent dat je dingen als nginx, jenkins, etc. gewoon bij de makers van de software moet halen. Wil je er meer dingen bij hebben, bouw dan je eigen image en doe dat op basis van een image met goede reputatie. Zet dan ook security scan tools in zoals CoreOS Clair zodat je tijdens het bouwen of bij het pushen naar je registry kunt checken of de security op orde is (en met de juiste tooling kun je ook meteen voorkomen dat onveilige images worden gepusht/pullt of zelfs gebouwd).
Het tweede probleem is dat om een Docker te updaten je het hele image opnieuw moet bouwen, dan de oude container uitschakelen, de nieuwe starten, testen, en hopen dat alles goed is gegaan.
En zie daar het probleem: "hopen dat alles goed is gegaan". Dat is exact hoe heel veel upgrades gaan en ook hier maakt het weer totaal niet uit of dit nou software in een container is of native. Bij upgrades zie je dat er vaak weinig wordt getest, er geen plan b is en al helemaal geen rollback optie wordt bedacht. Docker of native lost dit probleem niet voor je op, daar zul je toch echt zelf wat voor moeten gaan bedenken. Containers kunnen je hier wel bij helpen omdat je vrij snel even een container aan kunt slingeren en er wat tests tegenaan kunt gooien. Dat gaat wat makkelijker dan wanneer je een complete omgeving moet gaan optuigen.
Als je zo groot bent als Google dan bouw je daar uiteraard een hele CI/CD omgeving voor die automatisch images bouwt, test en aan de loadbalancer toevoegd, of zo iets. Als je kleiner bent is het echter (te) veel infrastructuur om te behappen.
Dit is gewoon een gevalletje overdrijven tot kunst verheffen. Zo spannend is zo'n CI/CD omgeving niet en zo'n loadbalancer ook niet. Er zijn legio tutorials hierover te vinden waar je vrij snel doorheen loopt.
Dus wordt er maar een slag naar geslagen. In mijn thuissituatie, om nog wat kleiner te gaan, duurt het bouwen van zo'n image al snel 10 minuten. Een beetje aanklooien om eens wat te testen zit er dan niet meer in.
Dat is nietszeggend. Het is maar net wat je bouwt en hoe je het bouwt. Waar men echter veelal op aandringt is het zo klein en zo plat mogelijk houden van je images. Dat zorgt er niet alleen voor dat ze snel worden gebouwd maar ook dat je ze snel kunt uitrollen. Security checks zoals middels CoreOS Clair zijn dan ook sneller klaar. Ook dit levert een bijdrage aan een veiligere container.
Het beheer van resources (geheugen, cpu, disk, netwerk) kun en moet je op al verschillende niveau's doen. Viritualisatie- en container-software heeft sowieso 90% overlap met wat het OS doet op procesniveau*. Processen schedulen, resources beheren, toegangscontrole, etc.. De overeenkomsten zijn groter dan de verschillen.
Laat dat nou net allemaal zaken zijn waar het nou juist helemaal niet om gaat. De computing power is nu op een dusdanig niveau dat we niet kieskeurig hoeven te zijn. Die extra beetjes overhead van zaken als virtualisatie en containerisatie valleen in het niet bij het gemak wat je op beheer en develop gebied terugkrijgt. Dat wil niet zeggen dat men helemaal niets meer optimaliseert, dat gebeurd nog steeds.
* je kan nog een stap dieper gaan. Applicaties denken nog steeds dat ze het enige stuk software op de hardware zijn en weten niet dat er ook nog een OS is. Het hele idee van een OS en losse processen is al een vorm van compartimentalisatie.
Of nog dieper met iets als Amazon Lambda waar je alleen maar een script draait. Amazon regelt de rest voor je.
Dat laatste is bij Amazon, Microsoft, Google, IBM, enz. nou juist het idee: jij doet een bepaald deel, zij doen de rest.
TL;DR: wat je hier roept heeft niets met Docker te maken omdat het voor alle soorten software opgaat.