# 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:** ```bash 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:** ```bash 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:** ```dockerfile 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:** ```bash 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:** ```bash 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 ``` ## Übung 6: Bind Mount für Entwicklung **Aufgabe:** Starte einen PHP-Container, der das aktuelle Verzeichnis als Bind Mount nutzt. **Lösung:** ```bash echo " 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:** ```bash 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 -d --name php-app \ --network app-network \ php:8.1-cli \ php -r "while(true){echo 'Connected to MySQL: '.var_export(mysqli_connect('mysql-db', 'root', 'secret', 'testdb') !== false, true).PHP_EOL; sleep(5);}" docker logs php-app ``` ## Übung 8: Multi-Stage Build **Aufgabe:** Erstelle ein Dockerfile für eine React-App mit Multi-Stage Build. **Lösung:** ```dockerfile # 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:** ```bash 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:** ```bash 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 ```