Back to "تطوير Dokker Deveveloping Dep Dveve: من الأساسيات إلى الأساسيات المتقدمة"

This is a viewer only at the moment see the article on how this works.

To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk

This is a preview from the server running through my markdig pipeline

.NET Containers DevOps Docker

تطوير Dokker Deveveloping Dep Dveve: من الأساسيات إلى الأساسيات المتقدمة

Sunday, 09 November 2025

أولاً

قام (دوكر) بشكل أساسي بتحويل كيفية بناء وشحن وتشغيل التطبيقات.

وقد تطور ما بدأ كأداة بسيطة للنقل بالحاويات إلى نظام إيكولوجي كامل لتطوير التطبيقات الحديثة ونشرها.

  1. **هذا هو المقال الرابع والأكثر شمولاً في سلسلة Doker بلدي لمطوري النيت.**إذا كنت جديداً على (دوكر)، قد ترغب في البدء بـ:
  2. الأمر المُقْرِر- الشروع في تجهيزات أساسية متعددة الحاويات (تموز/يوليه 2024)
  3. مع شركة DOcker Costws- تهيئة بيئات محلية (آب/أغسطس 2024)

صورة جاري مع مع تنفيذ

  • **- حل المسائل المتعلقة بتراخيص الحجم (آب/أغسطس 2024)**في هذا الغوص العميق، سنبني على تلك الأسس لاستكشاف:
  • الإنتاج المجهزالمكم الفعلي الذي يدير هذه المدوّنة
  • استضافة ذاتية الاعتماد على الموارد المحدودة: تقنيات الاستخدام العملي لعمليات النشر في الميزانية
  • دعم الدعم(أ) تشغيل عبء العمل في الحاويات
  • **(أ) (أ) (أ) (أ) (أ) (أ)**دعم الهدف 64 وAMD 64
  • وصفات للحاويات: إنشاء وحاويات لنشر المعلومات بدون ملفات

المصدر الصافي

النهج الحديث لشبكة الإنترنت في انتقال الحاويات

ملاحظة: هذا جزء من تجاربي مع منظمة العفو الدولية/طريقة لإنفاق 1000 دولار من دولارات الولايات المتحدة

لقد أطعمت هذه مجموعة من الأوراق، فهمي، أسئلة كان عليّ أن ألفت هذه المقالة.

إنه ممتع ويملأ فجوة لم أرها ملأت في أي مكان آخر

سواء كنت تنشر تطبيقاً شبكياً بسيطاً أو تنظم هيكلاً معقّداً للخدمات الدقيقة مع نماذج تعلم الآلة المُعزّزة GPU، يأخذك هذا الدليل من أساسيات Docker إلى تطبيقات حاوية جاهزة للإنتاج - مع أمثلة حقيقية من تشغيل motherlucid.com.

  • مُرسِل المُرْفِر أساسيات: مُفْفما هو (دوكر)، حقاً؟
  • **في جوهرها، Doker هو منصة للحاويات التي تقوم بتغليف تطبيقاتك وجميع المعتمدات في وحدة موحدة تسمى حاوية.**وخلافا للآلات الافتراضية التي تفترض نظم تشغيل كاملة، تتقاسم الحاويات النواة المضيفة OS بينما تحتفظ في الوقت نفسه بأماكن معزولة للمستعملين.

فكر في الأمر بهذه الطريقة:

# The classic developer problem
"It works on my machine!" 

# The container solution
"Ship your machine!" 

الآلات الافتراضية

  1. : كل VM يدير كومة كاملة من OS (نواة لينكس، مكتبات النظام، وما إلى ذلك) - ثقيلة وبطيئة في البدءالمحتويات
  2. تقاسم نواة المضيف، الحزمة فقط رمز التطبيق والاعتمادات - الوزن والسرعةلِمَ تُدْلِجُ ٱلْحِيَاتُ مُحِلًّا
  3. **والحاويات تحل العديد من المشاكل الحرجة:**البيئة
  4. : التنمية والاختبار والبيئات الإنتاجية متطابقة
  5. *** لا مزيد من "جبل التنمية البشرية في العالم" أو نسخ متضاربة من المكتبة**مُنْكِب مُنْكِب

: نفس المدخلات = نفس المخرجات، كل مرة

الوزع الناشر

# An image is a template (like a class in OOP)
docker pull mcr.microsoft.com/dotnet/aspnet:9.0

# A container is a running instance (like an object)
docker run -d -p 8080:8080 myapp:latest

:: بدء تشغيل الحاويات في ثوان، لا في دقائق

FROM mcr.microsoft.com/dotnet/aspnet:9.0      # Layer 1: Base OS + .NET runtime
WORKDIR /app                                   # Layer 2: Directory structure
COPY *.dll ./                                  # Layer 3: Application files
ENTRYPOINT ["dotnet", "MyApp.dll"]            # Layer 4: Startup command

: تشغيل العشرات من الحاويات على مضيف واحد

  • & سند الممف&
  • الصورةهي immetable, prected Filmsystems.
  • **كل توجيه في دوكرفيه يخلق طبقة جديدة:**هذه الطبقة قوية:

كساق

:الطبقات غير المتغيّرة يعاد استخدامها، متسارعة للبناء

# Multi-stage build: separates build environment from runtime
# Stage 1: Build
FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
WORKDIR /src

# Copy only csproj files first (better layer caching)
COPY ["MyApp/MyApp.csproj", "MyApp/"]
COPY ["MyApp.Core/MyApp.Core.csproj", "MyApp.Core/"]

# Restore dependencies (cached unless csproj changes)
RUN dotnet restore "MyApp/MyApp.csproj"

# Copy everything else
COPY . .

# Build the application
WORKDIR "/src/MyApp"
RUN dotnet build "MyApp.csproj" -c Release -o /app/build

# Stage 2: Publish
FROM build AS publish
RUN dotnet publish "MyApp.csproj" -c Release -o /app/publish /p:UseAppHost=false

# Stage 3: Final runtime image
FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS final
WORKDIR /app

# Create non-root user for security
RUN addgroup --gid 1001 appuser && \
    adduser --uid 1001 --gid 1001 --disabled-password --gecos "" appuser

# Copy published output from publish stage
COPY --from=publish /app/publish .

# Switch to non-root user
USER appuser

# Expose port (documentation only, doesn't actually publish)
EXPOSE 8080

# Set environment variables
ENV ASPNETCORE_URLS=http://+:8080
ENV ASPNETCORE_ENVIRONMENT=Production

# Health check
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
    CMD curl -f http://localhost:8080/health || exit 1

ENTRYPOINT ["dotnet", "MyApp.dll"]

  1. : يمكن لصور متعددة أن تتقاسم طبقات قاعديةمـن مـن مـن مـن مـن
  2. : فقط الطبقات المتغيرة تحتاج للتنزيل/التحميلمرففِر مرفففف
  3. **ها هو إنتاج جاهز. Net Dokkerfile مع التعليق:**وفيما يلي المبادئ الأساسية:
  4. (أ) بناء المرحلة المتعددة المراحل:المراحل المنفصلة من البناء/النشر المنفصلة تقلل من حجم الصورة النهائية بدرجة كبيرة
  5. تدبج: نسخ ملفات اعتماد الاعتماد قبل رمز المصدر لـ أفضل كشك

1 ف-5، 1 ف-4، 1 خ ع (ر أ)، 1 خ ع (ر أ)

# Build the image
docker build -t myapp:1.0.0 -t myapp:latest .

# Run with common options
docker run -d \
  --name myapp \
  -p 8080:8080 \
  -e ConnectionStrings__DefaultConnection="Server=db;Database=myapp" \
  -v /data/logs:/app/logs \
  --restart unless-stopped \
  myapp:latest

# View logs
docker logs -f myapp

# Execute commands inside running container
docker exec -it myapp /bin/bash

# Stop and remove
docker stop myapp
docker rm myapp

