====== Runbook: Docker ======
**Trajanje:** ~15 minut \\
**Vloga:** DevOps, razvijalci \\
**Predpogoj:** Docker Engine 20+
Poganjanje Data Gateway kot Docker kontejner.
----
===== Potek dela =====
flowchart TD
A[Začetek] --> B[Ustvari Dockerfile]
B --> C[Zgradi sliko]
C --> D[Zaženi kontejner]
D --> E[Health Check]
E --> F{V redu?}
F -->|Da| G[Končano]
F -->|Ne| H[Preveri docker logs]
style G fill:#e8f5e9
style H fill:#ffebee
----
===== 1. Dockerfile =====
# Dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime
WORKDIR /app
# Kopiraj datoteke Gateway
COPY publish/ .
# Ne-root uporabnik
RUN useradd --system --no-create-home appuser
USER appuser
# Vrata
EXPOSE 5000
# Healthcheck
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
CMD curl -f http://localhost:5000/health || exit 1
# Zagon
ENTRYPOINT ["dotnet", "WvdS.WebAPI.Data.Gateway.Api.dll"]
----
===== 2. Gradnja slike =====
# Zgradi sliko
docker build -t data-gateway:latest .
# Označi sliko (za register)
docker tag data-gateway:latest registry.example.com/data-gateway:v3.0
----
===== 3. Zagon kontejnerja =====
**Enostaven zagon:**
docker run -d \
--name gateway \
-p 5000:5000 \
-v $(pwd)/appsettings.json:/app/appsettings.json:ro \
-v $(pwd)/data:/app/data \
data-gateway:latest
**Z vsemi možnostmi:**
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/Ljubljana \
--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/Ljubljana
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
# Neobvezno: Podatkovna baza 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
**Zagon:**
# Zaženi vse storitve
docker-compose up -d
# Prikaži dnevnike
docker-compose logs -f gateway
# Ustavi
docker-compose down
----
===== 5. Health Check =====
# Status kontejnerja
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. Upravljanje kontejnerja =====
| Ukaz | Opis |
|--------|--------------|
| ''docker start gateway'' | Zaženi |
| ''docker stop gateway'' | Ustavi |
| ''docker restart gateway'' | Ponovno zaženi |
| ''docker logs gateway'' | Prikaži dnevnike |
| ''docker logs -f gateway'' | Live dnevniki |
| ''docker exec -it gateway sh'' | Lupina v kontejnerju |
----
===== 7. Kontrolni seznam =====
| # | Točka preverjanja | V |
|---|-----------|---|
| 1 | Dockerfile ustvarjen | |
| 2 | Slika zgrajena | |
| 3 | appsettings.json pripet | |
| 4 | Kontejner zagnan | |
| 5 | Health Check v redu | |
| 6 | Dnevniki brez napak | |
----
===== Odpravljanje težav =====
| Težava | Vzrok | Rešitev |
|---------|---------|--------|
| ''Kontejner se ne zažene'' | Napaka v konfiguraciji | ''docker logs gateway'' |
| ''Vrata že zasedena'' | Gostiteljska vrata zasedena | Uporabi druga vrata |
| ''Permission denied'' | Pravice volumnov | ''chmod'' na gostitelju |
| ''Cannot connect to DB'' | Težava z omrežjem | Preveri Docker omrežje |
**Lupina kontejnerja za razhroščevanje:**
# Lupina v delujočem kontejnerju
docker exec -it gateway sh
# Ali z bash (če je na voljo)
docker exec -it gateway bash
# Preveri datoteke v kontejnerju
docker exec gateway ls -la /app/
docker exec gateway cat /app/appsettings.json
----
===== Multi-Stage Build (optimiziran) =====
# 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 Runbooks =====
* [[.:kubernetes|Kubernetes]] - Namestitev v gruči
* [[..:monitoring:prometheus|Prometheus]] - Izvoz metrik
* [[.: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}}