Wat is Docker's BuildKit en waarom is het belangrijk?

0
161

Docker BuildKit is een opt-in-engine voor het maken van afbeeldingen die substantiële verbeteringen biedt ten opzichte van het traditionele proces. BuildKit maakt parallelle afbeeldingslagen, waardoor het algehele bouwproces wordt versneld.

Wat is BuildKit?

BuildKit is ontwikkeld als onderdeel van het Moby-project, een Docker-inspanning om 'gespecialiseerde containersystemen te assembleren zonder het wiel opnieuw uit te vinden'. Het werd aangekondigd in 2017 en werd geleverd met Docker Engine in versie 18.09 van 2018.

BuildKit richt zich op het verbeteren van de buildprestaties, opslagbeheer en uitbreidbaarheid. De hoofdclaims zijn parallelle verwerking, meer geavanceerde caching, een pluggable architectuur en automatische garbagecollection. Deze combineren tot een bouwsysteem dat efficiënter en uitbreidbaarder is dan de originele motor.

Lagen die elkaar niet beïnvloeden, kunnen tegelijkertijd worden gebouwd, waardoor de wachttijden voor het voltooien van fasen worden verkort. BuildKit optimaliseert ook de toegang tot de lokale bestanden waarnaar u verwijst met COPY-instructies. Het houdt de wijzigingen bij die u aanbrengt en kopieert alleen bestanden die zijn gewijzigd sinds de laatste build, in plaats van de volledige build-context over te dragen.

BuildKit vereenvoudigt ook builds voor meerdere platforms. U kunt de vlag –platform opgeven om doelen op te geven waarvoor u wilt bouwen. BuildKit zal automatisch een geschikt afbeeldingsmanifest samenstellen om alle gespecificeerde architecturen te dekken.

docker buildx –create –platform linux/amd64,linux/arm64 .

Hoe werkt BuildKit?

De prestatieverbeteringen van BuildKit worden mogelijk gemaakt door het gebruik van een low-level builddefinitieformaat, genaamd LLB. Het is een op grafieken gebaseerd binair formaat dat complexe builddefinities aan elkaar koppelt.

Advertentie

Omdat lagen direct gekoppeld zijn, maakt BuildKit een snellere vergelijking mogelijk van buildgrafieken en de inhoud die ze bevatten. De standaard Dockerfile-builder moet vertrouwen op onnauwkeurige heuristieken om te bepalen of twee afbeeldingen vergelijkbaar zijn.

De LLB staat volledig los van de BuildKit “frontend.” De frontend neemt een door mensen leesbare weergave van een afbeelding, zoals een Dockerfile, en zet deze om in een LLB-grafiek. Zodra een LLB is gegenereerd, kan deze worden geëxporteerd en tussen omgevingen worden verplaatst. Door te exporteren naar een register kunnen frontend-clients een bestaande LLB verwerven om de prestaties van de eerste build verder te verbeteren.

De technische details van de LLB zijn vrij complex. De onderliggende technologie is gebaseerd op grafentheorie en checksumvergelijking. U hoeft het niet te begrijpen om te profiteren van zijn kracht: als eindgebruiker bouwt u werk op dezelfde manier als altijd, met de opdracht docker build.

BuildKit maakt nog steeds OCI-compatibele afbeeldingen die overdraagbaar zijn in verschillende containeromgevingen. U kunt BuildKit gebruiken om elke Docker-afbeelding met een Linux-basis te maken. Windows-images worden momenteel niet ondersteund.

BuildKit-ondersteuning activeren

Er zijn twee manieren om BuildKit in te schakelen. Als u een enkele afbeelding met de functie wilt bouwen, stelt u de omgevingsvariabele DOCKER_BUILDKIT in uw shell in:

DOCKER_BUILDKIT=1 docker build . Advertentie

Voor langdurig gebruik, configureer de Docker-daemon om standaard BuildKit te gebruiken. Maak of bewerk het bestand /etc/docker/daemon.json en voeg de volgende inhoud toe aan het configuratieobject op het hoogste niveau:

{ "features": { "buildkit": true } }

Herlaad de daemon-configuratie om de wijziging toe te passen:

systemctl reload docker

BuildKit wordt nu gebruikt in plaats van de standaard build-engine wanneer u voer de opdracht docker build uit.

U kunt zien wanneer BuildKit actief is, omdat het een andere CLI-uitvoer produceert dan de reguliere engine. De voortgangsweergave van BuildKit biedt verbeterde leesbaarheid en duidelijke visualisatie van wanneer elke fase begint en is voltooid. De informatie bevat een overzicht van de tijd die nodig is om elke laag te bouwen.

