Docker containers आमतौर पर खुद SSL handle नहीं करते — सामने एक reverse proxy TLS terminate करती है और decrypted traffic container को forward करती है। यह guide तीन सबसे common methods को cover करती है।
Method 1: Manual Certificate के साथ Nginx Reverse Proxy
छोटे deployments के लिए सबसे simple तरीका। GetHTTPS से certificate get करें और इसे Nginx container में mount करें।
docker-compose.yml
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
- ./certs/fullchain.pem:/etc/ssl/fullchain.pem:ro
- ./certs/privkey.pem:/etc/ssl/privkey.pem:ro
depends_on:
- app
app:
image: your-app:latest
expose:
- "3000"
nginx.conf
server {
listen 443 ssl http2;
server_name yourdomain.com;
ssl_certificate /etc/ssl/fullchain.pem;
ssl_certificate_key /etc/ssl/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
location / {
proxy_pass http://app:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 80;
server_name yourdomain.com;
return 301 https://$host$request_uri;
}
Renewal के लिए: ./certs/ में files को GetHTTPS से नई files से replace करें, फिर docker compose exec nginx nginx -s reload।
Method 2: Automatic Let’s Encrypt के साथ Traefik
Traefik containers के लिए बनाया गया एक reverse proxy है। यह automatically Let’s Encrypt certificates get और renew कर सकता है।
docker-compose.yml
services:
traefik:
image: traefik:v3.0
command:
- "--providers.docker=true"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.letsencrypt.acme.email=you@example.com"
- "--certificatesresolvers.letsencrypt.acme.storage=/acme/acme.json"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- traefik-acme:/acme
app:
image: your-app:latest
labels:
- "traefik.http.routers.app.rule=Host(`yourdomain.com`)"
- "traefik.http.routers.app.tls.certresolver=letsencrypt"
- "traefik.http.services.app.loadbalancer.server.port=3000"
volumes:
traefik-acme:
Traefik सब कुछ handle करता है: certificate issue करना, renewal, और HTTPS termination। कोई manual certificate management required नहीं।
Method 3: Caddy (Zero-Config HTTPS)
Caddy zero configuration के साथ automatically Let’s Encrypt certificates get और renew करता है।
docker-compose.yml
services:
caddy:
image: caddy:2
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy-data:/data
depends_on:
- app
app:
image: your-app:latest
expose:
- "3000"
volumes:
caddy-data:
Caddyfile
yourdomain.com {
reverse_proxy app:3000
}
यही पूरा config है। Caddy Let’s Encrypt certificate get करता है और इसे automatically renew करता है।
कौन सा Method Choose करें?
| Nginx + Manual Certificate | Traefik | Caddy | |
|---|---|---|---|
| Setup | Medium (config + certificate files) | Medium (labels) | Minimal |
| Auto-renewal | ❌ (manual) | ✅ | ✅ |
| Flexibility | High | High | Medium |
| Learning curve | Low (familiar) | Medium | Low |
| Best for | छोटे deployments, full control | Dynamic containers, microservices | Simple sites, minimal config |
Docker में Certificate Renewal
Method 1 (Nginx + Manual):
# अपनी local ./certs/ directory में certificate files replace करें
cp new-fullchain.pem ./certs/fullchain.pem
cp new-privkey.pem ./certs/privkey.pem
# Container के अंदर Nginx को reload करें (restart required नहीं)
docker compose exec nginx nginx -s reload
Method 2 (Traefik) और 3 (Caddy):
Automatic — वे internally renewal handle करते हैं। Certificates Docker volumes (traefik-acme या caddy-data) में stored होते हैं और container restarts के बीच persist रहते हैं।
Docker Swarm: Secrets Use करना
Docker Swarm deployments के लिए, certificate files को bind-mount करने के बजाय Docker secrets use करें:
# अपनी certificate files से secrets बनाएं
docker secret create ssl_cert fullchain.pem
docker secret create ssl_key privkey.pem
# docker-compose.yml (deploy mode) में
services:
nginx:
image: nginx:alpine
secrets:
- ssl_cert
- ssl_key
configs:
- source: nginx_conf
target: /etc/nginx/conf.d/default.conf
secrets:
ssl_cert:
external: true
ssl_key:
external: true
Secrets container के अंदर /run/secrets/ssl_cert और /run/secrets/ssl_key पर mount होते हैं — rest और transit दोनों में encrypted।
Common Mistakes
Docker Image में Certificate Bake करना
# ❌ यह कभी न करें
COPY fullchain.pem /etc/ssl/fullchain.pem
COPY privkey.pem /etc/ssl/privkey.pem
Certificates हर 90 days में expire होते हैं। उन्हें image में bake करने का मतलब है हर 60 days में rebuild और redeploy। हमेशा certificates को volumes या secrets के रूप में mount करें।
Port 80 Expose करना भूलना
Port 80 इनके लिए required है:
- HTTP → HTTPS redirect
- Let’s Encrypt HTTP-01 challenge (Traefik/Caddy auto-renewal के लिए)
ports:
- "80:80" # इसे न भूलें
- "443:443"
ACME Data को Persist न करना
Traefik और Caddy अपने Let’s Encrypt certificates और account keys volumes में store करते हैं। Persistence के बिना, वे हर container restart पर certificates फिर से request करते हैं — और rate limit hit कर जाएंगे:
volumes:
traefik-acme: # Named volume होना चाहिए, anonymous नहीं
caddy-data:
FAQ
क्या मेरा app container directly SSL handle कर सकता है?
आप कर सकते हैं, लेकिन यह recommended नहीं है। Reverse proxy pattern (edge पर TLS terminate करें, internally plain HTTP forward करें) standard है क्योंकि: app को certificate के बारे में जानने की need नहीं, renewal के लिए app restart required नहीं, और आप TLS configuration centralize करते हैं।
Multiple containers के लिए SSL कैसे handle करें?
Traefik या Caddy के साथ, हर service के लिए labels/config add करें — वे automatically अलग-अलग certificates get करेंगे। Nginx के साथ, config में multiple server blocks add करें।
क्या मुझे GetHTTPS या Traefik का built-in ACME use करना चाहिए?
Production के लिए Traefik/Caddy का built-in ACME use करें — यह automatically renewal handle करता है। GetHTTPS तब use करें जब आपको Nginx reverse proxy method (Method 1) के लिए certificate चाहिए या ऐसे environments के लिए जहां container के पास ACME challenge के लिए direct internet access नहीं है।
Docker में certificate securely कैसे mount करें?
Read-only (:ro) के रूप में mount करें, Swarm mode में private key के लिए Docker secrets use करें, और ensure करें कि सिर्फ reverse proxy container को certificate files तक access हो। कभी भी Docker image में certificates bake न करें — वे expire हो जाएंगे और आपको rebuild करना पड़ेगा।
क्या मैं Kubernetes के साथ GetHTTPS certificate use कर सकता हूं?
हां। अपनी GetHTTPS certificate files से Kubernetes TLS secret बनाएं:
kubectl create secret tls my-tls-cert --cert=fullchain.pem --key=privkey.pem
फिर इसे अपने Ingress resource में reference करें। Kubernetes में automatic renewal के लिए, Let’s Encrypt ClusterIssuer के साथ cert-manager consider करें।