: تشغيل كمستخدم غير روت

: يمكن لأجهزة ورش الحاويات أن ترصد صحة التطبيق

(البيئة الوسيطة

  • & وضع افتراضي الإنتاج
  • المبنى وسير التشغيل
  • الدالة DOcker Comprus: mul- متعدّد وائِن
  • Doker Compus يسمح لك بتعريف وتشغيل تطبيقات حاويات متعددة.
  • بدلاً من إدارة الحاويات كل على حدة، تصف كامل ملف الطلب في ملف YAML.

لماذا يَعمَلُ تُصنّعُ؟docker runوضع تطبيق شبكي نموذجي لشبكة الإنترنت:

SPSP.net

**مجلدdocker-compose.yml**المعامل للقطع

services:
  # Main ASP.NET Core application
  mostlylucid:
    image: scottgal/mostlylucid:latest
    restart: always
    healthcheck:
      test: [ "CMD", "curl", "-f -K", "https://mostlylucid:7240/healthy" ]
      interval: 30s
      timeout: 10s
      retries: 5
    labels:
      - "com.centurylinklabs.watchtower.enable=true"
    env_file:
      - .env
    environment:
      - Auth__GoogleClientId=${AUTH_GOOGLECLIENTID}
      - Auth__GoogleClientSecret=${AUTH_GOOGLECLIENTSECRET}
      - Auth__AdminUserGoogleId=${AUTH_ADMINUSERGOOGLEID}
      - SmtpSettings__UserName=${SMTPSETTINGS_USERNAME}
      - SmtpSettings__Password=${SMTPSETTINGS_PASSWORD}
      - Analytics__UmamiPath=${ANALYTICS_UMAMIPATH}
      - Analytics__WebsiteId=${ANALYTICS_WEBSITEID}
      - ConnectionStrings__DefaultConnection=${POSTGRES_CONNECTIONSTRING}
      - TranslateService__ServiceIPs=${EASYNMT_IPS}
      - Serilog__WriteTo__0__Args__apiKey=${SEQ_API_KEY}
      - Markdown__MarkdownPath=${MARKDOWN_MARKDOWNPATH}
    volumes:
      - /mnt/imagecache:/app/wwwroot/cache
      - /mnt/logs:/app/logs
      - /mnt/markdown:/app/markdown
      - ./mostlylucid.pfx:/app/mostlylucid.pfx
      - /mnt/articleimages:/app/wwwroot/articleimages
      - /mnt/mostlylucid/uploads:/app/wwwroot/uploads
    networks:
      - app_network
    depends_on:
      - db

  # PostgreSQL database
  db:
    image: postgres:16-alpine
    ports:
      - 5266:5432  # Custom external port to avoid conflicts
    env_file:
      - .env
    networks:
      - app_network
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"]
      interval: 5s
      timeout: 5s
      retries: 5
    volumes:
      - /mnt/umami/postgres:/var/lib/postgresql/data
    restart: always

  # Cloudflare tunnel for secure external access
  cloudflared:
    image: cloudflare/cloudflared:latest
    command: tunnel --no-autoupdate run --token ${CLOUDFLARED_TOKEN}
    env_file:
      - .env
    restart: always
    networks:
      - app_network

  # Umami analytics
  umami:
    image: ghcr.io/umami-software/umami:postgresql-latest
    env_file: .env
    environment:
      DATABASE_URL: ${DATABASE_URL}
      DATABASE_TYPE: ${DATABASE_TYPE}
      HASH_SALT: ${HASH_SALT}
      APP_SECRET: ${APP_SECRET}
      TRACKER_SCRIPT_NAME: getinfo
      API_COLLECT_ENDPOINT: all
    depends_on:
      - db
    labels:
      - "com.centurylinklabs.watchtower.enable=true"
    networks:
      - app_network
    restart: always

  # Translation service (CPU-limited for resource management)
  easynmt:
    image: easynmt/api:2.0.2-cpu
    volumes:
      - /mnt/easynmt:/cache/
    deploy:
      resources:
        limits:
          cpus: "4.0"  # Prevent translation service from consuming all CPU
    networks:
      - app_network

  # Caddy reverse proxy with automatic HTTPS
  caddy:
    image: caddy:latest
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data
      - caddy_config:/config
    networks:
      - app_network
    restart: always

  # Seq centralized logging
  seq:
    image: datalust/seq
    container_name: seq
    restart: unless-stopped
    environment:
      ACCEPT_EULA: "Y"
      SEQ_FIRSTRUN_ADMINPASSWORDHASH: ${SEQ_DEFAULT_HASH}
    volumes:
      - /mnt/seq:/data
    networks:
      - app_network

  # Prometheus metrics collection
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    volumes:
      - prometheus-data:/prometheus
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
    labels:
      - "com.centurylinklabs.watchtower.enable=true"
    networks:
      - app_network

  # Grafana visualization
  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    labels:
      - "com.centurylinklabs.watchtower.enable=true"
    volumes:
      - grafana-data:/var/lib/grafana
    networks:
      - app_network
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD}

  # Host metrics exporter
  node_exporter:
    image: quay.io/prometheus/node-exporter:latest
    container_name: node_exporter
    command:
      - '--path.rootfs=/host'
    networks:
      - app_network
    restart: unless-stopped
    volumes:
      - '/:/host:ro,rslave'

  # Automatic container updates
  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_LABEL_ENABLE=true
    command: --interval 300  # Check every 5 minutes

volumes:
  grafana-data:
  caddy_data:
  caddy_config:
  prometheus-data:

networks:
  app_network:
    driver: bridge

