Belangrijkste leerpunten
- Gebruik officiële Docker-images voor betere beveiliging en prestaties. Het bouwen van uw eigen afbeeldingen kan resulteren in een onjuiste configuratie en kost meer tijd.
- Gebruik specifieke versies van Docker-images om onvoorspelbaar gedrag en botsingen met afhankelijkheden te voorkomen. Trek en bouw met afbeeldingen van een specifieke versie.
- Scan Docker-images op beveiligingsproblemen met behulp van de docker-scanopdracht. Bepaal of een image veilig genoeg is voor uw toepassing.
Docker is de populairste containerisatiesoftware, maar niet iedereen maakt er efficiënt gebruik van. Als u de aanbevolen procedures van Docker niet volgt, kunt u uw apps kwetsbaar maken voor beveiligingsproblemen of prestatieproblemen.
Hier volgen enkele praktische tips die u kunt gebruiken om Docker-functies vindingrijk te gebruiken. Deze maatregelen verbeteren de beveiliging en zorgen ervoor dat u onderhoudbare Docker-bestanden maakt.
1. Gebruik officiële Docker-afbeeldingen
Wanneer u uw toepassing in containers plaatst, moet u een Docker-installatiekopie gebruiken. U kunt een image bouwen met aangepaste configuratie of de officiële Docker-images gebruiken.
Het bouwen van uw eigen images vereist dat u alle configuratie zelf afhandelt. Als u bijvoorbeeld een image voor een node.js-toepassing wilt bouwen, moet u node.js en de afhankelijkheden ervan downloaden. Het proces is tijdrovend en resulteert mogelijk niet in de juiste configuratie.
Docker raadt u aan een officiële node.js-image te gebruiken die wordt geleverd met alle juiste afhankelijkheden. Docker-images hebben betere beveiligingsmaatregelen, zijn licht van gewicht en worden getest voor verschillende omgevingen. De officiële afbeeldingen vind je op Officiële afbeeldingen van Docker bladzijde.
2. Gebruik specifieke versies van Docker Image
Wanneer u een officiële afbeelding ophaalt, is deze meestal degene met de nieuwste tag die de nieuwste bijgewerkte versie van die afbeelding vertegenwoordigt. Elke keer dat u een container bouwt op basis van die afbeelding, is het een andere versie van de laatste container.
Het bouwen met verschillende Docker-imageversies kan onvoorspelbaar gedrag in uw applicatie veroorzaken. De versies kunnen botsen met andere afhankelijkheden en er uiteindelijk voor zorgen dat uw app mislukt.
Docker raadt u aan om afbeeldingen van een specifieke versie op te halen en te bouwen. Officiële afbeeldingen bevatten ook documentatie en bestrijken de meest voorkomende gebruiksscenario's.
In plaats van bijvoorbeeld docker pull alpine, gebruik docker pull alpine: 3.18.3. Docker haalt die specifieke versie op. U kunt het vervolgens in opeenvolgende builds gebruiken, waardoor fouten in uw applicatie worden verminderd. Je kunt de specifieke versies van afbeeldingen vinden op de officiële Docker-afbeeldingspagina, onder Ondersteunde tags en respectieve Dockerfile-links:
3. Afbeeldingen scannen op beveiligingsproblemen
Hoe kunt u vaststellen dat een image waarmee u wilt bouwen geen beveiligingsproblemen vertoont? Door het te scannen. U kunt Docker-afbeeldingen scannen met de docker-scanopdracht. De syntaxis is als volgt:
docker scan [IMAGE]
U moet eerst inloggen bij docker om een afbeelding te scannen.
docker login
Scan vervolgens de specifieke afbeelding die u wilt controleren:
docker scan ubuntu: latest
Een hulpmiddel genaamd Synchroniseren scant de afbeelding en vermeldt eventuele kwetsbaarheden op basis van hun ernst. U kunt het type kwetsbaarheid zien en links naar informatie erover, inclusief hoe u deze kunt oplossen. Aan de scan kunt u zien of de afbeelding veilig genoeg is voor uw toepassing.
4. Gebruik kleine Docker-images
Wanneer u een Docker-image ophaalt, worden alle systeemhulpprogramma's meegeleverd. Hierdoor wordt de afbeeldingsgrootte vergroot met hulpmiddelen die u niet nodig hebt.
Grote Docker-images nemen opslagruimte in beslag en kunnen de runtime van containers vertragen. Ze hebben ook een grotere kans op beveiligingsproblemen.
Jij kan verklein de grootte van Docker-afbeeldingen met behulp van Alpine-afbeeldingen. Alpine-afbeeldingen zijn licht van gewicht en worden geleverd met alleen de benodigde hulpmiddelen. Ze verminderen de opslagruimte, waardoor uw applicatie sneller en efficiënter draait.
Voor de meeste officiële afbeeldingen vindt u een Alpine-versie op Docker. Hier is een voorbeeld van Alpine-versies voor PostgreSQL:
5. Optimaliseer het cachen van afbeeldingslagen
Elke opdracht in een Dockerfile vertegenwoordigt een laag op de afbeelding. De lagen hebben verschillende voorzieningen en vervullen verschillende functies. Als u naar de officiële afbeeldingen op Docker Hub kijkt, ziet u de instructies die zijn gebruikt om ze te maken.
Het Dockerbestand bevat alles wat u nodig hebt om de afbeelding te maken. Het is een van de redenen waarom velen ontwikkelaars geven de voorkeur aan Docker boven virtuele machines.
Hier is de structuur van een voorbeeld van een Alpine-afbeelding:
Wanneer u uw applicatie bouwt op basis van een afbeelding, voegt u meer lagen aan de afbeelding toe. Docker voert instructies uit op een Dockerbestand van boven naar beneden, en als een laag verandert, moet Docker volgende lagen opnieuw opbouwen.
De beste praktijk is om uw Dockerfile te rangschikken van de bestanden die het minst veranderen naar de bestanden die het vaakst veranderen. De instructies die niet veranderen, zoals de installatie, kunnen bovenaan het bestand staan.
Wanneer u een bestand wijzigt, bouwt Docker voort uit de gewijzigde bestanden en slaat de ongewijzigde bestanden erboven op in de cache. Daarom verloopt het proces sneller.
Kijk naar het voorbeeld in de afbeelding hierboven. Als er een wijziging is in de applicatiebestanden, bouwt Docker vanaf daar voort; het hoeft npm-pakketten niet opnieuw te installeren.
Als u vanaf de afbeelding bouwt, verloopt het proces sneller dan wanneer u alle andere lagen opnieuw opbouwt. Caching versnelt ook het ophalen en pushen van afbeeldingen uit Docker Hub.
7. Gebruik een .dockerignore-bestand
Wanneer u een afbeelding maakt met behulp van een Dockerfile, wilt u mogelijk bepaalde informatie privé houden. Sommige bestanden en mappen maken mogelijk deel uit van het project, maar u wilt deze niet opnemen in het bouwproces.
Het gebruik van een .dockerignore-bestand verkleint de afbeeldingsgrootte aanzienlijk. Dit komt omdat het bouwproces alleen de benodigde bestanden omvat. Het helpt ook om bestanden privé te houden en te voorkomen dat geheime sleutels of wachtwoorden openbaar worden gemaakt.
Het .dockerignore-bestand is een bestand dat u in dezelfde map maakt als uw Dockerfile. Het is een tekstbestand, net als een .gitignore-bestand, dat de namen bevat van alle bestanden die u niet in het bouwproces wilt opnemen.
Hier is een voorbeeld:
8. Gebruik het principe van de minst bevoorrechte gebruiker
Standaard gebruikt Docker de rootgebruiker als beheerder voor toestemming om opdrachten uit te voeren, maar dit is een slechte gewoonte. Als er een kwetsbaarheid in een van de containers zit, kunnen hackers toegang krijgen tot de Docker-host.
Om dit scenario te voorkomen, maakt u een speciale gebruiker en groep. U kunt de vereiste machtigingen voor de groep instellen om gevoelige informatie te beveiligen. Als een gebruiker gecompromitteerd raakt, kunt u deze verwijderen zonder het hele project bloot te leggen.
Hier is een voorbeeld dat laat zien hoe u een gebruiker maakt en de rechten ervan instelt:
In sommige basisimages zijn pseudo-gebruikers aangemaakt. U kunt de geïnstalleerde gebruikers gebruiken in plaats van de rootgebruikersrechten.
Waarom u de best practices van Docker zou moeten toepassen
Best practices zijn een goede manier om kwetsbaarheden te verminderen en schonere code te schrijven. Er zijn veel best practices die u kunt toepassen op elke Docker-functie die u gebruikt.
Een goed georganiseerd project maakt het synchroniseren eenvoudiger met andere orkestratietools zoals Kubernetes. U kunt beginnen met de programma's die in het artikel worden beschreven en er meer overnemen naarmate u Docker leert.