CONTAINER APPS · ÉTUDE DE CAS
De docker-compose.yml à une application en ligne — dans le panneau et avec cdnctl
Un tutoriel complet, à copier-coller, pour les développeurs qui veulent essayer la plateforme rapidement. Nous prenons un projet multi-services petit mais réaliste — une API web, un worker en arrière-plan, et des Postgres + Redis managés — et l'exécutons sur CDN.com.tr Managed Containers directement à partir d'un seul docker-compose.yml. Le même scénario est présenté de deux façons : cliquer-pointer depuis le panneau de gestion, et de bout en bout avec la CLI cdnctl. Choisissez celle que vous préférez.
Deux apps managées (web, worker), chacune connectée à un add-on Postgres et Redis managé, et l'app web en ligne sur son propre sous-domaine https://<uid>.cdn.com.tr — le tout créé à partir du fichier compose, sans Dockerfiles ni YAML Kubernetes.
Le projet d'exemple
Le service web compte les visites dans Postgres et met le dernier total en cache dans Redis ; le worker est une boucle en arrière-plan sans port, partageant les mêmes add-ons managés. Les deux images sont préconstruites et poussées vers un registre que la plateforme peut pull (construites pour linux/amd64). La plateforme injecte automatiquement les détails de connexion — votre code n'a qu'à lire DATABASE_URL et REDIS_URL.
# 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)
Comment les services sont mappés. Chaque service avec une image préconstruite devient une app managée. Les services dont l'image est postgres, mysql/mariadb, redis ou nats deviennent des add-ons managés et sont rattachés à chaque app qui les depends_on — chaque app consommatrice obtient sa propre instance d'addon, avec les identifiants injectés en env (DATABASE_HOST/PORT/NAME/USER, REDIS_URL) et en secrets (DATABASE_PASSWORD, DATABASE_URL). Un service avec un build: (sans image préconstruite) est rejeté — publiez d'abord une image. Maximum 20 services.
A · Depuis le panneau
1 · Ouvrez Container Apps
Connectez-vous, ouvrez CDN Accounts, cliquez sur l'icône de réglages de votre compte et choisissez l'onglet Platforms, puis Container Apps (appuyez sur Activate la première fois). La vue d'ensemble affiche les limites de votre forfait et une liste d'apps vide.
2 · (Images privées) ajoutez un identifiant de registre
Si vos images sont privées, ouvrez Create App et, dans la ligne Private registry credential, ajoutez un nom, l'URL du registre (https://index.docker.io/v1/ pour Docker Hub), votre nom d'utilisateur et un jeton d'accès en lecture seule, puis enregistrez. Le jeton est stocké chiffré et n'est plus jamais réaffiché. Les images publiques n'ont besoin d'aucun identifiant.
3 · Import From Docker Compose
Passez à Import From Docker Compose, puis téléversez ou collez votre docker-compose.yml (256 Ko max).
4 · Prévisualisez le plan
Cliquez sur Preview. La plateforme analyse le fichier et affiche un plan non destructif : chaque app qu'elle va créer, l'image/le port/les replicas, les add-ons rattachés, et les éventuels avertissements — sans encore rien toucher.
web (port 8080) et worker, chacun avec un add-on Redis + Postgres. L'avertissement précise que les mappages de ports hôte sont ignorés — vous exposez les apps via le flux expose/domain de la plateforme.5 · Appliquez, regardez le déploiement
Cochez I have reviewed this plan et cliquez sur Apply Import. L'application est tout-ou-rien ; les apps et add-ons sont créés et les déploiements mis en file d'attente. En moins d'une minute, les apps passent à running dans la liste Your apps.
web et worker) en cours d'exécution dans la liste Your apps. Ouvrez une app (Manage →) pour accéder à ses add-ons et à l'action Expose on cdn.com.tr.6 · Exposez l'app web
Ouvrez l'app web (Manage →) et cliquez sur Expose on cdn.com.tr pour générer instantanément un sous-domaine <uid>.cdn.com.tr (HTTPS géré pour vous). Laissez le worker privé. C'est tout — votre projet compose est en ligne. Voir le résultat ↓
B · Depuis le terminal (cdnctl)
Chaque étape ci-dessus a un équivalent CLI. Installez cdnctl, puis :
1 · Connectez-vous et trouvez votre compte
cdnctl login --email you@example.com --password '••••••'
cdnctl accounts list # copy your account <uuid>
2 · Prévisualisez le plan
Le même plan non destructif que le panneau — renvoie les apps, add-ons et avertissements en JSON. L'aperçu ne renvoie jamais que les clés env/secret, jamais les valeurs.
cdnctl container compose preview --account <uuid> --file docker-compose.yml
3 · Appliquez
Replanifie côté serveur (le plan client n'est jamais approuvé tel quel), applique les droits de votre forfait, puis crée les apps dans l'ordre des dépendances.
cdnctl container compose apply --account <uuid> --file docker-compose.yml --yes
Images privées. Créez un identifiant de registre une fois (panneau → Private registry credential, ou l'API), et rattachez-le aux apps pour que la plateforme puisse pull — les images publiques n'ont besoin de rien.
4 · Observez, exposez, inspectez
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>
Le résultat
L'app web est en ligne sur son sous-domaine cdn.com.tr — le compteur de visites est persisté dans l'add-on Postgres managé, mis en cache dans l'add-on Redis managé, tous deux signalant connected, servis par un réplica managé.
docker-compose.yml et servie sur <uid>.cdn.com.tr.Une chose à savoir sur l'état partagé. Comme chaque app obtient son propre Postgres/Redis managé, le worker écrit dans une base de données différente de celle que web lit. Pour partager réellement une base de données SQL, laissez une app la posséder et faites en sorte que les autres l'atteignent par nom d'app sur le réseau privé (http://<app-name>:<port>), exactement comme un service compose. Les backends sans mot de passe (Redis, NATS) peuvent être partagés en définissant leur URL en env sur chaque consommateur.