خدمة عامل أساسي

  1. إدارة هذه العمليات بصورة فردية معالأوامر تصبح غير قابلة للتنفيذ.app_network(دُوكَر) يُكوّنُ حلّلَ هذا.
  2. مثال حقيقي وعالمي كامل ودقيق: منبر الإنتاجهذا هو/mnt/*(أ) الإنتاج الفعلي
  3. **الذي يدير هذا الموقع نفسه (mothlylucyd.com):**أنماط الإنتاج الرئيسية:
  4. الشبكة:: جميع الخدمات في:
  5. للبساطةمَنْتِلِم
  6. (ب) ما يلي:(للمعطيات الثابتة التي تحتاجها للنسخ الاحتياطي/الوصول
  7. المجلدات:: تخزين البيانات التي تُدار من قبل شركة مُخْدَرَة من أجل البيانات التي لا تحتاج إلى الوصول المباشر إليها.env

فقط تحديث الخدمات الملصقة بشكل صريح لـ تلقائي تحديث

لا شيء

services:
  web:
    depends_on:
      db:
        condition: service_healthy  # Wait for health check
      redis:
        condition: service_started  # Just wait for start
  • القيود المفروضة على خدمات الترجمة تمنع تجويع الموارد.condition: service_healthyالمناورة الخارجية

: PostgreSQL على 5266 بدلاً من 5432 لتجنب التنازع مع حالات أخرى

# .env file (never commit to git!)
DB_PASSWORD=super_secret_password
SMTP_PASSWORD=another_secret
services:
  web:
    environment:
      - DB_PASSWORD=${DB_PASSWORD}  # From .env file
      - STATIC_VALUE=production     # Hardcoded
    env_file:
      - .env                        # Load entire file

:: أسرار في:

services:
  db:
    volumes:
      # Named volume (managed by Docker)
      - postgres_data:/var/lib/postgresql/data

  web:
    volumes:
      # Bind mount (maps host directory to container)
      - ./data/markdown:/app/Markdown
      - ./logs:/app/logs

ملف (لم يُتَخَلَف إلى مُلحاً):

  • تنفيذ تنفيذ تنفيذ ر_ هذا مفتاح
  • قسم من فئة الخدمات الخدمات الخدمات الخدمات
  • (دوكر) يُكوّن (أوركسترا) يُبدّئ الطلب.
  • الـ

يتطلب الفحص الصحي لقاعدة البيانات للمرور قبل بدء تطبيق الويب.:

  • متغيرات البيئة وأسرارها
  • فيما يتعلق بأسرار الإنتاج، أو باستخدام أسرار Docker أو مديري الأسرار الخارجية (مدير أسرار نظام الإنذار المبكر، و Volt Asure Key، و Hashyorp Valt).
  • المجلدات المسمّى الاسم المجلدات ضدّ Cend Munds

المجلدات المنشورة

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge

services:
  web:
    networks:
      - frontend
      - backend

  db:
    networks:
      - backend  # Not exposed to frontend

يدمّر دورر

البيانات المرمزة عبر عمليات إعادة بدء الحاوي

services:
  db:
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s

يمكن دعم/ إعادة نسخ مع أوامر DOkكر

  • متوافق مع المتقاطع
  • المُنْجِزات
  • إلى مضيف

مفيد للتطوير (إعادة تحميل رموز مدارية)

# Start all services (detached)
docker-compose up -d

# Start specific services
docker-compose up -d web db

# View logs (all services)
docker-compose logs -f

# View logs (specific service)
docker-compose logs -f web

# Stop services (containers remain)
docker-compose stop

# Stop and remove containers
docker-compose down

# Stop, remove containers, and remove volumes
docker-compose down -v

# Rebuild and restart
docker-compose up -d --build

# Scale a service
docker-compose up -d --scale worker=3

# Execute command in running service
docker-compose exec web /bin/bash

# Run one-off command
docker-compose run --rm web dotnet ef database update

الملفات، والسجلات، والرفعات

الشبكي

**الشبكات توفر العزلة.**وهنا تكون قاعدة البيانات متاحة فقط للخدمات الخلفية، وليس للتعرض المباشر.

services:
  web:
    build: .
    environment:
      - ASPNETCORE_ENVIRONMENT=Development

فحص صح فحصتسمح الفحوص الصحية لـ Docker بما يلي:

services:
  web:
    volumes:
      - .:/app  # Live code reloading
    ports:
      - "5000:8080"

**يحدد ما إذا كانت حاوية ما جاهزة في الواقع (لا تبدأ فقط)**إعادة تشغيل الحاويات الصحية

services:
  web:
    image: registry.example.com/myapp:${VERSION}
    restart: always
    deploy:
      replicas: 3
      resources:
        limits:
          cpus: '2'
          memory: 2G
# Development (base + override)
docker-compose up -d

# Production
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

(Kubernetes, Dokker swarm)

أمر مُفّر مُ_ظ

تطويرات ضد تطويرات إنتاج ملفات

# Install NVIDIA Container Toolkit (Ubuntu/Debian)
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/libnvidia-container/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
  sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit

# Configure Docker daemon
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

# Test GPU access
docker run --rm --gpus all nvidia/cuda:12.6.0-base-ubuntu24.04 nvidia-smi

الاهتمامات المنفصلة مع ملفات متعددة:

# Use NVIDIA CUDA base image
FROM nvidia/cuda:12.6.0-cudnn-runtime-ubuntu24.04

# Install Python
RUN apt-get update && apt-get install -y \
    python3.12 \
    python3-pip \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app

# Install PyTorch with CUDA support
COPY requirements.txt .
RUN pip3 install --no-cache-dir torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124

# Copy application
COPY . .

# Test GPU on container start
RUN python3 -c "import torch; print(f'CUDA available: {torch.cuda.is_available()}'); print(f'GPU: {torch.cuda.get_device_name(0) if torch.cuda.is_available() else \"None\"}')"

ENTRYPOINT ["python3", "train.py"]

عمـل كـكـركـر - كـنـز.

# Run with all GPUs
docker run --gpus all myapp:gpu

# Run with specific GPUs
docker run --gpus '"device=0,2"' myapp:gpu

# Run with GPU memory limits
docker run --gpus all --memory=16g myapp:gpu

(القاعدة):

services:
  ml-trainer:
    build:
      context: .
      dockerfile: Dockerfile.gpu
    image: myapp:gpu
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all  # or specific count: 1, 2, etc.
              capabilities: [gpu]
    volumes:
      - ./models:/app/models
      - ./data:/app/data
    environment:
      - NVIDIA_VISIBLE_DEVICES=all
      - CUDA_VISIBLE_DEVICES=0,1  # Use GPUs 0 and 1

عـن عـد عـد الـمـن الـمـعـن مـن عمـل مـن عمـل عمـل مـن عمـل مـن عمـل مـن عمـل مـن

)التنميــة - الأذان:م ع م م م م م م م م م م م م م م م م م م م م م م(الإنتاج):

دعم GPPU دعم في DOckر: تسريع تحميلات العمل في ML

  • **ويتطلب التعلم الآلي والحوسبة العلمية وتطبيقات تجهيز الفيديو في كثير من الأحيان تسارعاً في معدل التسارع العالمي.**ويدعم Docker وحدات الـ NVIDIA من خلال مجموعة أدوات الحاويات NVIDIA.
  • إعداد مجموعة أدوات حاويات NVIDIADoكر ملف لـ تطبيق
  • جاري تنفيذGPUU بوصة DDuckrus
  • مثال حقيقي- العالم: خدمة الترجمة التحريرية مع وحدة المعامل GPU و بنايات وحدة المعالجهنا مثال إنتاج حقيقي من

CFsCed- nmt

services:
  translation:
    image: scottgal/mostlylucid-nmt:gpu
    container_name: translation-gpu
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
    environment:
      - MODEL_FAMILY=opus-mt
      - FALLBACK_MODELS=mbart50,m2m100
      - CUDA_VISIBLE_DEVICES=0
      - LOG_LEVEL=info
    volumes:
      - model_cache:/app/cache  # Persistent model storage
    ports:
      - "8888:8888"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8888/health"]
      interval: 30s
      timeout: 10s
      retries: 3

volumes:
  model_cache:

خدمة ترجمة للآلات العصبية بنيتها على هذه المدوّنة.

ويبين المشروع ما يلي:

services:
  translation:
    image: scottgal/mostlylucid-nmt:cpu
    container_name: translation-cpu
    environment:
      - MODEL_FAMILY=opus-mt
      - FALLBACK_MODELS=mbart50,m2m100
    volumes:
      - model_cache:/app/cache
    ports:
      - "8888:8888"
    restart: unless-stopped

volumes:
  model_cache:

معاملتا GPU وCU

  • scottgal/mostlylucid-nmt:gpu- نفس القاعدة الرمزية، مختلف القاعدة
  • scottgal/mostlylucid-nmt:cpu(أ) (أ) (أ) (أ) (أ) (أ)
  • scottgal/mostlylucid-nmt:gpu-min- الدعم AMD64 و ARM 64
  • scottgal/mostlylucid-nmt:cpu-minالصور المُرفر المُرْفِفِفّر

- المتغيرات الكاملة والدنياة على حد سواء

  • الإنتاج الجاهز- الفحوص الصحية، وثبات الحجم، وقطع الأشجار بصورة سليمة
  • دائرة الترجمة التحريرية المعجلةالمعالج - فقط البديل
  • **بالنسبة للبيئات الخالية من المعالجات المجهرية، نفس الخدمة تعمل على المعالج:**المُنتَزَع:
  • - CUDA 12.6 مع دعم PyTorch GPU (5-GB)- المعالج الوحيد، أصغر البصمة (~2.5GB)
  • - بناء الحد الأدنى من GPU، لا نماذج مُسبقة التحميل (- 4GB): /health- الحد الأدنى من بناء المعالج المعالج (- > 1,5GB)/readyالسمات الرئيسية:
  • التسارع: 10-15x ترجمة أسرع مع CUDA

دعم هذا: تنزيلات لنماذج الترجمة بناء على الطلبدعم الدعم

: Tries Opus-MM100 من أجل أقصى تغطية لغوية

معدل الثبات

: chack نماذج عبر إعادة تشغيل الحاويات

# Problem: Image built on M1 Mac won't run on Linux server
docker build -t myapp:latest .  # Builds for ARM64
docker push myapp:latest
# Server tries to run it... error: "exec format error"

# Solution: Build for multiple platforms
docker buildx build --platform linux/amd64,linux/arm64 -t myapp:latest --push .

نقاط الصحة

وقد عقد مؤتمراً بشأن

# Verify buildx is available
docker buildx version

# Create a new builder instance
docker buildx create --name multiarch --driver docker-container --use

# Inspect and bootstrap the builder
docker buildx inspect --bootstrap

# List available platforms
docker buildx inspect | grep Platforms

لأجهزة الترميز

متعدد Architititchtre

# Use official multi-arch base images
FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base

# For platform-specific operations, use build arguments
ARG TARGETPLATFORM
ARG BUILDPLATFORM

RUN echo "Building on $BUILDPLATFORM for $TARGETPLATFORM"

# Install architecture-specific dependencies
RUN if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \
        apt-get update && apt-get install -y some-arm64-package; \
    elif [ "$TARGETPLATFORM" = "linux/amd64" ]; then \
        apt-get update && apt-get install -y some-amd64-package; \
    fi

: تشغيل على x86_64 و ARM64 (الناشر Silicon, Rasptry Pi)

# Build and push for AMD64 and ARM64
docker buildx build \
  --platform linux/amd64,linux/arm64 \
  -t myregistry/myapp:latest \
  -t myregistry/myapp:1.0.0 \
  --push \
  .

# Build without pushing (loads into local Docker)
# Note: Can only load one platform at a time
docker buildx build \
  --platform linux/amd64 \
  -t myapp:latest \
  --load \
  .

# Build and export to tar files
docker buildx build \
  --platform linux/amd64,linux/arm64 \
  -t myapp:latest \
  -o type=tar,dest=./myapp.tar \
  .

- - - - - - - - - - - - - - -

مشروع كامل كامل المشروع على GetHub

لـ Dokkerfile أمثلة بناء نصوص نصية و API توثيق.

# Build multi-arch images first
docker buildx build --platform linux/amd64,linux/arm64 -t myapp:latest --push .

# Then use in compose
services:
  web:
    image: myapp:latest  # Already built for multiple architectures

بناءات متعددة Architititc مع Docكر بناء

#!/bin/bash
# build-multiarch.sh

docker buildx build --platform linux/amd64,linux/arm64 \
  -t myregistry/web:latest \
  -f web/Dockerfile \
  --push \
  web/

docker buildx build --platform linux/amd64,linux/arm64 \
  -t myregistry/worker:latest \
  -f worker/Dockerfile \
  --push \
  worker/

docker-compose pull  # Pull the multi-arch images
docker-compose up -d

من الضروري أن تعمل التطبيقات الحديثة على هياكل متعددة: x86_64 (AMD64) للخواديم، ARM64 لـ Raspbery Pi و Apple Silicon Macs، وأحيانا حتى ARM32 للأجهزة المضمنة.

لِمَ التعدّد التعدّد Archititicre مسائل

name: Build and Push Multi-Arch Images

on:
  push:
    branches: [ main ]
    tags: [ 'v*' ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Extract metadata
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: myregistry/myapp
          tags: |
            type=ref,event=branch
            type=semver,pattern={{version}}
            type=semver,pattern={{major}}.{{minor}}
            type=sha,prefix={{branch}}-

      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          context: .
          platforms: linux/amd64,linux/arm64
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          cache-from: type=registry,ref=myregistry/myapp:buildcache
          cache-to: type=registry,ref=myregistry/myapp:buildcache,mode=max

إعداد

  • Doker Boyx هو بوصة Doker سطح المكتب.
  • لِ::
  • متعدد Architititcht تنفيذ ملف
  • معظم ملفات الدوكر تعمل بدون تغييرات، لكن هنا بعض النصائح:
  • بناء المباني للمناشيات المتعددة

مُعدّد Archititchronus

لسوء الحظ، (دوكر كومبس) لا يدعم مباشرة البناء

مخرجات العمل:

الخيار 1: الصور السابقة للبناء

# Publish as a container image (no Dockerfile needed!)
dotnet publish --os linux --arch x64 -p:PublishProfile=DefaultContainer

# Specify image name and tag
dotnet publish \
  --os linux \
  --arch x64 \
  -p:PublishProfile=DefaultContainer \
  -p:ContainerImageName=myapp \
  -p:ContainerImageTag=1.0.0

# Multi-architecture
dotnet publish --os linux --arch arm64 -p:PublishProfile=DefaultContainer

&

مثال حقيقي على العالم: خط الأنابيب CC/CD.csproj:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>net9.0</TargetFramework>

    <!-- Container Configuration -->
    <ContainerImageName>myapp</ContainerImageName>
    <ContainerImageTag>$(Version)</ContainerImageTag>
    <ContainerRegistry>myregistry.azurecr.io</ContainerRegistry>

    <!-- Base image (defaults to mcr.microsoft.com/dotnet/aspnet:9.0) -->
    <ContainerBaseImage>mcr.microsoft.com/dotnet/aspnet:9.0-alpine</ContainerBaseImage>

    <!-- Container runtime configuration -->
    <ContainerWorkingDirectory>/app</ContainerWorkingDirectory>
    <ContainerPort>8080</ContainerPort>
    <ContainerEnvironmentVariable Include="ASPNETCORE_ENVIRONMENT">Production</ContainerEnvironmentVariable>

    <!-- User (security best practice) -->
    <ContainerUser>app</ContainerUser>

    <!-- Labels -->
    <ContainerLabel Include="org.opencontainers.image.description">My awesome app</ContainerLabel>
    <ContainerLabel Include="org.opencontainers.image.source">https://github.com/me/myapp</ContainerLabel>
  </PropertyGroup>
</Project>

GiTHub إجراءات سير العمل لـ متعدد الارشيفات بناء:

dotnet publish -p:PublishProfile=DefaultContainer

(أ) سير العمل:

  1. المحارز على دفعات إلى رئيسي أو نسخ مزامزيعيث QEMU لـ مُمثث
  2. بناءات AMD64 و ARM 64وسوم تلقائي (اسم الفرع، الإصدارات السمادنية، Sha)
  3. استخدامات سِجِجِسْسِ السجل لـ أكثر سرعة٩ تحسينات في الحاويات
  4. **net 9 إدخال تحسينات هامة على دعم الحاويات، مما يجعل من الأسهل أكثر من أي وقت مضى نقل تطبيقات الشبكة دون حتى كتابة ملف دوكر.**إنشاء الحاويات
  5. **مع NET 9، يمكنك نشر طلب الحاوية مباشرة:**خصائص ح الحاويات

إلى

<PropertyGroup>
  <!-- Enable trimming to remove unused code -->
  <PublishTrimmed>true</PublishTrimmed>
  <TrimMode>full</TrimMode>

  <!-- OR use Native AOT for even smaller, faster images -->
  <PublishAot>true</PublishAot>
</PropertyGroup>

(ب) ثم تقوم بما يلي:

  • ميزات دعم الحاويات المُبنيةلم يكن هناك حاجة لـ
  • :: الحد من التعقيدالصور المُرْسِفة
  • ميكرو ميكروسوفت يلهز الصور للأداءمع فرق

:الصور القياسية في جميع أنحاء كل أنحاء العالم.

1 ف-5، 1 ف-4، 1 خ ع (ر أ)، 1 خ ع (ر أ)

FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
WORKDIR /src
COPY ["MyApp.csproj", "."]
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o /app/publish

FROM mcr.microsoft.com/dotnet/aspnet:9.0
WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "MyApp.dll"]

معلومات محدَّثة عن قاعدة بيانات آلية

# Just this!
dotnet publish -p:PublishProfile=DefaultContainer

أصغر

دعم الترميم والتجميع

الترميم ونقطة التصحيح للصور الصغيرة

  • النتائج:
  • : ٢٢٠ / ٢ / ٢ / ٢
  • مع مُثثاق

# 110 قُنصاً

  • مع الوتيرة
  • ~12MB لتطبيقات بسيطة!
  • المقارنـة: Dokerfile vs Built-in
  • نهج Dokrfile التقليدي:

(أ) نهج الحاوية المثبتة في المنشأة:

وكلتاهما تنتج صورا متشابهة، ولكن النهج الداخلي أبسط وأكثر قابلية للصيانة.

<PropertyGroup>
  <ContainerBaseImage>mcr.microsoft.com/dotnet/aspnet:9.0-noble-chiseled</ContainerBaseImage>
</PropertyGroup>

إلى جاري استخدام DOkر ملف vs bulet- in

  • ****تحتاج إلى السيطرة الكاملة على الصورة
  • مُعتمدات النظامبناءات متعددة المراحل
  • صور الأساس غير القياسيةالتركيز:::

معياري Net Web/ consule streats

  • تريد البساطة
  • لِيَدْرِيج ميكرو مايكروس

سريع مُطَبّط

مُزَلَد مُطْرَد

NET 9 يدعم "مشوهة" أوبونتو صور - صور قاعدية فائقة الحد الأدنى:

الاستحقاقات:

تَي تَيْ تَيْ ت ت ت

  1. > 50% أقل من الصور العادية1 ف-4، 1 ف-3، 1 خ م، 1 م و، 1 م و، 1 م و، 1 م و، 1 م و، 1 م أ م و، 1 م أ م
  2. **الحد الأدنى لسطح الهجوم (لا يوجد مدير رزمة، قذيفة)**طراز AFS
  3. **:: عمليات سحب وبداية أسرع:**المقاصات:
  4. **لا صدم (يُجلد إلى تصحيح)**مرافق نظامية
  5. **الكمال للإنتاج حيث الأمن والحجم أكثر أهمية.**مقدمة إلى المصدر الصافي

هو عبارة عن كومة سحابية جاهزة للرأي من أجل التطبيقات الموزعة للبناء.

فكّر في الأمر كما لو أنّ (دوكر) يُجمّع على المنشّطات، مُصمّم خصيصاً للخدمات الصّغيرة لشبكة الإنترنت.

  1. **ما هو الاسپير ؟**يقوم المبرَز بما يلي:
  2. (أ) ت))): تشغيل واتصال خدمات متعددة محلياً
  3. الخدمة: الخدمات تجد بعضها البعض تلقائياً

التلاطس

: البناء في عمليات قطع الأشجار والقياس والتعقب والتعقب

dotnet new aspire-starter -n MyDistributedApp
cd MyDistributedApp

العنصر العنصر العنصر

var builder = DistributedApplication.CreateBuilder(args);

// Add Redis cache
var cache = builder.AddRedis("cache");

// Add PostgreSQL database
var db = builder.AddPostgres("postgres")
               .AddDatabase("mydb");

// Add API service (references cache and db)
var api = builder.AddProject<Projects.MyApi>("api")
                 .WithReference(cache)
                 .WithReference(db);

// Add frontend (references API)
builder.AddProject<Projects.MyWeb>("web")
       .WithReference(api);

builder.Build().Run();

: التكاملات المهيأة مسبقاً (Redes, PostgreSQL, AnteMQ, etc.)

// MyApi/Program.cs
var builder = WebApplication.CreateBuilder(args);

// Aspireing
3.  Multi-stage builds to reduce image size
4.  Use `.dockerignore` generously
5.  Alpine/chiseled images for smaller size
6.  Use volume mounts for development
7.  Configure appropriate resource limits
8.  Use health checks for orchestration

## Troubleshooting Common Issues

### Container Won't Start

```bash
# Check logs
docker logs container-name

# Common issues:
# 1. Port already in use
docker ps | grep 8080  # Find conflicting container
docker stop conflicting-container

# 2. Missing environment variables
docker inspect container-name | grep Env

# 3. Failed health check
docker inspect container-name | grep Health -A 20

النشر

# Enable BuildKit for faster builds
export DOCKER_BUILDKIT=1

# Use build cache
docker build --cache-from myapp:latest -t myapp:latest .

# Check what's taking time
docker build --progress=plain -t myapp:latest .

إعداد Kobernets/ docker Compus بيانات

# Containers can't communicate
# Solution: Ensure they're on the same network
docker network ls
docker network inspect network-name

# DNS not working
# Container names are DNS names within Docker networks
docker exec web ping db  # Should work if both on same network

الهيكل الإسنادي

# Permission denied on volume
# Solution: Match user IDs
FROM ubuntu
RUN useradd -u 1000 appuser  # Match host user ID
USER appuser

ولحل البصيرة ثلاثة أنواع من المشاريع:

المُلَكُ المضيف مُلَكُهَسُ

  • : أوكسكرترات خدماتكالمشروعات
  • : خدماتك الفعلية (المؤشرات القياسية لأسعار الإنتاج على شبكة الإنترنت، والعمال، وما إلى ذلك)
  • **:التشكيلات المشتركة (التشغيل، والفحوص الصحية، وما إلى ذلك)**مثال كويك
  • ١ -أنشئ هذا المشروع::
  • **)٢( A.**البلد المضيف (مرفقي (الموزع عليّ App.App Hotst/Program.cs)
  • أولاً -المستخدم في خدمتك:

بطيئة عمليات

قضايا شبكة

Happy containerizing! 🐳 دعم مبنى

services:
  smtp4dev:
    image: rnwood/smtp4dev
    ports:
      - "3002:80"
      - "2525:25"
    volumes:
      - e:/smtp4dev-data:/smtp4dev
    restart: always

  postgres:
    image: postgres:16-alpine
    container_name: postgres
    ports:
      - "5432:5432"
    env_file:
      - .env
    volumes:
      - e:/data:/var/lib/postgresql/data
    restart: always

: LEPERAGE EDOCCER Compus for multer-servs anutement

  • طراز A/MLدعم وحدة الاتصال لأعباء العمل الكثيفة الحساب
  • مقدمات متعدّلة: استخدام بناء لتوافق ARM وAMD64
  • الشبكة العالمية للتبسيط: نشر الحاويات

الموقع الشبكي لنموذج التطبيقات الموزعة:ويوفر النظام الإيكولوجي للحاويات أدوات لكل سيناريو.

بداية بسيطة، مُكرّرة، وتتبنّى تدريجياً الميزات المتقدّمة مع نموّ احتياجاتك.

ثانياً - الموارد

services:
  # Core application
  mostlylucid:
    image: scottgal/mostlylucid:latest
    restart: always
    env_file: .env
    volumes:
      - ./markdown:/app/markdown
      - ./logs:/app/logs
    networks:
      - app_network
    deploy:
      resources:
        limits:
          memory: 512M
          cpus: '1.0'
        reservations:
          memory: 256M

  # Database only
  db:
    image: postgres:16-alpine
    env_file: .env
    volumes:
      - db_data:/var/lib/postgresql/data
    networks:
      - app_network
    deploy:
      resources:
        limits:
          memory: 512M
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"]
      interval: 30s
      timeout: 5s
      retries: 3

  # Caddy for HTTPS
  caddy:
    image: caddy:latest
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data
    networks:
      - app_network
    deploy:
      resources:
        limits:
          memory: 128M

volumes:
  db_data:
  caddy_data:

networks:
  app_network:

  • ****/ / / / / / /
  • وثائق مصادر المعلوماتعُدَّة حاويات NVIDIAdocker logsتنفيذ تنفيذ
  • **فقط ما تحتاج إليه:**لماذا يعمل هذا من أجل التنمية:
  • SMMTP4Devاختبر وظيفة بريد البريد الإلكتروني بدون خادم SMTP
  • المرشّسSQL:: قاعدة بيانات الإنتاج

