Initial Commit
This commit is contained in:
137
03 docker-basics-uebungen-mit-loesung.md
Normal file
137
03 docker-basics-uebungen-mit-loesung.md
Normal file
@@ -0,0 +1,137 @@
|
||||
# 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 -d --name php-test php:8.1-cli
|
||||
docker exec -it php-test bash
|
||||
php -v
|
||||
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 "<?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:**
|
||||
```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
|
||||
```
|
||||
Reference in New Issue
Block a user