CONTAINER APPS · VAKA ETÜDÜ
docker-compose.yml'den canlı uygulamaya — panelde ve cdnctl ile
Platformu hızla denemek isteyen geliştiriciler için eksiksiz, kopyala-yapıştır bir anlatım. Küçük ama gerçekçi çok servisli bir projeyi — bir web API, bir arka plan worker'ı ve yönetilen Postgres + Redis — tek bir docker-compose.yml'den doğrudan CDN.com.tr Managed Containers üzerinde çalıştırıyoruz. Aynı senaryo iki yolla gösteriliyor: yönetim panelinden tıkla-ve-yap, ve uçtan uca cdnctl CLI ile. Hangisini isterseniz onu seçin.
Her biri yönetilen Postgres ve Redis eklentisine bağlı iki yönetilen uygulama (web, worker) ve kendi https://<uid>.cdn.com.tr alt alan adında canlı web uygulaması — hepsi compose dosyasından oluşturulmuş; Dockerfile ya da Kubernetes YAML'ı yok.
Örnek proje
web servisi ziyaretleri Postgres'te sayar ve son sayıyı Redis'te cache'ler; worker, aynı yönetilen eklentileri paylaşan portsuz bir arka plan döngüsüdür. İki imaj da önceden derlenmiş ve platformun çekebileceği bir registry'ye gönderilmiştir (linux/amd64 için derlenmiş). Platform bağlantı bilgilerini otomatik enjekte eder — kodunuz yalnızca DATABASE_URL ve REDIS_URL okur.
# docker-compose.yml
services:
web:
image: mediatriple/compose-demo-web:1.0.0
ports:
- "8080:8080" # container port 8080 is exposed; the host side is ignored
environment:
APP_NAME: "Compose Demo"
healthcheck:
test: ["CMD", "wget", "-qO-", "http://localhost:8080/health"]
depends_on: [db, cache]
worker:
image: mediatriple/compose-demo-worker:1.0.0 # no port -> stays private
depends_on: [db, cache]
db:
image: postgres:16 # -> managed Postgres add-on (DATABASE_URL injected)
cache:
image: redis:7 # -> managed Redis add-on (REDIS_URL injected)
Servisler nasıl eşlenir. Önceden derlenmiş imajı olan her servis bir yönetilen uygulama olur. İmajı postgres, mysql/mariadb, redis ya da nats olan servisler yönetilen eklentiye dönüşür ve onlara depends_on ile bağlı her uygulamaya iliştirilir — tüketen her uygulama kendi eklenti örneğini alır; kimlik bilgileri env (DATABASE_HOST/PORT/NAME/USER, REDIS_URL) ve secret (DATABASE_PASSWORD, DATABASE_URL) olarak enjekte edilir. build: içeren (önceden derlenmiş imajı olmayan) bir servis reddedilir — önce bir imaj yayınlayın. En fazla 20 servis.
A · Panelden
1 · Container Apps'i açın
Giriş yapın, CDN Hesaplarını açın, hesabınızın ayarlar simgesine tıklayın ve Platformlar sekmesini, ardından Container Apps'i seçin (ilk seferde Activate'e basın). Genel bakış, paket limitlerinizi ve boş uygulama listesini gösterir.
2 · (Private imajlar) registry kimlik bilgisi ekleyin
İmajlarınız private ise Create App'i açın ve Private registry credential satırına bir ad, registry URL'i (Docker Hub için https://index.docker.io/v1/), kullanıcı adınızı ve salt-okunur bir erişim token'ı girip kaydedin. Token şifreli saklanır ve bir daha gösterilmez. Public imajlar için kimlik bilgisi gerekmez.
3 · Import From Docker Compose
Import From Docker Compose'a geçin ve docker-compose.yml'inizi yükleyin ya da yapıştırın (en fazla 256 KB).
4 · Planı önizleyin
Preview'a tıklayın. Platform dosyayı çözümler ve tahribatsız bir plan gösterir: oluşturacağı her uygulama, imaj/port/replika, bağlanan eklentiler ve uyarılar — henüz hiçbir şeye dokunmadan.
web (port 8080) ve worker. Uyarı, host-port eşlemelerinin yok sayıldığını belirtir — uygulamaları platformun expose/domain akışıyla yayınlarsınız.5 · Uygulayın, deploy'u izleyin
I have reviewed this plan kutusunu işaretleyip Apply Import'a tıklayın. Uygulama ya-hep-ya-hiç çalışır; uygulamalar ve eklentiler oluşturulur, deploy'lar kuyruğa alınır. Bir dakika içinde uygulamalar Your apps listesinde running'e döner.
web ve worker) Your apps listesinde çalışıyor. Eklentilerine ve Expose on cdn.com.tr eylemine ulaşmak için bir uygulamayı açın (Manage →).6 · Web uygulamasını yayınlayın
web uygulamasını açın (Manage →) ve anında bir <uid>.cdn.com.tr alt alan adı üretmek için Expose on cdn.com.tr'ye tıklayın (HTTPS sizin için halledilir). worker'ı özel bırakın. Bu kadar — compose projeniz canlıda. Sonuca bakın ↓
B · Terminalden (cdnctl)
Yukarıdaki her adımın bir CLI karşılığı var. cdnctl'i kurun, sonra:
1 · Giriş yapın ve hesabınızı bulun
cdnctl login --email you@example.com --password '••••••'
cdnctl accounts list # copy your account <uuid>
2 · Planı önizleyin
Panelle aynı tahribatsız plan — uygulamaları, eklentileri ve uyarıları JSON olarak döndürür. Önizleme yalnızca env/secret anahtarlarını döndürür, asla değerleri değil.
cdnctl container compose preview --account <uuid> --file docker-compose.yml
3 · Uygulayın
Sunucu tarafında yeniden planlar (istemci planına asla güvenilmez), paket haklarınızı uygular, sonra uygulamaları bağımlılık sırasına göre oluşturur.
cdnctl container compose apply --account <uuid> --file docker-compose.yml --yes
Private imajlar. Registry kimliğini bir kez oluşturun (panel → Private registry credential ya da API) ve platformun imajı çekebilmesi için uygulamalara ekleyin — public imajlar için hiçbir şey gerekmez.
4 · İzleyin, yayınlayın, inceleyin
cdnctl container apps list --account <uuid>
cdnctl container apps wait --account <uuid> --app <app_uuid> --status running --timeout 300
cdnctl container apps expose --account <uuid> --app <app_uuid> # -> <uid>.cdn.com.tr
cdnctl container apps logs --account <uuid> --app <app_uuid> --tail 100
cdnctl container apps status --account <uuid> --app <app_uuid>
Sonuç
Web uygulaması cdn.com.tr alt alan adında canlı — ziyaret sayacı yönetilen Postgres eklentisinde kalıcı, yönetilen Redis eklentisinde cache'li; ikisi de connected raporluyor, yönetilen bir replika sunuyor.
docker-compose.yml'den içe aktarılmış ve <uid>.cdn.com.tr'de sunulan çalışan uygulama.Paylaşılan durum hakkında bilinmesi gereken. Her uygulama kendi yönetilen Postgres/Redis'ini aldığı için worker, web'in okuduğundan farklı bir veritabanına yazar. Bir SQL veritabanını gerçekten paylaşmak için tek uygulamanın ona sahip olmasına izin verin ve diğerleri ona özel ağ üzerinden uygulama adıyla erişsin (http://<uygulama-adı>:<port>) — tıpkı bir compose servisi gibi. Parolasız arka uçlar (Redis, NATS) URL'leri her tüketicide env olarak ayarlanarak paylaşılabilir.