View on GitHub

Meta-Repository Workshop

Mono-repo eller mange repo? Prøv meta-repo! - JavaZone 2025

Oppgave 6: Docker og Docker Compose

Denne delen krever Docker og Docker Compose installert på maskinen din. Hvis du ikke har Docker installert, kan du enten:

📋 Mål

I denne oppgaven skal du:

📚 Bakgrunn

Å plassere verktøy for å kjøre opp en løsning sammensatt av flere tjenester passer veldig fint i et meta-repo.

docker-compose er et verktøy for å definere og kjøre multi-container Docker applikasjoner. Med en YAML-fil kan du konfigurere hver docker-container og kople dem sammen, og starte dem med en enkel kommando.

I vårt prosjekt finnes det allerede Dockerfiles i hver service-mappe, så vi trenger bare å lage en docker-compose.yml fil i meta-repo mappen.

🛠 Steg-for-steg

Steg 1: Opprett docker-compose.yml

Opprett en docker-compose.yml fil i meta-repo mappen:

# Klipp og lim hele denne kommandoen:
cat > docker-compose.yml << 'EOF'
services:
  meta-todo-backend:
    build: ./todo-backend
    ports:
      - "8082:8080"
    environment:
      - SORTER_SERVICE_URL=http://meta-todo-sorter:3001
    depends_on:
      - meta-todo-sorter
    volumes:
      - ./todo-backend/data:/app/data

  meta-todo-sorter:
    build: ./todo-sorter
    ports:
      - "8083:3001"
      
  meta-todo-frontend:
    build: ./todo-frontend
    ports:
      - "8081:80"
    environment:
      - API_URL=http://meta-todo-backend:8080
    depends_on:
      - meta-todo-backend

EOF

Steg 2: Bygg og start services

⚠️ Viktig: Hvis du kjører workshop-en i Docker, må du først avslutte Docker-containeren og gå tilbake til host-maskinen for å kunne kjøre Docker Compose.

# Hvis du er i Docker-container, skriv:
exit

Bygg og start alle services:

docker-compose up --build -d

Dette vil:

Steg 3: Utforsk kjørende services

Sjekk at alle services kjører med vanlige docker-compose kommandoer:

# Se status på alle services
docker-compose ps

# Følg logs fra alle services
docker-compose logs -f

# Se service-URLs
echo "Service URLs:"
echo "Frontend: http://localhost:8081"
echo "Backend:  http://localhost:8082/api/todos/count" 
echo "Sorter:   http://localhost:8083/health"

Steg 4: Test servicene

Åpne en nettleser og gå til:

Prøv å legge til todos i frontenden og se at alt fungerer sammen.

Steg 5: Legg til Docker-kommandoer i din Makefile

Nå som Docker Compose fungerer, kan vi legge til praktiske make-kommandoer. Legg til disse kommandoene i din Makefile:

up: ## Start alle services i bakgrunnen
	docker-compose up -d
	$(MAKE) urls

up-build: ## Bygg og start alle services
	docker-compose up --build -d
    (MAKE) urls

down: ## Stopp alle services
	docker-compose down

restart: down up ## Restart alle services

rebuild: down up-build ## Restart alle services med rebuild

logs: ## Vis service logs
	docker-compose logs -f

status: ## Vis service status
	docker-compose ps

urls: ## Vis service URLs
	@echo "Service URLs:"
	@echo "Frontend: http://localhost:8081"
	@echo "Backend:  http://localhost:8082/api/todos/count" 
	@echo "Sorter:   http://localhost:8083/health"

Steg 6: Test make-kommandoene

Nå kan du teste make-kommandoene:

Stopp servicene først

make down

Start på nytt med make

make up

Se status

make status

Se URLs

make urls

Følg logs (Ctrl+C for å stoppe)

make logs

Restart services

make restart

Steg 7: Commit Docker-integrasjonen

Commit Docker Compose-filen og Makefile-endringene:

git add docker-compose.yml Makefile
git commit -m"Legg til Docker Compose oppsett og make-kommandoer"

🎯 Ekstra-oppgaver: Health checks for bedre oppstart

Backend’en bruker noen sekunder mer enn frontenden på å bli klar, og det kan føre til at frontend ikke virker i starten.

Hvis du vil sikre at servicene faktisk er klare før avhengige tjenester starter, kan du legge til health checks i docker-compose.yml.

Klikk for å se health check oppsett

Erstatt din docker-compose.yml med denne versjonen:

services:
  meta-todo-sorter:
    build: ./todo-sorter
    container_name: meta-todo-sorter
    ports:
      - "8083:3001"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3001/health"]
      interval: 10s
      timeout: 5s
      retries: 5

  meta-todo-backend:
    build: ./todo-backend
    container_name: meta-todo-backend
    ports:
      - "8082:8080"
    environment:
      - SORTER_SERVICE_URL=http://meta-todo-sorter:3001
    depends_on:
      meta-todo-sorter:
        condition: service_healthy
    volumes:
      - ./todo-backend/data:/app/data
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
      interval: 10s
      timeout: 5s
      retries: 5
      
  meta-todo-frontend:
    build: ./todo-frontend
    container_name: meta-todo-frontend
    ports:
      - "8081:80"
    environment:
      - API_URL=http://meta-todo-backend:8080
    depends_on:
      meta-todo-backend:
        condition: service_healthy

Dette sikrer at:

  • meta-todo-sorter må være “healthy” før meta-todo-backend starter
  • meta-todo-backend må være “healthy” før meta-todo-frontend starter
  • Health checks kjører hver 10. sekund

Test det nye oppsettet:

make rebuild
# Observer at servicene starter i riktig rekkefølge og venter på hverandre

🔄 Feilsøking

Vanlige problemer:

Port conflicts:

Se hvilke porter som er i bruk

lsof -i :8081 # På Linux/Mac

Endre porter i docker-compose.yml hvis nødvendig

Build feil:

Bygg på nytt uten cache

docker-compose build --no-cache

Se detaljert logg under bygging

docker-compose up --build

Service kan ikke starte:

Se detaljerte feilmeldinger

docker-compose logs meta-todo-backend

Debug ved å kjøre service manuelt

docker run -it meta-todo_meta-todo-backend:latest sh

💡 Tips

← Tilbake til oversikt → Neste oppgave: IDE-integrasjon