مجموع البكة

~200MPMPRAM vss 2-4-4GB للكم الكامل

- - - - - - - - - - - - - - -

# Just app + database + reverse proxy
docker-compose up -d mostlylucid db caddy

المحتويات (تابع)

# Add lightweight monitoring
docker-compose up -d mostlylucid db caddy seq
# Use Seq free 10GB/month

للتعليمات التكتيكية.

# Add everything
docker-compose up -d

إعدادات الإنتاج المركزة على الموارد

(أ) فيما يتعلق بالميزانية، تعطي الأولوية للخدمات الأساسية:

services:
  myapp:
    image: postgres:16-alpine     # 50% smaller than postgres:16
    # vs
    image: postgres:16            # Full Debian base

**ما هو المزال والبدائل:**لا يوجد برومثيوس/غلافانا

:: استخدام الرصد الخارجي (المستوى المجاني في مرحلة ما بعد الظهر، والمستوى الحر في تحسين Stack)

لا رقم رقم SE

db:
  image: postgres:16-alpine
  # One instance, multiple databases
  # Umami, Mostlylucid, etc. all share this PostgreSQL

**: استخدام قطع الأشجار المستند إلى الملف +**أو مستوى حر من السحب

لا يوجد برجب

easynmt:
  deploy:
    resources:
      limits:
        cpus: "2.0"      # Don't let translation consume all CPU
      reservations:
        cpus: "0.5"      # Guarantee minimum

