
Vos pipelines CI/CD passent 30% de leur temps à télécharger des dépendances
— images Docker, packages NPM, modules Go. Chaque docker pull ou npm install
sollicite les mêmes registres, encore et encore.
Varnish Orca résout ce problème en plaçant un cache intelligent entre vos outils et les registres. Résultat : des pulls 4x plus rapides, une résilience face aux pannes de Docker Hub, et une réduction massive de la bande passante sortante.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Installer Orca en 2 minutes avec Docker
- Configurer Docker pour utiliser Orca comme mirror
- Ajouter des registres multiples (Quay, GHCR, NPM, PyPI)
- Mesurer le gain de performance sur vos builds
- Déployer en production avec TLS et observabilité
Qu’est-ce que Varnish Orca ?
Section intitulée « Qu’est-ce que Varnish Orca ? »Le problème : la gravité des données
Section intitulée « Le problème : la gravité des données »Imaginez une équipe de 10 développeurs. Chacun lance 5 builds par jour. Chaque build télécharge les mêmes dépendances :
- L’image
node:20-alpine(50 Mo) - 200 packages NPM (100 Mo)
- Quelques images de base (200 Mo)
Calcul rapide : 10 devs × 5 builds × 350 Mo = 17,5 Go par jour. Multipliez par 20 jours ouvrés = 350 Go par mois téléchargés depuis Internet. Et ce sont toujours les mêmes fichiers !
Le constat : vos pipelines CI/CD passent leur temps à re-télécharger des artefacts qu’ils ont déjà récupérés la veille, l’heure d’avant, ou même 5 minutes plus tôt sur un autre runner.
La solution : un Virtual Registry Manager
Section intitulée « La solution : un Virtual Registry Manager »Orca agit comme un proxy cache entre vos outils et les registres distants.
Comment ça marche, concrètement ?
- Votre CI exécute
docker pull node:20-alpine - Orca reçoit la requête (il se fait passer pour Docker Hub)
- Premier cas : l’image n’est pas en cache → Orca la télécharge depuis Docker Hub, la stocke, et vous la renvoie
- Deuxième cas : l’image est déjà en cache → Orca vous la renvoie instantanément, sans aller sur Internet
Analogie du quotidien : c’est comme avoir un frigo au bureau plutôt que d’aller au supermarché à chaque fois que vous voulez un café. Le premier achat remplit le frigo, les suivants sont instantanés.
Analogie technique : Orca est à vos registres ce qu’un CDN est à votre site web. Il rapproche les données de là où elles sont consommées.
| Sans Orca | Avec Orca |
|---|---|
| Chaque build tire depuis Docker Hub | Premier build tire, les suivants servent du cache |
| Latence réseau à chaque pull | Latence locale (< 10ms) |
| Vulnérable aux pannes Docker Hub | Continue de servir depuis le cache |
| Coûts d’egress élevés | 75%+ de réduction de trafic sortant |
Artefacts supportés
Section intitulée « Artefacts supportés »Orca cache tous types d’artefacts binaires immuables :
| Type | Registre par défaut | Subdomain Orca |
|---|---|---|
| Images Docker/OCI | Docker Hub | dockerhub.localhost |
| Images Docker | Quay.io | quay.localhost |
| Images Docker | GitHub Container Registry | ghcr.localhost |
| Images Kubernetes | registry.k8s.io | k8s.localhost |
| Packages NPM | registry.npmjs.org | npmjs.localhost |
| Modules Go | proxy.golang.org | go.localhost |
| Repositories Git | github.com | github.localhost |
| Repositories Git | gitlab.com | gitlab.localhost |
Prérequis
Section intitulée « Prérequis »- Docker 20.10+ installé
- Accès root pour modifier
/etc/docker/daemon.json - Port 80 ou 8888 disponible sur la machine hôte
Installation
Section intitulée « Installation »Option 1 : Docker (recommandé pour démarrer)
Section intitulée « Option 1 : Docker (recommandé pour démarrer) »-
Téléchargez l’image Orca
Fenêtre de terminal docker pull varnish/orca --platform linux/amd64 -
Lancez Orca
Fenêtre de terminal docker run -d --rm \-p 80:80 \--name orca \--platform linux/amd64 \varnish/orca -
Vérifiez que Orca répond
Fenêtre de terminal curl -I http://localhost/healthzVous devez obtenir
HTTP/1.1 200 OK.
Option 2 : Docker Compose
Section intitulée « Option 2 : Docker Compose »services: orca: image: varnish/orca platform: linux/amd64 ports: - "80:80" volumes: - ./config.yaml:/etc/varnish-supervisor/default.yaml:ro restart: unless-stoppedOption 3 : Helm (Kubernetes)
Section intitulée « Option 3 : Helm (Kubernetes) »helm pull oci://docker.io/varnish/orca-charthelm install orca oci://docker.io/varnish/orca-chartOption 4 : Packages Linux
Section intitulée « Option 4 : Packages Linux »# Ajouter le dépôtcurl -s https://packagecloud.io/install/repositories/varnishplus/60-enterprise/script.deb.sh | sudo bash
# Installersudo apt -y install varnish-supervisor
# Vérifiervarnish-supervisor --version# Ajouter le dépôtcurl -s https://packagecloud.io/install/repositories/varnishplus/60-enterprise/script.rpm.sh | sudo bash
# Installersudo yum -y install varnish-supervisor
# Activer et démarrersudo systemctl enable --now varnish-supervisorConfiguration de Docker pour utiliser Orca
Section intitulée « Configuration de Docker pour utiliser Orca »Pour que Docker utilise Orca comme registry mirror, modifiez la configuration du daemon Docker.
-
Éditez
/etc/docker/daemon.json/etc/docker/daemon.json {"registry-mirrors": ["http://localhost"],"insecure-registries": ["localhost"]} -
Redémarrez Docker
Fenêtre de terminal sudo systemctl restart docker -
Vérifiez la configuration
Fenêtre de terminal docker info | grep -A2 "Registry Mirrors"Vous devez voir
http://localhost/.
Utilisation
Section intitulée « Utilisation »Cache Docker Hub (automatique)
Section intitulée « Cache Docker Hub (automatique) »Avec le registry mirror configuré, tous vos docker pull passent par Orca
automatiquement. Aucune modification de vos Dockerfiles ou scripts n’est
nécessaire.
Testons ensemble pour voir la différence :
# Étape 1 : Premier pull (Orca télécharge depuis Docker Hub)docker pull alpine:3.19# → Orca n'a pas l'image, il la récupère sur Internet
# Étape 2 : Supprimez l'image de votre machinedocker rmi alpine:3.19# → L'image n'est plus sur VOTRE machine, mais Orca l'a gardée
# Étape 3 : Deuxième pull (Orca sert depuis son cache)docker pull alpine:3.19# → Cette fois, Orca répond instantanément !Résultats que j’ai mesurés (sur l’image node:20-alpine, 50 Mo) :
| Pull | Temps | Ce qui se passe |
|---|---|---|
| Premier | 6.0s | Orca télécharge depuis Docker Hub, stocke en cache |
| Second | 1.5s | Orca sert directement depuis son cache local |
| Gain | 4x | Le transfert Internet est évité |
Cache NPM
Section intitulée « Cache NPM »Pour les packages NPM, c’est un peu différent. Docker utilise automatiquement le registry mirror configuré, mais NPM doit être configuré explicitement.
Option 1 : Ponctuellement (pour un seul npm install) :
npm install express --registry=http://npmjs.localhostOption 2 : Globalement (recommandé pour le CI/CD) :
npm config set registry http://npmjs.localhostCache Go modules
Section intitulée « Cache Go modules »Pour Go, définissez la variable d’environnement GOPROXY :
# Pour une commandeGOPROXY=http://go.localhost go mod tidy
# Ou exportez-la dans votre profil shellexport GOPROXY=http://go.localhostCache Helm Charts (OCI)
Section intitulée « Cache Helm Charts (OCI) »Helm 3.8+ supporte les registres OCI. Utilisez le subdomain correspondant :
# Chart depuis GitHub Container Registry via Orcahelm pull oci://ghcr.localhost/prometheus-community/charts/prometheus --plain-httpConfiguration avancée
Section intitulée « Configuration avancée »La configuration par défaut d’Orca inclut déjà les registres les plus courants (Docker Hub, NPM, Go, GitHub). Vous n’avez rien à configurer pour commencer.
Créez un fichier config.yaml personnalisé uniquement si vous avez besoin de :
- Ajouter un registre privé d’entreprise
- Configurer des politiques de cache (TTL)
- Activer la haute disponibilité avec plusieurs remotes
varnish: http: - port: 80
virtual_registry: registries: # Docker Hub comme registre par défaut - name: dockerhub default: true remotes: - url: https://docker.io - url: https://mirror.gcr.io # Fallback sur le mirror Google
# GitHub Container Registry - name: ghcr remotes: - url: https://ghcr.io
# Quay.io - name: quay remotes: - url: https://quay.io
# NPM - name: npmjs remotes: - url: https://registry.npmjs.org
# PyPI - name: pypi remotes: - url: https://pypi.org
# Registre privé d'entreprise - name: internal remotes: - url: https://registry.entreprise.localMontez ce fichier dans le conteneur :
docker run -d --rm \ -p 80:80 \ --name orca \ --platform linux/amd64 \ -v $(pwd)/config.yaml:/etc/varnish-supervisor/default.yaml:ro \ varnish/orcaOptions de configuration par registre
Section intitulée « Options de configuration par registre »| Option | Défaut | Description |
|---|---|---|
name | - | Identifiant unique, utilisé pour le routing par subdomain |
default | false | Si true, reçoit les requêtes sans subdomain |
load_balancer | fallback | Stratégie : fallback, random, ou hash |
default_ttl | 120 | TTL en secondes pour les objets sans politique spécifique |
auth_ttl | 3600 | TTL du cache d’autorisation (Premium) |
Remotes avec fallback
Section intitulée « Remotes avec fallback »Un registre peut avoir plusieurs remotes pour la haute disponibilité :
- name: dockerhub default: true load_balancer: fallback remotes: - url: https://docker.io priority: 1 # Essayé en premier - url: https://mirror.gcr.io priority: 2 # Fallback si Docker Hub échoueHealth checks des remotes
Section intitulée « Health checks des remotes »- name: dockerhub remotes: - url: https://docker.io probe: url: /v2/ interval: 5 # Vérification toutes les 5s timeout: 2 # Timeout de 2s threshold: 3 # 3 succès requis pour être "healthy" window: 8 # Sur les 8 derniers checksDéploiement en production
Section intitulée « Déploiement en production »Activer TLS (HTTPS)
Section intitulée « Activer TLS (HTTPS) »En production, utilisez toujours HTTPS. Orca supporte plusieurs méthodes :
varnish: http: - port: 80 https: - port: 443 certificates: - cert: /certs/tls.crt private_key: /certs/tls.keyvarnish: https: - port: 443
acme: email: admin@entreprise.com domains: - orca.entreprise.com - "*.orca.entreprise.com" ca_server: productionvarnish: https: - port: 443 certificates: - self_signed: "*.localhost"Observabilité avec OpenTelemetry
Section intitulée « Observabilité avec OpenTelemetry »Orca expose des métriques via OpenTelemetry pour surveiller :
- Taux de cache hit/miss par registre
- Latence des requêtes
- Bande passante économisée
- Santé des backends
otel: service_name: orca-production metrics: endpoint: http://prometheus:9090/api/v1/otlp/v1/metrics protocol: http/protobuf export_interval: 60Stockage persistant (Premium)
Section intitulée « Stockage persistant (Premium) »Par défaut, le cache est en mémoire et perdu au redémarrage. La version Premium permet de persister le cache sur disque :
varnish: storage: stores: - name: disk1 path: /var/cache/orca/disk1 size: 100GDépannage
Section intitulée « Dépannage »Orca ne démarre pas
Section intitulée « Orca ne démarre pas »| Symptôme | Cause | Solution |
|---|---|---|
| Port 80 occupé | Autre service (nginx, apache) | Utilisez -p 8888:80 ou arrêtez le service |
mlock() failed | Limite mémoire verrouillée | Warning bénin, Orca fonctionne quand même |
Docker pull échoue via Orca
Section intitulée « Docker pull échoue via Orca »| Symptôme | Cause | Solution |
|---|---|---|
failed to do request: EOF | Docker attend du HTTPS | Ajoutez "insecure-registries": ["localhost"] |
UNAUTHORIZED | Registre privé sans auth | Configurez docker login |
404 Not Found | Mauvais routing de registre | Vérifiez le subdomain (ex: quay.localhost) |
Vérifier que le cache fonctionne
Section intitulée « Vérifier que le cache fonctionne »# Health checkcurl -I http://localhost/healthz
# Voir les logsdocker logs orca
# Métriques de cache (si varnishstat disponible)docker exec orca varnishstat -1 | grep "cache_hit\|cache_miss"Warning mlock() of VSM failed
Section intitulée « Warning mlock() of VSM failed »Ce message apparaît au démarrage :
Warning: mlock() of VSM failed: Cannot allocate memory (12)C’est bénin. Varnish tente de verrouiller sa mémoire partagée (VSM) en RAM pour éviter qu’elle soit swappée. Sur Docker avec des limites mémoire, cette opération peut échouer, mais Orca fonctionne correctement sans.
Comparaison Free vs Premium
Section intitulée « Comparaison Free vs Premium »| Fonctionnalité | Free | Premium |
|---|---|---|
| Cache registres publics | ✅ | ✅ |
| TLS (HTTPS) | ✅ | ✅ |
| Cache mémoire | ✅ | ✅ |
| Métriques OpenTelemetry | ✅ | ✅ |
| Tracing OpenTelemetry | ❌ | ✅ |
| Cache registres privés | ❌ | ✅ |
| Stockage persistant (disque) | ❌ | ✅ |
| Programmabilité VCL | ❌ | ✅ |
| Mirror Git | ❌ | ✅ |
| Support | ❌ | ✅ |
La licence Free est embarquée et valide 1 an après la date de release. Pour continuer à utiliser Orca gratuitement, mettez simplement à jour vers une nouvelle version.
Potentielle réduction de vos coûts
Section intitulée « Potentielle réduction de vos coûts »Si vous utilisez un gestionnaire d’artefacts payant comme JFrog Artifactory, AWS ECR, Azure ACR ou Google Artifact Registry, Orca peut réduire votre facture.
Pourquoi ? Ces services facturent généralement le transfert de données
(egress). Chaque docker pull ou npm install depuis votre CI/CD compte comme
du trafic sortant facturable.
Avec Orca, vos pipelines tirent les artefacts depuis le cache local au lieu du registre distant. Résultat : moins de transfert = moins de coûts.
À retenir
Section intitulée « À retenir »- Orca est un Virtual Registry Manager : il cache les artefacts (Docker, NPM, Go, Helm) au niveau HTTP
- Gain de performance 4x sur les pulls d’images Docker depuis le cache
- Réduction de 75%+ du trafic sortant vers les registres
- Résilience : continue de servir les artefacts même si Docker Hub tombe
- Configuration YAML simple : pas de VCL à écrire, déploiement en 2 minutes
- Routing par subdomain :
npmjs.localhostpour NPM,ghcr.localhostpour GHCR, etc. - OpenTelemetry intégré pour surveiller le taux de cache hit
- Économies JFrog/ECR/ACR : réduction de 50-70% sur les factures de registres payants grâce à la diminution du transfert de données