Docker Compose की मदद से किसी Linux सर्वर पर मल्टी-कंटेनर एप्लिकेशन डिप्लॉय करने की एक व्यावहारिक, चरण-दर-चरण मार्गदर्शिका — Docker इंस्टॉल करें, प्रोडक्शन-तैयार compose फ़ाइल लिखें, HTTPS के साथ रिवर्स प्रॉक्सी जोड़ें, और इसे Skyline Cloud की इन-किंगडम अवसंरचना पर भरोसेमंद ढंग से चलाएँ।
परिचय
Docker Compose आपको किसी मल्टी-कंटेनर एप्लिकेशन — एक वेब ऐप, उसका डेटाबेस, एक कैश, और एक रिवर्स प्रॉक्सी — को एक ही घोषणात्मक (declarative) फ़ाइल में परिभाषित करने देता है, और फिर एक ही कमांड से सब कुछ चालू कर देता है। लंबे-लंबे docker run कमांड हाथ से चलाने के बजाय, आप एक बार वांछित अवस्था (desired state) का वर्णन कर देते हैं और Compose उसे आपके लिए साध (reconcile) देता है।
इस ट्यूटोरियल में आप एक Linux सर्वर पर एक छोटा पर वास्तविक स्टैक डिप्लॉय करेंगे: एक वेब एप्लिकेशन, एक PostgreSQL डेटाबेस, और एक Caddy रिवर्स प्रॉक्सी जो स्वतः ही HTTPS को टर्मिनेट करता है। अंत तक आपके पास अपने स्वयं के डोमेन पर TLS के ज़रिए पहुँच योग्य एक चालू ऐप होगा।
हम एक Skyline Cloud VPS पर डिप्लॉय करेंगे। चूँकि Skyline सऊदी अरब में इन-किंगडम अवसंरचना चलाता है, इसलिए आपका डेटा और आपके ग्राहकों का डेटा PDPL, NCA और SDAIA के क्षेत्राधिकार में रहता है — जो तब मायने रखता है जब आप KSA और GCC संगठनों के लिए वर्कलोड होस्ट करते हैं। यदि आपके पास अभी तक कोई सर्वर नहीं है, तो कुछ ही मिनटों में एक बनाएँ।
पूर्वापेक्षाएँ
- एक सार्वजनिक IP वाला Linux सर्वर (Ubuntu 22.04/24.04 या Debian 12)। शुरुआत के लिए 1–2 vCPU / 2 GB RAM वाला VPS पर्याप्त है।
sudoविशेषाधिकार वाला एक नॉन-रूट यूज़र, और सर्वर तक SSH एक्सेस।- एक डोमेन नाम जिसका A record आपके सर्वर के सार्वजनिक IP की ओर इंगित करता हो। Skyline से .sa डोमेन और मैनेज्ड DNS के साथ,
app.example.sa → 203.0.113.10जैसा एक रिकॉर्ड बनाएँ।
चरण 1 — Docker Engine और Compose प्लगइन इंस्टॉल करें
आधुनिक Docker, Compose को एक प्लगइन के रूप में भेजता है (docker compose, न कि पुराना docker-compose)। आधिकारिक कन्वीनिएंस स्क्रिप्ट इंजन और प्लगइन को एक साथ इंस्टॉल कर देती है:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
अपने यूज़र को docker ग्रुप में जोड़ें ताकि आप sudo के बिना Docker चला सकें, फिर अपना सेशन दोबारा खोलें:
sudo usermod -aG docker $USER
newgrp docker
इंजन और Compose प्लगइन — दोनों को सत्यापित करें:
docker --version
docker compose version
चरण 2 — प्रोजेक्ट का ढाँचा बनाएँ
अपने स्टैक के लिए एक डायरेक्टरी बनाएँ और उसमें जाएँ:
mkdir -p ~/myapp && cd ~/myapp
हम यहाँ तीन फ़ाइलें रखेंगे: ऐप इमेज के लिए एक Dockerfile, सेवाओं को आपस में जोड़ने वाली एक compose.yaml, और सीक्रेट्स तथा कॉन्फ़िगरेशन के लिए एक .env फ़ाइल।
चरण 3 — एप्लिकेशन का Dockerfile लिखें
एक सामान्य Node.js ऐप के लिए, एक छोटा मल्टी-स्टेज बिल्ड अंतिम इमेज को हल्का (lean) रखता है। अपने स्वयं के स्टैक (Python, Go, PHP, इत्यादि) के अनुसार कमांड समायोजित करें:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
चरण 4 — .env फ़ाइल में सीक्रेट्स परिभाषित करें
अपनी compose फ़ाइल में कभी भी क्रेडेंशियल्स हार्ड-कोड न करें। उन्हें .env में रखें, जिसे Compose स्वतः पढ़ लेता है:
POSTGRES_USER=appuser
POSTGRES_PASSWORD=change-me-to-a-strong-secret
POSTGRES_DB=appdb
APP_DOMAIN=app.example.sa
इसकी अनुमतियाँ (permissions) सीमित करें और इसे वर्शन कंट्रोल से बाहर रखें:
chmod 600 .env
echo ".env" >> .gitignore
चरण 5 — Compose फ़ाइल लिखें
compose.yaml बनाएँ। यह तीन सेवाएँ, एक निजी नेटवर्क, और नामित वॉल्यूम परिभाषित करता है ताकि रीस्टार्ट के बाद भी आपका डेटा और TLS प्रमाणपत्र बने रहें:
services:
app:
build: .
restart: unless-stopped
environment:
DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}
depends_on:
db:
condition: service_healthy
expose:
- "3000"
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- db-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 5
caddy:
image: caddy:2-alpine
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy-data:/data
- caddy-config:/config
depends_on:
- app
volumes:
db-data:
caddy-data:
caddy-config:
कुछ बातें ध्यान देने योग्य हैं:
- डेटाबेस पोर्ट
ports:के साथ प्रकाशित (publish) नहीं किया गया है; यह केवल आंतरिक Compose नेटवर्क पर ही पहुँच योग्य है, इसलिए यह कभी भी इंटरनेट पर एक्सपोज़ नहीं होता। condition: service_healthyके साथdepends_onऐप को तब तक प्रतीक्षा कराता है जब तक PostgreSQL वास्तव में कनेक्शन स्वीकार न करने लगे — न कि केवल उसका कंटेनर शुरू होने तक।restart: unless-stoppedरीबूट या क्रैश के बाद आपकी सेवाओं को स्वतः वापस ले आता है।
चरण 6 — रिवर्स प्रॉक्सी कॉन्फ़िगर करें
अपनी compose फ़ाइल के पास Caddyfile नाम की एक फ़ाइल बनाएँ। Caddy एक Let's Encrypt प्रमाणपत्र स्वतः प्राप्त और नवीनीकृत करता है, इसलिए आपको बिना किसी मैन्युअल प्रमाणपत्र-प्रबंधन के HTTPS मिल जाता है:
app.example.sa {
reverse_proxy app:3000
}
app.example.sa को अपने वास्तविक डोमेन से बदलें। Caddy आंतरिक नेटवर्क पर app को आपके एप्लिकेशन कंटेनर तक सुलझाता (resolve) है और अनुरोधों को पोर्ट 3000 पर प्रॉक्सी करता है।
चरण 7 — स्टैक चालू करें
इमेज बिल्ड करें और सब कुछ बैकग्राउंड में शुरू करें:
docker compose up -d --build
जाँचें कि सभी सेवाएँ स्वस्थ (healthy) हैं:
docker compose ps
ऐप के शुरू होने और Caddy द्वारा आपका प्रमाणपत्र जारी करने को देखने के लिए लॉग फ़ॉलो करें:
docker compose logs -f
ब्राउज़र में https://app.example.sa खोलें। Caddy तब तक एक मान्य TLS प्रमाणपत्र प्रावधानित (provision) कर चुका होगा।
चरण 8 — संचालन और अपडेट
रोज़मर्रा के सामान्य कमांड:
| कार्य | कमांड |
|---|---|
| चल रही सेवाएँ देखें | docker compose ps |
| एक सेवा के लॉग टेल करें | docker compose logs -f app |
| एक सेवा रीस्टार्ट करें | docker compose restart app |
| स्टैक रोकें (डेटा रखें) | docker compose down |
| नई बेस इमेज पुल करें | docker compose pull |
| रीबिल्ड और पुनः डिप्लॉय करें | docker compose up -d --build |
अपने कोड का नया संस्करण भेजने के लिए, अपने परिवर्तन पुल करें और docker compose up -d --build चलाएँ। Compose केवल उन्हीं कंटेनरों को फिर से बनाता है जो बदले हैं और डेटाबेस को अछूता छोड़ देता है, जिससे स्टेटलेस सेवाओं के लिए लगभग शून्य डाउनटाइम मिलता है।
वॉल्यूम सहित सब कुछ हटाने के लिए (इससे आपका डेटाबेस डेटा हट जाता है), docker compose down -v चलाएँ — इसका उपयोग सावधानी से करें।
चरण 9 — अपने डेटा का बैकअप लें
आपका एप्लिकेशन डेटा db-data वॉल्यूम में रहता है। नियमित डंप लें और उन्हें सर्वर से बाहर संग्रहीत करें। एक सरल PostgreSQL बैकअप:
docker compose exec db pg_dump -U appuser appdb > backup-$(date +%F).sql
इसे cron के साथ शेड्यूल करें और डंप को Skyline Cloud ऑब्जेक्ट स्टोरेज या क्लाउड बैकअप पर पुश करें ताकि किसी एकल-सर्वर विफलता से आपको कभी अपना डेटा न गँवाना पड़े।
निष्कर्ष
अब आपके पास Docker Compose के साथ डिप्लॉय किया गया एक मल्टी-कंटेनर एप्लिकेशन है, जिसके आगे एक स्वतः-HTTPS रिवर्स प्रॉक्सी है, और जो आपके नियंत्रण वाले एक सर्वर पर चल रहा है। यहाँ से आप एक Redis कैश जोड़ सकते हैं, प्रॉक्सी के पीछे docker compose up -d --scale app=3 के साथ स्टेटलेस सेवाओं को स्केल कर सकते हैं, या ऑर्केस्ट्रेशन की ओर उन्नत हो सकते हैं — जब आप एक ही होस्ट से आगे बढ़ें तो हमारी सऊदी अरब में मैनेज्ड Kubernetes गाइड देखें।
यदि आपको अपने ऐप के साथ-साथ अपने डोमेन के लिए पेशेवर मेलबॉक्स की भी ज़रूरत है, तो Skyline बिज़नेस ईमेल होस्टिंग आपके मेल को भी इन-किंगडम रखती है।
डिप्लॉय करने के लिए तैयार हैं? अपना Skyline Cloud सर्वर बनाएँ और शुरुआत करें।
Comments
0 total · 0 threads