: دليل تحديثات مع إخطارات إجراءات GigtHub

1 خ ع (ر أ)

تشغيل بناءً على الطلب في حاوية منفصلة تبدأ/تتوقف يدوياًالمـوارد المـوجـ مـن الأميـن الأميـ: منع أي خدمة واحدة من استهلاك جميع الذاكرة

mostlylucid:
  volumes:
    - /mnt/imagecache:/app/wwwroot/cache  # ImageSharp cache persists across restarts

استراتيجية موريشيوسالحد الأدنى، إضافة الخدمات حسب الحاجة:

المرحلة 1: العنصر الأساسي (512 ميغ ميغ ميغاباغ واحد من طراز VPS)

المرحلة 2: إضافة ملاحظة (2GB VPSS) |---------|-----------------|---------------------| المرحلة 3: الوزن الكامل (4GGB+ VPS) تكنولوجيا استخدام الموارد ١ -


: الصور في الألب أصغر بنسبة 50 إلى 70٪ أصغر

)٢( A.

# Create a separate compose file
# translation-compose.yml
services:
  easynmt:
    image: easynmt/api:2.0.2-cpu
    ports:
      - "8888:8888"
    volumes:
      - /mnt/easynmt:/cache/

# Only run when needed
docker-compose -f translation-compose.yml up -d

# Translate your content
# ...

# Shut down when done
docker-compose -f translation-compose.yml down

قاعدة البياناتبدلاً من قاعدة بيانات واحدة لكل خدمة، استخدم حالة PostgreSQL مع قواعد بيانات متعددة:

: 400MPRAM لكل قاعدة بيانات إضافية توحدها

# Minimal production compose
services:
  mostlylucid:
    image: scottgal/mostlylucid:latest
    restart: always
    env_file: .env
    volumes:
      - /mnt/markdown:/app/markdown
      - /mnt/logs:/app/logs
      - /mnt/imagecache:/app/wwwroot/cache
    depends_on:
      - db

  db:
    image: postgres:16-alpine
    env_file: .env
    volumes:
      - /mnt/postgres:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready"]
      interval: 30s

  cloudflared:
    image: cloudflare/cloudflared:latest
    command: tunnel run --token ${CLOUDFLARED_TOKEN}
    restart: always

  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      WATCHTOWER_CLEANUP: "true"
      WATCHTOWER_LABEL_ENABLE: "true"
    command: --interval 3600  # Check once per hour, not every 5 minutes

أولاً -

  • الحد الحد الحد الحد الحد الحد الحد الحد الحد الحد الحد الحد الحد الحد الحد الحد الحد الحد بالنسبة لخدمات المعلومات الأساسية
  • هذا يمنع الوظائف الخلفية من تجويع طلبك على الإنترنت.
  • أولاً -

المجلدات

  • مغطية في
  • صورة جاري مع مع تنفيذdocker logs(ب) إعداد أدلة المخابئ التي تمنع إعادة المعالجة غير الضرورية:
  • السبب في أن الأمر يهم
  • : بدون هذا، كل حاوية تعيد تجديد كل الأظافر/الصور المجهزة.
  • 5 - مكتب الأمم المتحدة في نيويورك

خدمات الاستخدام الخارجي (مجارف مجانية)

RAMS SEME-HOCTS: بديل خارجي

سُجَّل = 500 ميغابايت / كيلوغرام سُجَّل (10 جنيهات استرلينية/شهرية مجاناً) □

# Simple health check script
#!/bin/bash
while true; do
  curl -f http://localhost/healthz || echo "Health check failed!" | mail -s "Alert" [email protected]
  sleep 300
done

*** Prometheus + Grafana o ~600 / / غرافانا سحابة (طبقة حرّة) □**

# Watch for errors
docker-compose logs -f --tail=100 | grep -i error

# Email on critical errors
docker-compose logs -f | grep -i "critical" | while read line; do
  echo "$line" | mail -s "Critical Error" [email protected]
done

□ أومامي أو - 200 ميغابايت / لا يمكن استخدامها (مدفوعة) أو ذاتية الاستعمال في مكان آخر □

# Quick resource check
docker stats --no-stream

# Pretty output
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"

الاستراتيجية الاستراتيجية

تحميل ملاحظة إلى حرّر المستويات، إبقاء تطبيق أساسيّ على VPS.

٦ -

خدمات التهديم

# Add Aspire to your solution
dotnet new aspire-apphost -n Mostlylucid.AppHost
cd Mostlylucid.AppHost

بالنسبة للخدمات التي لا تُستخدم إلا نادراً مثل الترجمة التحريرية:

var builder = DistributedApplication.CreateBuilder(args);

// PostgreSQL with persistent data
var postgres = builder.AddPostgres("postgres")
    .WithDataVolume()  // Persistent storage
    .WithPgAdmin();     // Optional: PgAdmin for database management

var mostlylucidDb = postgres.AddDatabase("mostlylucid");
var umamiDb = postgres.AddDatabase("umami");

// Seq for centralized logging
var seq = builder.AddSeq("seq")
    .WithDataVolume();

// Redis for caching (if needed)
var redis = builder.AddRedis("cache")
    .WithDataVolume()
    .WithRedisCommander();  // Optional: Redis Commander UI

// Main blog application
var mostlylucid = builder.AddProject<Projects.Mostlylucid>("web")
    .WithReference(mostlylucidDb)
    .WithReference(seq)
    .WithReference(redis)
    .WithEnvironment("TranslateService__Enabled", "false")  // Disable for dev
    .WithHttpsEndpoint(port: 7240, name: "https");

// Umami analytics
var umami = builder.AddContainer("umami", "ghcr.io/umami-software/umami", "postgresql-latest")
    .WithReference(umamiDb)
    .WithEnvironment("DATABASE_TYPE", "postgresql")
    .WithEnvironment("TRACKER_SCRIPT_NAME", "getinfo")
    .WithEnvironment("API_COLLECT_ENDPOINT", "all")
    .WithHttpEndpoint(port: 3000, name: "http");

// Translation service (CPU version, with resource limits)
var translation = builder.AddContainer("easynmt", "easynmt/api", "2.0.2-cpu")
    .WithDataVolume("/cache")
    .WithHttpEndpoint(port: 8888, name: "http")
    .WithEnvironment("MODEL_FAMILY", "opus-mt");

// Scheduler service (Hangfire background jobs)
var scheduler = builder.AddProject<Projects.Mostlylucid_SchedulerService>("scheduler")
    .WithReference(mostlylucidDb)
    .WithReference(seq);

// Prometheus for metrics
var prometheus = builder.AddContainer("prometheus", "prom/prometheus", "latest")
    .WithDataVolume()
    .WithBindMount("./prometheus.yml", "/etc/prometheus/prometheus.yml")
    .WithHttpEndpoint(port: 9090);

// Grafana for visualization
var grafana = builder.AddContainer("grafana", "grafana/grafana", "latest")
    .WithDataVolume()
    .WithHttpEndpoint(port: 3001)
    .WithEnvironment("GF_SECURITY_ADMIN_PASSWORD", builder.Configuration["Grafana:AdminPassword"] ?? "admin");

builder.Build().Run();

: 1-2GBRM عندما تكون خدمة الترجمة غير جاريةأولاً - مقدمةهذا ما يعمل على 6$ شهرياً هيتزنر VPS (2 vCPU، 4GPRM):

// Extensions.cs
public static class Extensions
{
    public static IHostApplicationBuilder AddServiceDefaults(this IHostApplicationBuilder builder)
    {
        // OpenTelemetry
        builder.Services.AddOpenTelemetry()
            .WithMetrics(metrics =>
            {
                metrics.AddAspNetCoreInstrumentation()
                    .AddHttpClientInstrumentation()
                    .AddRuntimeInstrumentation();
            })
            .WithTracing(tracing =>
            {
                if (builder.Environment.IsDevelopment())
                {
                    tracing.SetSampler(new AlwaysOnSampler());
                }

                tracing.AddAspNetCoreInstrumentation()
                    .AddHttpClientInstrumentation()
                    .AddEntityFrameworkCoreInstrumentation();
            });

        // Health checks
        builder.Services.AddHealthChecks()
            .AddCheck("self", () => HealthCheckResult.Healthy(), tags: new[] { "live" });

        return builder;
    }

    public static IApplicationBuilder MapDefaultEndpoints(this WebApplication app)
    {
        app.MapHealthChecks("/healthz");
        app.MapHealthChecks("/ready", new HealthCheckOptions
        {
            Predicate = check => check.Tags.Contains("ready")
        });

        return app;
    }
}

مجموع الموارد المستخدمة:

var builder = WebApplication.CreateBuilder(args);

// Add Aspire service defaults (telemetry, health checks)
builder.AddServiceDefaults();

// Add services
builder.AddNpgsqlDbContext<MostlylucidDbContext>("mostlylucid");
builder.AddRedisClient("cache");

// Existing service registrations...
// builder.Services.AddControllersWithViews();
// etc...

var app = builder.Build();

// Map Aspire default endpoints
app.MapDefaultEndpoints();

// Existing middleware...
app.Run();

RAM: حوالي 800 ميغ ميغابايت (الآذان 3-2 ميغابايت حرّة)

القرص:

  1. المعالج المعالج: < 10% خامل، < 50% تحت التحميل: dotnet run --project Mostlylucid.AppHostما هو الاختلاف:
  2. **لا Prometheus/غرافانا (يستخدم وقت الفراغ Robot + تحليل الزهرة السحابية)**لا رقم SEq (الاستخدام)
    • )ج ص ص ص ص م(
    • لا يوجد أمّيّة (يُستخدم شبكة المعلومات عن التحليل - مجاناً)
    • عدد مرات برج المراقبة كل ساعة بدلا من كل خمس دقائق
    • لا توجد خدمات ترجمة تحريرية (يجري تشغيلها يدويا عند الحاجة)
  3. رصد الميزانيةبدون بروميثيوس/غرافانا، استخدم هذه البدائل الحرة:
  4. **الرصد الصحي:**1 - رصد السجل:.env1 مد-1: 1 ف-5، 1 ف-4، 1 ف-3، 1 ف-3، 1 ف-3، 1 ف-3، 1 خ م، 1 خ م، 1 خ م، 1 خ م، 1 م و، 1 م أ م

النسخة الأصلية: الطريق الشبكي

الآن دعونا نعيد رسم صورة كامل الرزمة باستخدام. Net Aspire.

# Generate Docker Compose
dotnet run --project Mostlylucid.AppHost -- \
  --publisher compose \
  --output-path ./deploy

# This creates a production-ready docker-compose.yml
cd deploy
docker-compose up -d

**وهذا يعطيكم كل فوائد الفرز مع تكامل أفضل بين الشبكة وتجربة تطويرية مذهلة.**إعداد الواجهة لـ

services:
  postgres:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    volumes:
      - postgres-data:/var/lib/postgresql/data

  mostlylucid-db:
    image: postgres:16
    # Database initialization

  seq:
    image: datalust/seq:latest
    environment:
      ACCEPT_EULA: Y
    volumes:
      - seq-data:/data

  web:
    image: scottgal/mostlylucid:latest
    environment:
      ConnectionStrings__mostlylucid: Host=postgres;Database=mostlylucid;Username=postgres;Password=${POSTGRES_PASSWORD}
      ConnectionStrings__cache: cache:6379
    depends_on:
      - postgres
      - cache
      - seq

  cache:
    image: redis:7-alpine
    volumes:
      - redis-data:/data

  # ... other services

أولاً، إنشاء مُضيف المُعلِم:

POP Hhost/ Program.cs:

--------- --------------- -------------
seServ معاينة الدفاعالمشروع:
تحديث اللّسِىluccid/ Progr.csفوائد النهج المُطْبِر
الخبرة المكتسبة في مجال التنمية: docker-compose up dotnet run
"يبدأ كل شيء"
:UI جميل على الموقع http://docalhost:15888 يظهر: docker logsجميع الخدمات التي تعيش فيها
سجلات الدخول من جميع الخدمات في مكان واحدتوزيع الآثار على الخدمات
الاختبارات الطبية والفحوص الطبيةالخدمة
: الخدمات تجد بعضها البعض تلقائياً عن طريق الأسماء

: مركزة في App Hust، لا أكثر

مـن م م م م م م م م م م م م م م م م م م م

  • النشر:
  • بيانات الوزع المسمّى من Aspire:
  • مُولِثَةً كُكِر - كُنَز.
  • (يسهل):
  • Aspire vs التقليديD Dokcr

□ الميزات □ يُكوِّل Dokker combumww.net

  • إنشاء
  • دليل YAML C# رمز مع IntliSense

  • الخدمة
  • □ الدليل env vars / تلقائي

يَجْلبُ oكَ الخاصَكَ بنيتَ في (عَمَل التَعَلُّق) o

  • 1 ف-5، 1 ف-4، 1 ف-3، 1 خ ع (رأ)، 1 خ ع (رأ)، 1 خ ع (رأ)، 1 خ ع (رأ)، 1 خ ع (رأ)، 1 خ ع (رأ)
  • باء + منسَبَبَة
  • جاري م_ م_ م_ م_ م_ م_ م_ م_ م_ م_ م_ م_ م_ م_ م_ م_ م_ م_ م_ م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م م

□ مرفق بالحاوية □ □ F5 في استوديو بصري □ □

  1. **▪ رُسَّلَتْ رُسَّلَتْ الرُسْسَلَةُ**الملتليج
  2. **• الإعداد يدوياً للتعقب الموزع آلياً**1 ف-4، 1 ف-3، 1 خ م، 1 خ ع (ر أ)
  3. استخدام YAML مباشرة& هذا
  4. **# YAML يَعْملُ تَصْنِيعُ # C# أنت تَعْرفُ #**متى إلى استخدام إلى استخدام جاري تنفيذ v vs Dokr Comsts
  5. ****الخدمات الصغيرة في المباني

تريد مُدمجاً في عملية التصحيح

  • فريق مُريح مع C
  • تحتاج إلى توزيع التعقب خارج الصندوق
  • أنت نشر إلى Azur Azure حاوي تطبيقات (دعم محلي)
  • مستخدم دونكر المُقرّر عند::
  • خدمات تعدد اللغات (Node.js, Python, Go, et al.)
  • الفريق يفضل الهياكل الأساسية - حسب الشفرة - YAML

نُشر إلى أي مضيف مُقَرِّر

تحتاج إلى الحد الأقصى من التحكم في الإعداد

  1. حالات النشر ذات الخدمة الواحدة
  2. استخدام:
  3. الإسناد إلى التنمية المحلية
  4. إعدادات لوزع الإنتاجlatest)
  5. أفضل من كل العالمين!
  6. يجري تطوير من هذا قائمة مُثبث مُثبث مَث_ من هذا مُنت.dockerignoreتُظهر رحلة Doker هذه المُدوّنة تَطَوُّرًا نمطيًّا:
  7. تموز/يوليه 2024 - بدء بسيط
  8. : فقط التطبيق، سحابة، وبرج المراقبة

