Loading...

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.

Ce que vous obtenez à la fin

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.

Vue d'ensemble de Container Apps avec les limites du forfait appliquées
Vue d'ensemble : limites appliquées (apps / object-storage / Redis / DB), compteurs d'add-ons, et Create App.

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.

Formulaire de création de container app avec la ligne d'identifiant de registre
Le panneau Create-App. L'onglet Import From Docker Compose se trouve à côté de Create ; l'identifiant de registre se trouve juste au-dessus.

3 · Import From Docker Compose

Passez à Import From Docker Compose, puis téléversez ou collez votre docker-compose.yml (256 Ko max).

Boîte de dialogue d'import Docker Compose
Collez le fichier compose. L'identifiant de registre enregistré est rattaché pour les images privées.
Fichier compose collé dans la zone d'import
Le fichier compose en place — prêt pour l'aperçu.

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.

Plan d'aperçu de l'import compose
Le plan : 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.

Deux container apps en cours d'exécution après l'import
Les deux 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é.

L'app de démonstration déployée, en cours d'exécution sur un sous-domaine cdn.com.tr
L'app en cours d'exécution, importée depuis 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.