“docker buildx”

U kunt ook communiceren met BuildKit via docker buildx-opdrachten. Deze zullen altijd BuildKit gebruiken. De dockerx-opdrachtgroep onthult geavanceerde BuildKit-functionaliteit, inclusief de mogelijkheid om op een externe host te bouwen.

Een enkele BuildKit-client kan communiceren met verschillende afzonderlijke image builder-instanties. Dit vergemakkelijkt multi-platform builds doordat u een builder kunt toevoegen voor elke architectuur waarop u zich richt.

Hier is een voorbeeld van het toevoegen van een externe host als een BuildKit-doel. Dit veronderstelt dat de doelmachine een Docker-socket heeft die zichtbaar is op TCP-poort 2375. U kunt naar de host verwijzen met behulp van een Docker-eindpunt-ID of de naam van een Docker-context (verkregen uit docker-context ls). Met dit laatste kun je bouwen op compatibele cloudomgevingen door ze als context toe te voegen.

docker buildx create –name remote-builder tcp://my-docker-host:2375 Advertentie

U kunt de bouwer selecteren die u wilt gebruiken met de opdracht docker buildx use:

docker buildx use remote- builder

Vervolgens kunt u het build-commando gebruiken om uw image op de geselecteerde builder-instantie te bouwen:

docker buildx build .

U kunt bouwerinstanties verwijderen met behulp van docker buildx rm, waarbij u de naam van de bouwer doorgeeft. Bouwers worden weergegeven met behulp van docker buildx ls; je kunt docker buildx inspect gebruiken om meer gedetailleerde informatie over een specifieke builder te krijgen.

Als je het schijfgebruik van BuildKit wilt controleren, voer je de opdracht docker buildx du uit. U kunt de buildcache wissen om opslagruimte vrij te maken met docker buildx prune. Dit kan de prestaties verminderen de volgende keer dat u uw afbeelding opnieuw opbouwt, omdat lagen die eerder in het cachegeheugen waren opgeslagen, opnieuw worden opgebouwd.

Build-functies

BuildKit voegt een aantal extra build- tijdfuncties om uw Dockerfile-stappen te vereenvoudigen.

U kunt geheime gegevens doorgeven met de vlag –secret. Hierdoor heeft uw Dockerfile toegang tot gevoelige waarden zonder ze in de afbeelding op te slaan. De waarde is alleen beschikbaar tijdens het bouwen.

docker build –secret id=demo-secret,src=demo-secret.txt . FROM my-image:latest RUN –mount=type=secret,id=demo-secret cat /run/secrets/demo-secrets Advertentie

Deze Dockerfile verwijst naar een geheim genaamd demo-secret. De waarde wordt uit het bestand demo-secret.txt gelezen wanneer u docker build uitvoert. De RUN-instructie met de –mount-vlag geeft toegang tot het geheim. Het bestand wordt tijdelijk aangekoppeld in de directory /run/secrets.

BuildKit laat je ook de SSH-agent van je host doorsturen, zodat je bouwinstructies kunnen communiceren met bestaande externe verbindingen. Geef de –ssh vlag door aan docker build en voeg –mount=type=ssh toe aan RUN instructies in je Dockerfile:

docker build –ssh . RUN –mount=type=ssh git clone git@example.com:/project.git

Deze functies maken het maken van afbeeldingen gemakkelijker zonder de algehele beveiliging te beïnvloeden. SSH-agent doorsturen en geheime koppelingen zijn alleen beschikbaar in BuildKit; er is geen tegenhanger in de standaard build-engine.

Conclusie

BuildKit is de volgende generatie Docker-imagebuilder die een grafisch binair formaat gebruikt om drastisch bouwen versnellen. Hoewel de prestaties voor elk Dockerfile aanzienlijk zullen verschillen, kunt u aanzienlijke versnellingen verwachten in gevallen waarin parallelle verwerking van afbeeldingslagen mogelijk is.

BuildKit’s architectuur optimaliseert enkele van de nieuwste Dockerfile-functies. Multi-stage builds profiteren van het overslaan van ongebruikte fasen, wat het proces efficiënter maakt dan de standaard builder.

Hoewel BuildKit nu stabiel is, wordt Docker er nog steeds niet standaard mee geleverd. Zorg ervoor dat u het in uw Docker-client inschakelt als u de functies ervan wilt gebruiken. Er is een actief voorstel om van BuildKit de standaard build-engine te maken, maar er zijn nog steeds onopgeloste problemen die de overstap verhinderen.