آب/أغسطس 2024 - الأقاليم

    • تضاف خدمات إنمائية لا غير
  1. آب/أغسطس 2024 -
    • أذونات الحجم المُحلّلة للتثبيت.envتشرين الثاني/نوفمبر 2024 - كامل
  2. : الرصد الكامل مع بروميثيوس، غرافانا، سكس
  3. اليوم اليومdepends_onالخيار الأساسي للتنمية على الشبكة العالمية
  4. الدروس المستفادة:
  5. ببساطة، إضافة التعقيد عند الحاجة فقط
  6. الممثلان الخاصان المعنيان بالفرد والانتـاج

حدود الموارد التي تمنع خدمة واحدة من قتل أخرى

  1. تحقيق وفورات كبيرة في حجم الكميات المخصصة للمخلّبات في وقت إعادة المعالجة
  2. مُمَ تمكين المُنْدِر المُعَدّات التلقائية المُعَدّات
  3. (أ) القيمة المقدرة هي قيمة تكلفة الموارد في الإنتاج؛
  4. أولاً - موجز
  5. مرففِر مرفففف
  6. دال- دال-
  7. تنفيذ غير تنفيذ- تنفيذ
  8. أمر الأمر أوامر لـ مثلثثثG

  1. إجراء فحوص صحية
  2. لاستبعاد الملفات غير الضرورية
  3. الطبقات المصغرة (أوامر أوامر RUUN).dockerignore& مُعامل بناء المُعامل لِالمرونة
  4. مُرسِل المُرسِل حرّس أفضل الممارسات
  5. تنفيذ عمليات الفحص الصحي

