Deploying FrameworX in Docker and Kubernetes environments.
Parent Page: Deployment (Reference)
Docker Deployment
Base Image Creation
Dockerfile:
dockerfile
FROM mcr.microsoft.com/dotnet/runtime:8.0
# Install dependencies
RUN apt-get update && apt-get install -y \
libicu-dev \
libssl-dev \
&& rm -rf /var/lib/apt/lists/*
# Copy runtime files
COPY ./net8.0 /app
WORKDIR /app
# Set permissions
RUN chmod +x TServer.exe TWebServices.exe
# Expose ports
EXPOSE 10108
# Set entry point
ENTRYPOINT ["./TServer.exe"]
CMD ["/solution:MySolution.tproj"]
Build and Run
bash
# Build image
docker build -t frameworkx:10.1 .
# Run container
docker run -d \
--name frameworkx-runtime \
-p 10108:10108 \
-v /host/solutions:/app/solutions \
-v /host/data:/app/data \
frameworkx:10.1
Docker Compose
Multi-Container Setup
docker-compose.yml:
yaml
version: '3.8'
services:
frameworkx:
image: frameworkx:10.1
ports:
- "10108:10108"
environment:
- LICENSE_KEY=${LICENSE_KEY}
- DB_CONNECTION=Server=database;Database=fx
volumes:
- solutions:/app/solutions
- data:/app/data
depends_on:
- database
restart: unless-stopped
database:
image: mcr.microsoft.com/mssql/server:2019-latest
environment:
- ACCEPT_EULA=Y
- SA_PASSWORD=${DB_PASSWORD}
volumes:
- dbdata:/var/opt/mssql
ports:
- "1433:1433"
volumes:
solutions:
data:
dbdata:
Kubernetes Deployment
Deployment Manifest
frameworkx-deployment.yaml:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: frameworkx-runtime
spec:
replicas: 1
selector:
matchLabels:
app: frameworkx
template:
metadata:
labels:
app: frameworkx
spec:
containers:
- name: frameworkx
image: frameworkx:10.1
ports:
- containerPort: 10108
env:
- name: LICENSE_KEY
valueFrom:
secretKeyRef:
name: frameworkx-secrets
key: license-key
volumeMounts:
- name: solutions
mountPath: /app/solutions
- name: data
mountPath: /app/data
volumes:
- name: solutions
persistentVolumeClaim:
claimName: solutions-pvc
- name: data
persistentVolumeClaim:
claimName: data-pvc
Service Configuration
frameworkx-service.yaml:
yaml
apiVersion: v1
kind: Service
metadata:
name: frameworkx-service
spec:
selector:
app: frameworkx
ports:
- protocol: TCP
port: 10108
targetPort: 10108
type: LoadBalancer
Persistent Storage
Docker Volumes
bash
# Create named volumes
docker volume create frameworkx-solutions
docker volume create frameworkx-data
# Backup volumes
docker run --rm \
-v frameworkx-solutions:/source \
-v /backup:/backup \
alpine tar czf /backup/solutions.tar.gz -C /source .
Kubernetes PVC
yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: solutions-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
Container Configuration
Environment Variables
Variable | Description | Example |
---|---|---|
LICENSE_KEY | Product license | XXXX-XXXX-XXXX |
DB_CONNECTION | Database string | Server=db;Database=fx |
LOG_LEVEL | Logging level | Information |
TZ | Timezone | America/New_York |
Health Checks
dockerfile
HEALTHCHECK \
CMD curl -f http://localhost:10108/health || exit 1
Orchestration
Auto-Scaling
yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: frameworkx-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: frameworkx-runtime
minReplicas: 1
maxReplicas: 5
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
Rolling Updates
yaml
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0