DHBW Stuttgart · Informatik / Wirtschaftsinformatik
Sommersemester 2026 · Sitzung 9 — Docker, Proxies and DBs
https://librete.ch/dhbw/
Dockerfile
compose.yml
dhbw-docker
Browser (localhost:10007) │ ▼ ┌──────────────────┐ │ Reverse Proxy │ (nginx / traefik) └─────────┬────────┘ ┌────┴────┐ ▼ ▼ ┌─────────┐ ┌────────┐ │ Web │ │ API │ │ App │ │ (Node) │ └────┬────┘ └────┬───┘ └─────┬──────┘ ▼ ┌────────┐ │ DB │ (Postgres) └────────┘
→ Docker = Container-Engine + Image-Format + Registry.
FROM node:lts-slim AS builder WORKDIR /app COPY ./package*.json ./ RUN npm ci --no-audit --no-fund --no-progress --loglevel=error COPY ./ ./ ENV NODE_ENV="production" EXPOSE 8080 CMD ["npm", "start"]
npm ci statt npm i für reproduzierbare Builds.
npm ci
npm i
FROM node:lts-slim AS builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build FROM node:lts-slim AS runtime WORKDIR /app COPY --from=builder /app/dist ./dist COPY --from=builder /app/node_modules ./node_modules COPY package*.json ./ EXPOSE 8080 CMD ["node", "dist/index.js"]
→ kleines Final-Image, keine Build-Tools im Runtime.
node_modules dist .git .env *.log coverage
Spart Build-Kontext und verhindert Geheimnis-Leaks.
name: dhbw-docker-app services: api: build: ./api container_name: dhbw-api environment: DATABASE_USERNAME: ${DATABASE_USERNAME} DATABASE_PASSWORD: ${DATABASE_PASSWORD} DATABASE_NAME: ${DATABASE_NAME} DATABASE_HOST: db DATABASE_PORT: 5432 ports: - "10000:8080" networks: [net, data] depends_on: db: condition: service_healthy
db: image: postgres:16-alpine environment: POSTGRES_USER: ${DATABASE_USERNAME} POSTGRES_PASSWORD: ${DATABASE_PASSWORD} POSTGRES_DB: ${DATABASE_NAME} volumes: - dbdata:/var/lib/postgresql/data networks: [data] healthcheck: test: ["CMD-SHELL", "pg_isready -U $$DATABASE_USERNAME"] interval: 5s retries: 5 proxy: image: nginx:alpine ports: ["10007:80"] volumes: ["./nginx.conf:/etc/nginx/nginx.conf:ro"] networks: [net] depends_on: [api] volumes: dbdata: networks: net: data:
docker compose -p "dhbw-docker-app" \ -f compose.yml \ --env-file .env \ up \ --build \ --remove-orphans \ --force-recreate
-p
-f
--env-file
.env
--build
--remove-orphans
--force-recreate
docker compose up -d # detached starten docker compose ps # Status docker compose logs -f api # Logs streamen docker compose exec api sh # Shell im Container docker compose down -v # Stop + Volumes löschen docker compose restart api # Neustart einzelner Service
api: healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] interval: 10s timeout: 3s retries: 3 start_period: 5s
depends_on: { condition: service_healthy } wartet, bis Health passt.
depends_on: { condition: service_healthy }
net
data
api
db
proxy
→ Defense in Depth.
volumes: dbdata: # benannt - ./code:/app # bind mount (dev) - /app/node_modules # anonymous (überschreibt bind)
docker compose down ohne -v lässt Volumes leben.
docker compose down
-v
Repo: https://github.com/nextlevelshit/dhbw-docker
git clone https://github.com/nextlevelshit/dhbw-docker cd dhbw-docker cp .env.example .env docker compose up --build
→ http://localhost:10007