(لا يُرتكب)

تعريف الشبكات الصريحة

# Check logs
docker logs container-name

# Common issues:
# 1. Port already in use
docker ps | grep 8080  # Find conflicting container
docker stop conflicting-container

# 2. Missing environment variables
docker inspect container-name | grep Env

# 3. Failed health check
docker inspect container-name | grep Health -A 20

# Enable BuildKit for faster builds
export DOCKER_BUILDKIT=1

# Use build cache
docker build --cache-from myapp:latest -t myapp:latest .

# Check what's taking time
docker build --progress=plain -t myapp:latest .

مع الظروف الصحية

# Containers can't communicate
# Solution: Ensure they're on the same network
docker network ls
docker network inspect network-name

# DNS not working
# Container names are DNS names within Docker networks
docker exec web ping db  # Should work if both on same network

أمر إعادة إعادة إعادة بدء

# Permission denied on volume
# Solution: Match user IDs
FROM ubuntu
RUN useradd -u 1000 appuser  # Match host user ID
USER appuser

خ مُمْكِنDv/ مُعَدّد

حدود الموارد في الإنتاج

أفضل الممارسات في مجال أفضل الممارسات

تنفيذ غير تنفيذ- تنفيذ

سُجج

  • إنشاءات متعددة المراحل لتقلل حجم الصورة
  • السخ
  • الصور المائلة/الملونة للحجم الأصغر
  • استخدام سلاسل الحجم لأغراض التنمية

