Als je wel eens een container op ons containerplatform hebt gebruikt, dan ben je wel bekend met het concept. Je kiest een bestaand container image, en vervolgens kies je hoeveel resources die moet krijgen. Daarna moet je je eigen bestanden uploaden om je applicatie live te zetten. Maar wist je dat het ook mogelijk is om een eigen container image maken? Dat klinkt heel ingewikkeld; maar het kan heel simpel zijn. In deze blog leg je dat verder uit.
Een image is een blauwdruk van een kant-en-klare container, welke je kunt gebruiken om een nieuwe container mee aan te maken. WordPress is hier een goed voorbeeld van; op de container image van WordPress staat al een WordPress installatie, die nadat je een container besteld hebt geactiveerd worden.
Een image komt op zijn beurt weer voort uit een Dockerfile. Een Dockerfile is een bestandje waarin staat hoe een image is opgebouwd. Om het even iets simpeler te maken: vergelijk het met het maken van een pizza. Een image is dan de pizza, en het Dockerfile is het recept om de pizza te maken. Je hoeft dan alleen zelf het recept te bedenken, je computer doet de bereiding ;).
Het klinkt nog steeds ingewikkeld; maar wat die Dockerfile heel krachtig maakt, is dat je een bestaand image kunt specificeren, en daar je eigen aanpassingen op kunt doen. Zo'n Dockerfile hoeft dus maar een paar kleine regeltjes te zijn.
Om het eerdere synoniem er bij te pakken als voorbeeld; neem het recept voor Pizza Margarita, voeg plakjes salami toe, en je hebt een andere pizza. Zo zijn er ook images met alleen een besturingssysteem, dus dan heb je alleen het recept voor het pizzadeeg. Je moet de rest zelf nog opbouwen.
Excuus als je nu trek hebt in pizza. Dan nu de techniek in; hoe ziet een Dockerfile er eigenlijk uit? Ik heb hieronder een klein voorbeeldje staan.
FROM php:8.1-apache
RUN echo "Hallo wereld!" > /var/www/html/index.php
RUN apt update
RUN apt -y install vim
In het bovenstaande voorbeeld, neem je het PHP-image met versie 8.1 als basis van hub.docker.com. Vervolgens worden er twee commando's uitgevoerd; het bovenstaande commando zet de tekst 'Hallo wereld' in de index van de website, en het onderste commando installeert een tool genaamd Vim. Zo is het heel makkelijk om een image wat niet aan je wensen voldoet aan te passen, of om je applicatie snel te kunnen deployen.
Je hebt een aantal dingen nodig op je computer; allereerst een teksteditor zoals bijvoorbeeld Sublime Text, en daarnaast een installatie van Docker. Via docker.com kun je Docker installeren: https://www.docker.com/
Maak als eerste een mapje aan op je computer, en geef die een naam (zoals 'Docker image' bijvoorbeeld). Open je tekstverwerker, en maak daar een nieuw bestand aan met de naam Dockerfile. Sla deze op in het mapje wat je net hebt aangemaakt. Het zou er nu zo uit moeten zien.
Nu gaan we het image bouwen met het 'docker build' commando. Om de pizza er weer even bij te pakken als metafoor; hij gaat nu de oven in.
Voer het bouwen van je image uit met het commando.
docker build -t <naam van image> <locatie van dockerfile>
Dus in mijn geval;
docker build -t mijnimage .
De . staat voor; de map die nu in de terminal geopend is. Hier kun je ook de naam van het mapje invullen waar je de Dockerfile in gestopt hebt.
Vervolgens kun je jouw PHP-image opstarten met het volgende commando, om even te testen
docker run -it -p 8080:80 --rm mijnimage
Als je nu naar 'http://localhost:8080' gaat, zul je als het goed is het volgende zien:
Om de container te stoppen, kun je de toetsencombinatie 'Control' + 'C' gebruiken.
Oké, nu heb je een Docker container gemaakt die op jouw computer draait, de vervolgstap is om hem op ons containerplatform te publiceren. Dit gaat in de volgende 3 stappen:
Allereerst moet je het image uploaden naar een container registry. Een registry is zoals de naam al een beetje zegt een bibliotheek die verschillende container images bevat. Om je container te gebruiken op het containerplatform, moet je image in zo'n registry staan. De standaard registry is 'hub.docker.com'; hier komt ook het PHP-image vandaan waar ik het voorbeeld op gebaseerd heb.
Die registry is echter publiek; alles wat je er in zet, is door iedereen zichtbaar. Het beste is om gebruik te maken van onze registry; hier kun je je images privé in bewaren.
Allereerst maak je een registry via de containerportal. Klik hier op 'NEW REGISTRY'.
Geef je registry een herkenbare naam. Als het goed is, staat hij er nu tussen.
De registry is nu aangemaakt; nu moeten we het image uploaden naar die registry. Hiervoor zijn 2 stappen:
Allereerst moet je inloggen op de registry. Hiervoor heb je de registry URL en de gebruikersnaam/wachtwoord combinatie nodig die je in de container portal kunt zien. Gebruik hiervoor het onderstaande commando (en vul hier de registry url in), en vervolgens de gebruikersnaam/wachtwoord combinatie.
docker login <registryurl:poort>
Vervolgens moet het image een 'tag' krijgen waarin staat dat hij naar je registry moet, en vervolgens upload je hem naar de registry
docker tag mijnimage cr.cloudprovider.net:25027/mijnimage
docker push cr.cloudprovider.net:25027/mijnimage
Zoals je ziet; nu is alles netjes geüpload naar de container registry, en zal hij ook in de container portal zichtbaar zijn als je daar op 'Manage' klikt.
De laatste stap is nu om het image toe te voegen als 'custom image'. Klik hiervoor op het 'LATEST' knopje wat je rechtsboven ziet. Je ziet nu het onderstaande scherm. Vul hier een naam in, en een role. Je kunt de instellingen gewoon overnemen zoals ik die ingevuld heb. Klik nu onderaan de pagina op 'Continue'.
Je komt nu op het image configuratiescherm. Hier moet je een regel toevoegen waarmee je het internet toegang geeft tot poort 80 op je container, voor webverkeer dus.
Klik bij Ingress Rules op het plusje. Vul vervolgens het in zoals onderstaand, en klik op 'Create'
Als je nu een nieuwe applicatie gaat deployen, staat het image als het goed is onder het kopje My Images en kun je hem dus deployen.
Je image is nu klaar, maar hoe kun je hem nu bijwerken? Dat is gelukkig erg simpel nu je door alle eerdere hoepeltjes heen gesprongen bent.
Oké, even terug naar het begin. Stel je voor; je hebt een index.php bestand klaar staan wat je in je image wilt hebben. Dit kan heel simpel, door het index.php bestand in hetzelfde mapje te zetten als je Dockerfile, en dan in het dockerfile in te stellen dat dat bestand in de documentroot geplaatst wordt. Doe dat als volgt;
Vervolgens pas je het Dockerfile als volgt aan;
Je ziet hier dat het stukje RUN echo .... vervangen heb met COPY index.php /var/www/html/index.php. Hiermee wordt het index.php bestand gekopieerd naar het containerimage. Je kunt dit ook gebruiken om volledige mappen te kopiëren, dus dat is best handig om je applicatie snel live te zetten.
Om de bijgewerkte Dockerfile nu naar het containerplatform te pushen, pak hiervoor de volgende commando's.
docker build -t mijnimage .
docker tag mijnimage cr.cloudprovider.net:25027/mijnimage
docker push cr.cloudprovider.net:25027/mijnimage
Als laatste, moet je op het containerplatform de containers rebuilden; de container wordt dan op de achtergrond weggegooid en vervangen door een nieuwe.
En zo concludeer ik deze blogpost; ik hoop dat je er wat aan hebt gehad! Eigen images maken maakt Docker erg krachtig, omdat je zo makkelijk en snel je applicatie kunt deployen.