Files
docker-workshop/03 docker-basics-uebungen-mit-loesung.md
Frank Woeckener 7859ba370c Add examples
2025-03-27 16:14:18 +01:00

3.4 KiB

10 Praktische Docker-Übungen

Übung 1: Ersten Container starten

Aufgabe: Starte einen Nginx-Webserver als Container und prüfe, ob er unter http://localhost:8080 erreichbar ist.

Lösung:

docker run -d --name webserver -p 8080:80 nginx
curl http://localhost:8080

Übung 2: Container-Inspektion

Aufgabe: Starte einen PHP-Container, führe eine Shell darin aus und ermittle die PHP-Version.

Lösung:

docker run -it --name php-test php:8.1-cli
> phpinfo();
> exit

Übung 3: Einfaches Dockerfile erstellen

Aufgabe: Erstelle ein Dockerfile für eine PHP-Anwendung, die GD-Extension benötigt.

Lösung:

FROM php:8.1-cli
RUN apt-get update && apt-get install -y \
    libfreetype6-dev \
    libjpeg62-turbo-dev \
    libpng-dev \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd

WORKDIR /app
COPY . .
CMD ["php", "-S", "0.0.0.0:8000"]

Übung 4: Image bauen und taggen

Aufgabe: Baue ein Image aus dem Dockerfile der Übung 3, tagge es mit deinem Namen und Version 1.0.

Lösung:

docker build -t {name}/php-app:1.0 .
docker images | grep {name}/php-app

Übung 5: Container mit Volumes

Aufgabe: Starte einen MySQL-Container mit einem Named Volume für Datenpersistenz.

Lösung:

docker volume create mysql-data
docker run -d --name mysql-db \
  -e MYSQL_ROOT_PASSWORD=secret \
  -e MYSQL_DATABASE=testdb \
  -v mysql-data:/var/lib/mysql \
  mysql:8.0

docker exec -it mysql-db mysql -uroot -psecret testdb

Übung 6: Bind Mount für Entwicklung

Aufgabe: Starte einen PHP-Container, der das aktuelle Verzeichnis als Bind Mount nutzt.

Lösung:

echo "<?php phpinfo();" > index.php
docker run -d --name php-dev -p 8000:8000 \
  -v $(pwd):/app \
  php:8.1-cli \
  php -S 0.0.0.0:8000 -t /app

Übung 7: Container-Netzwerk erstellen

Aufgabe: Erstelle ein Netzwerk und verbinde einen PHP- und MySQL-Container.

Lösung:

docker network create app-network
docker run -d --name mysql-db \
  --network app-network \
  -e MYSQL_ROOT_PASSWORD=secret \
  -e MYSQL_DATABASE=testdb \
  mysql:8.0

docker run --name php-app \
  --network app-network \
  php:8.1-cli \
  bash -c "docker-php-ext-install mysqli && php -r \"while(true){echo 'Connected to MySQL: '.var_export(mysqli_connect('mysql-db', 'root', 'secret', 'testdb') !== false, true).PHP_EOL; sleep(5);}\""

Übung 8: Multi-Stage Build

Aufgabe: Erstelle ein Dockerfile für eine React-App mit Multi-Stage Build.

Lösung:

# Build-Stage
FROM node:16 AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# Production-Stage
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Übung 9: Image in Docker Hub pushen

Aufgabe: Tagge ein Image für Docker Hub und pushe es in dein Repository.

Lösung:

docker login
docker tag {name}/php-app:1.0 {dockerhub-username}/php-app:1.0
docker push {dockerhub-username}/php-app:1.0

Übung 10: Container-Ressourcen begrenzen

Aufgabe: Starte einen Container mit begrenztem Speicher und CPU.

Lösung:

docker run -d --name limited-container \
  --memory=512m \
  --cpus=0.5 \
  php:8.1-cli \
  php -r "while(true){echo memory_get_usage().PHP_EOL; sleep(1);}"

docker stats limited-container