Beetje Coderen

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.

⏱ 60 minuten leestijd + oefenen

Illustratie: een cloud met een doos en pijlen omhoog en omlaag, images delen via een registry

🎯 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.
  • ErrImagePull in 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

  1. Maak een token met alleen package-rechten en log in met --password-stdin.
  2. Push teller:1.1 met een semver-tag en een commit-tag. Noteer de digest.
  3. Verwijder je lokale image en pull hem via de digest (ghcr.io/…/teller@sha256:…).
  4. 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.

πŸ“ Quiz: Een registry gebruiken

5 vragen Β· 70% nodig om te slagen

1. Waar verwijst teller:1.1 zonder registry naar?
2. Waarom --password-stdin?
3. Wat gebeurt er als je een tag hergebruikt?
4. Wat heeft een cluster nodig voor een privé-image?
5. Wat doe je met een gelekt token?