Les 4 · Module 1 · Compose goed onder de knie
Een registry gebruiken
Zet de teller-image in een registry zodat elke machine en elk cluster hem kan ophalen: inloggen met een token, pushen, private registries, pull-secrets en een lokale registry voor kind.
π― Na deze les kun je
- uitleggen wat een registry is en hoe imagenamen zijn opgebouwd
- een image taggen en pushen naar een registry
- veilig inloggen met een token in plaats van een wachtwoord
- een lokale registry draaien voor je kind-cluster
Je image staat nu alleen op jouw laptop. Een Kubernetes-cluster heeft meerdere nodes die de image zelf moeten ophalen. Daarvoor is een registry: een opslagplaats voor images, zoals Docker Hub, GitHub Container Registry (ghcr.io), GitLab, of de registry van je eigen forge.
Imagenamen
ghcr.io/anna/teller:1.1.0
βββ¬ββββ ββββ¬ββββ βββ¬ββ
registry repository tag
Zonder registry-deel (teller:1.1) bedoelt Docker docker.io/library/teller. Daarom geef je in Kubernetes altijd de volledige naam op.
Inloggen met een token
Gebruik geen accountwachtwoord, maar een persoonlijk toegangstoken met alleen de rechten om packages te lezen en schrijven. Lees het van standaardinvoer, zodat het niet in je shellgeschiedenis of procesoverzicht terechtkomt:
# token staat in een bestand dat alleen jij kunt lezen, of in je wachtwoordbeheerder
docker login ghcr.io -u anna --password-stdin < ~/.config/ghcr-token
Docker bewaart de inlog in ~/.docker/config.json, of beter in de credential helper van je systeem (sleutelbos). Deel dat bestand nooit.
Pushen en pullen
docker tag teller:1.1 ghcr.io/anna/teller:1.1.0
docker push ghcr.io/anna/teller:1.1.0
docker pull ghcr.io/anna/teller:1.1.0
Na de push zie je een digest: 1.1.0: digest: sha256:9b2c⦠size: 1784. Die is vanaf nu de onveranderlijke verwijzing.
Voorspel eerst: je pusht 1.1.0, wijzigt app.py, bouwt opnieuw met dezelfde tag en pusht weer. Een collega deed eerder al
docker pull ghcr.io/anna/teller:1.1.0. Welke versie heeft hij?
Uitkomst
De oude. De tag in de registry wijst nu naar de nieuwe image, maar zijn lokale kopie verandert pas als hij opnieuw pullt. Op een
Kubernetes-node gebeurt hetzelfde: met imagePullPolicy: IfNotPresent draaien sommige nodes de oude en andere de nieuwe versie onder
dezelfde naam. Regel: hergebruik nooit een versietag. Elke build krijgt een nieuwe tag (of je verwijst naar de digest).
Openbaar of privΓ©
Een openbare image kan iedereen pullen. Een privΓ©-image vraagt inloggen, ook voor je cluster. In Kubernetes doe je dat met een imagePullSecret:
kubectl create secret docker-registry regcred --docker-server=ghcr.io --docker-username=anna --docker-password="$(cat ~/.config/ghcr-token-lezen)"
spec:
imagePullSecrets:
- name: regcred
Gebruik voor het cluster een apart token met alleen leesrechten.
Een lokale registry voor kind
Voor deze cursus hoef je niets openbaar te zetten. Je kunt images direct in kind laden (les 6), of een lokale registry draaien:
docker run -d --restart=always -p 127.0.0.1:5001:5000 --name kind-registry registry:2
docker tag teller:1.1 localhost:5001/teller:1.1.0
docker push localhost:5001/teller:1.1.0
Deze registry luistert alleen op je eigen computer (127.0.0.1) en heeft geen inlog; gebruik hem alleen lokaal.
Typische fouten
denied: requested access to the resource is denied: niet ingelogd, of je token mist de schrijfrechten, of de repositorynaam hoort bij een ander account.ErrImagePullin Kubernetes: tikfout in de naam, privΓ©-image zonder pull-secret, of de tag bestaat niet.- Token per ongeluk in Git of chat: trek het meteen in en maak een nieuw.
Oefenen
- Maak een token met alleen package-rechten en log in met
--password-stdin. - Push
teller:1.1met een semver-tag en een commit-tag. Noteer de digest. - Verwijder je lokale image en pull hem via de digest (
ghcr.io/β¦/teller@sha256:β¦). - Start de lokale registry op poort 5001 en push daarheen.
Modelantwoord oefening 1
Bij GitHub: Settings β Developer settings β Personal access tokens, met scope write:packages. docker login meldt Login Succeeded.
Modelantwoord oefening 2
docker tag teller:1.1 ghcr.io/anna/teller:1.1.0
docker tag teller:1.1 ghcr.io/anna/teller:$(git rev-parse --short HEAD)
docker push --all-tags ghcr.io/anna/teller
Beide tags wijzen naar dezelfde digest.
Modelantwoord oefening 3
docker image rm ghcr.io/anna/teller:1.1.0
docker pull ghcr.io/anna/teller@sha256:9b2c...
Modelantwoord oefening 4
curl http://localhost:5001/v2/_catalog geeft {"repositories":["teller"]}.
Lokaal oefenen
Geen live lab. Een openbare registry is niet nodig: de lokale registry of kind load (les 6) volstaat voor de hele cursus.
Samenvatting
- Een registry deelt images; de volledige naam is
registry/repository:tag. - Log in met een token via
--password-stdin; deel nooit~/.docker/config.json. - Hergebruik nooit een versietag; digests zijn onveranderlijk.
- PrivΓ©-images in Kubernetes vragen een imagePullSecret met een leestoken.
- Volgende les: waarom Kubernetes, en wanneer niet.