Lab 03 – Docker image a Dockerfile

Lab 03 – Docker image a Dockerfile

Cíl: pochopit vrstvy tím, že uvidíte pracovat build cache. Tahák: Docker

# 1 – stažení a prozkoumání
sudo docker pull nginx:1.27
sudo docker images
sudo docker history nginx:1.27       # jeden řádek na vrstvu, s velikostmi

history je build recept čtený pozpátku. Většina vrstev má 0 B – jen metadata. Ta velká je základní souborový systém.

# 2 – sdílení vrstev
sudo docker pull nginx:1.27-alpine
sudo docker images | grep nginx

Porovnejte velikosti. Alpine image jsou malé proto, že je malá základna, ne proto, že by nginx byl jiný.

Postavte si vlastní

# 3 – build kontext
mkdir -p ~/myweb && cd ~/myweb
echo '<h1>Hello from support01</h1>' > index.html

cat > Dockerfile <<'DOCKERFILE'
FROM nginx:1.27-alpine
LABEL maintainer="student@k8s.lab"
COPY index.html /usr/share/nginx/html/index.html
EXPOSE 80
DOCKERFILE

Všechno v aktuálním adresáři se pošle démonu jako build kontext. Držte ho malý – právě od toho je .dockerignore.

# 4 – build a spuštění
sudo docker build -t myweb:1.0 .
sudo docker images | grep myweb
sudo docker run -d --name myweb -p 8081:80 myweb:1.0
curl -s localhost:8081

Sledujte výstup buildu: každá instrukce je krok a každý krok vytvoří vrstvu.

# 5 – změňte jeden řádek, přebuildujte, sledujte cache
echo '<h1>Version 1.1</h1>' > index.html
sudo docker build -t myweb:1.1 .     # "CACHED" u FROM/LABEL, přestavba od COPY
sudo docker history myweb:1.1 | head -5

Cache se zneplatní u první změněné instrukce a všechno pod ní se staví znovu. Proto pravidlo: nejméně se měnící instrukce nahoru, COPY aplikace nakonec.

# 6 – tagy jsou jmenovky nad ID image
sudo docker tag myweb:1.1 myweb:latest
sudo docker images | grep myweb      # stejné IMAGE ID, tři jména

Dva tagy nad jedním ID jsou důvod, proč je :latest nebezpečný – neříká nic o tom, který build vlastně běží.

Úklid

# 7 –
sudo docker rm -f myweb
sudo docker rmi myweb:1.0 myweb:1.1 myweb:latest