====== Runbook: Docker ====== **Trajanje:** ~15 minuta \\ **Uloga:** DevOps, Razvojni programeri \\ **Preduvjet:** Docker Engine 20+ Data Gateway kao Docker container. ---- ===== Tijek rada ===== flowchart TD A[Start] --> B[Dockerfile kreirati] B --> C[Image buildati] C --> D[Container pokrenuti] D --> E[Health Check] E --> F{OK?} F -->|Da| G[Gotovo] F -->|Ne| H[docker logs provjeriti] style G fill:#e8f5e9 style H fill:#ffebee ---- ===== 1. Dockerfile ===== # Dockerfile FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime WORKDIR /app # Gateway datoteke kopirati COPY publish/ . # Non-Root korisnik RUN useradd --system --no-create-home appuser USER appuser # Port EXPOSE 5000 # Healthcheck HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ CMD curl -f http://localhost:5000/health || exit 1 # Start ENTRYPOINT ["dotnet", "WvdS.WebAPI.Data.Gateway.Api.dll"] ---- ===== 2. Image buildati ===== # Image buildati docker build -t data-gateway:latest . # Image tagirati (za Registry) docker tag data-gateway:latest registry.example.com/data-gateway:v3.0 ---- ===== 3. Container pokrenuti ===== **Jednostavan start:** docker run -d \ --name gateway \ -p 5000:5000 \ -v $(pwd)/appsettings.json:/app/appsettings.json:ro \ -v $(pwd)/data:/app/data \ data-gateway:latest **Sa svim opcijama:** docker run -d \ --name gateway \ --restart unless-stopped \ -p 5000:5000 \ -v $(pwd)/config/appsettings.json:/app/appsettings.json:ro \ -v $(pwd)/data:/app/data \ -v $(pwd)/logs:/app/logs \ -e ASPNETCORE_ENVIRONMENT=Production \ -e TZ=Europe/Berlin \ --memory=512m \ --cpus=1 \ --health-cmd="curl -f http://localhost:5000/health || exit 1" \ --health-interval=30s \ data-gateway:latest ---- ===== 4. Docker Compose ===== # docker-compose.yml version: '3.8' services: gateway: image: data-gateway:latest build: context: . dockerfile: Dockerfile container_name: data-gateway restart: unless-stopped ports: - "5000:5000" volumes: - ./config/appsettings.json:/app/appsettings.json:ro - ./data:/app/data - gateway-logs:/app/logs environment: - ASPNETCORE_ENVIRONMENT=Production - TZ=Europe/Berlin deploy: resources: limits: memory: 512M cpus: '1' healthcheck: test: ["CMD", "curl", "-f", "http://localhost:5000/health"] interval: 30s timeout: 5s retries: 3 start_period: 10s networks: - gateway-net # Opcionalno: Baza podataka za Demo demo-db: image: postgres:16-alpine container_name: demo-db restart: unless-stopped environment: - POSTGRES_USER=gateway - POSTGRES_PASSWORD=gateway123 - POSTGRES_DB=demo volumes: - postgres-data:/var/lib/postgresql/data networks: - gateway-net volumes: gateway-logs: postgres-data: networks: gateway-net: driver: bridge **Pokretanje:** # Sve servise pokrenuti docker-compose up -d # Logove prikazati docker-compose logs -f gateway # Zaustaviti docker-compose down ---- ===== 5. Health Check ===== # Container status docker ps # Health status docker inspect --format='{{.State.Health.Status}}' gateway # API test curl http://localhost:5000/health curl http://localhost:5000/api/v1/dsn/demo/tables ---- ===== 6. Container upravljanje ===== | Naredba | Opis | |--------|--------------| | ''docker start gateway'' | Pokretanje | | ''docker stop gateway'' | Zaustavljanje | | ''docker restart gateway'' | Ponovno pokretanje | | ''docker logs gateway'' | Prikaz logova | | ''docker logs -f gateway'' | Live logovi | | ''docker exec -it gateway sh'' | Shell u containeru | ---- ===== 7. Kontrolna lista ===== | # | Provjera | Da/Ne | |---|-----------|---| | 1 | Dockerfile kreiran | - | | 2 | Image buildan | - | | 3 | appsettings.json mountan | - | | 4 | Container pokrenut | - | | 5 | Health Check OK | - | | 6 | Logovi bez gresaka | - | ---- ===== Rjesavanje problema ===== | Problem | Uzrok | Rjesenje | |---------|---------|--------| | ''Container se ne pokrece'' | Config greska | ''docker logs gateway'' | | ''Port vec zauzet'' | Host-port zauzet | koristiti drugi port | | ''Permission denied'' | Volume prava | ''chmod'' na hostu | | ''Cannot connect to DB'' | Mrezni problem | Docker mrezu provjeriti | **Container-Shell za debugging:** # Shell u aktivnom containeru docker exec -it gateway sh # Ili s bash (ako je dostupan) docker exec -it gateway bash # Datoteke u containeru provjeriti docker exec gateway ls -la /app/ docker exec gateway cat /app/appsettings.json ---- ===== Multi-Stage Build (optimizirano) ===== # Multi-Stage Dockerfile FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /src COPY *.csproj . RUN dotnet restore COPY . . RUN dotnet publish -c Release -o /app/publish FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime WORKDIR /app COPY --from=build /app/publish . RUN useradd --system --no-create-home appuser USER appuser EXPOSE 5000 HEALTHCHECK --interval=30s --timeout=5s CMD curl -f http://localhost:5000/health || exit 1 ENTRYPOINT ["dotnet", "WvdS.WebAPI.Data.Gateway.Api.dll"] ---- ===== Povezani runbookovi ===== * [[.:kubernetes|Kubernetes]] - Cluster-Deployment * [[..:monitoring:prometheus|Prometheus]] - Metrics eksportiranje * [[.:systemd|systemd]] - Bare-Metal alternativa ---- << [[.:systemd|<- systemd]] | [[.:kubernetes|-> Kubernetes]] >> ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Data Gateway Professional// {{tag>operator runbook docker container compose}}