& أمر

  • الفحص الصحي للانتقاق
  • لا يمكن البدء بالحاويات
  • بطيئة عمليات
  • قضايا شبكة
  • أولاً - المسائل

ثالثاً - استنتاج

  • وقد تطور Doker من أداة بسيطة للنقل بالحاويات إلى منصة شاملة للبناء والشحن وتشغيل التطبيقات الحديثة.
  • لقد أخذكم هذا الدليل من الأساسيات إلى عمليات نشر جاهزة للإنتاج، مع أمثلة للعالم الحقيقي من تشغيل mosterlucid.com.
  • يُقتدِد على
  • للمبتدئين:
  • ابدأ مع

الدالة struus

    • 3 فقط 3 خدمات
  • التنمية الاقتصادية والتنمية المستدامة - الاعتمادات
  • للعمل المحلي

قضايا مشتركة مثل:

المُرْسِلِلَات

مبكِِِِِِِِِِِِِِِ |-------|----------|-----------|------------| | **للمجالس الذاتية المعنية بالميزانية:**البداية الحد الأدنى: App + قاعدة البيانات + المكسس العكسي (~800MBRAM) | إستعمل الـQي لـ و مورِدمعاينة الحمولة إلى مستويات حرّة (السحب التالي، وغرافانا سحاب، وأوبت تايم روبوت) | خدمات باهظة الثمن (ترجمة، ML) عند الطلب فقطيمكن لـ 6 دولارات شهرياً لـ VPS تشغيل مدوّنة إنتاج مع غرفة لتفريغها | **لأغراض النشر الإنتاجي:**تدقيقات صحية تمكِّن من تحديثات مع برج برج المراقبة عن طريق تحديثات عند الصفر | **شبكات مستقلة توفر الأمن (الواجهة الأمامية/العزل الخلفي)**مُلزم لـ البيانات إلى دعم/ وصول

المجلدات المسمّاة للتخزين الذي يُدار بواسطة DOckrم ح م م/حدود زمنية لمنع تجويع الموارد

يزيل النفق الحاجة إلى عناوين IP العامة

بالنسبة لمطوري الشبكة:

  • نشر الحاويات المبنية في الموقع الشبكي 9 يزيل ملفات الدوكر في التطبيقات البسيطةصور أوبونتو المهجدة توفر سطحاً هجومياً بسيطاًتقدم شبكة الإنترنت معلومات عن أفضل الخبرات الإنمائية المحلية
  • يمكن أن يولّد المُجمّع المُعدّل للوزع الإنتاجيتكامل تيليات مفتوحة يأتي حراً مع Aspire
  • **بالنسبة لحالات الاستخدام المتقدم:**الحاويات التي تُمكِّن ML/AI من القيام بأعباء العمل بسرعة تتراوح بين 10 و 15 x
  • ARRM64 وAMD64 من مصدر واحدجِيجTHHhul إجراءات إجراء إجراءات التشغيل التشغيل التشغيلات متعددة---- لتوفر(أ) ما يلي: (أ) ما يلي: (ب) ما يلي: (ب)
  • الـ سفرةهذه المدوّنة لتطور Doker مرآة تقدم نمطي:

الخدمات والخدمات المقدمة

المرحلة الأولى

(تشرين الثاني/نوفمبر 2024) o مراقبة كاملة o - 3.5GB o إنتاج o

  1. المرحلة الخامسة(اليوم) o + + خيار اسبير / متغير / معاصر /
  2. (المتوسط): البداية بسيطة، حل المشاكل كلما نشأت، إضافة التعقيد فقط عند الحاجة.
  3. ما هو التالي؟يعتمد على مسارك:
  4. الأمر المُفكر

البدء بـ:

المستكشفة: NET Aspis

Happy containerizing! 🐳

logo

© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.