Last chance! 50% off DataCamp Premium
Sale ends in
किसी वजह से, Docker के साथ नया प्रोजेक्ट सेटअप करना हमेशा जितना होना चाहिए उससे ज्यादा समय ले लेता है।
आप Google पर कोई टेम्पलेट ढूंढते हैं, उसे पेस्ट करते हैं, कुछ लाइनें बदलते हैं और बेहतर की उम्मीद करते हैं। बिल्ड फेल हो जाता है, तो आप बदलाव कर के वही चक्र दोहराते हैं जब तक काम न चल पड़े। हर नया प्रोजेक्ट एक खाली फ़ाइल और पिछली बार क्या काम किया था इसकी धुंधली याद के साथ शुरू होता है। यह स्पष्ट रूप से सेटअप की समस्या है, और इसमें Docker की गलती नहीं है।
अच्छी खबर यह है कि docker init इसे ठीक कर देता है। यह एक CLI कमांड है जो आपके प्रोजेक्ट टाइप का पता लगाता है और एक Dockerfile, .dockerignore, और Compose फ़ाइल जनरेट करता है।
इस लेख में, मैं बताऊंगा कि docker init कैसे काम करता है, एक वास्तविक Python प्रोजेक्ट के साथ इसे चरण-दर-चरण कैसे इस्तेमाल करें, और कब यह सही टूल है।
क्या आप Docker और कंटेनराइज़ेशन में बिल्कुल नए हैं? हमारे Introduction to Docker कोर्स के ज़रिए जानें कि यह डेटा प्रोफेशनल के टूलकिट का एक आवश्यक हिस्सा क्यों है।
docker init एक CLI टूल है जो आपके प्रोजेक्ट के लिए Docker कॉन्फ़िगरेशन सेट करता है। यह आपकी ऐप को कंटेनराइज़ करने के लिए ज़रूरी फ़ाइलें जनरेट करता है। यानी अब टेम्पलेट्स या कॉपी-पेस्टिंग की जरूरत नहीं।
यह तीन फ़ाइलें बनाता है:
स्मार्ट हिस्सा है ऑटोमैटिक प्रोजेक्ट डिटेक्शन। docker init आपके प्रोजेक्ट स्ट्रक्चर को देखकर पता लगा लेता है कि आप कौन-सा स्टैक इस्तेमाल कर रहे हैं - Python, Node.js, Go, आदि। फिर वह उसी स्टैक के अनुरूप फ़ाइलें बनाता है, सामान्य टेम्पलेट देने के बजाय।
यह कोई डिप्लॉयमेंट टूल नहीं है, और प्रोडक्शन में आपके कंटेनरों को मैनेज नहीं करेगा। यह बस आपकी कॉन्फ़िगरेशन की शुरुआत कर देता है ताकि आप असल काम पर ध्यान दे सकें।
docker init हर बार चार चरणों की प्रक्रिया का पालन करता है।
पहले, आप अपने प्रोजेक्ट फ़ोल्डर के अंदर docker init चलाते हैं। Docker डायरेक्टरी स्कैन करता है, आपके प्रोजेक्ट टाइप का पता लगाता है, और सही कॉन्फ़िगरेशन टेम्पलेट चुनता है। फिर यह आपको कुछ छोटे-छोटे इंटरैक्टिव प्रॉम्प्ट्स से गुज़ारता है - जैसे आपकी ऐप कौन-से पोर्ट पर चलती है और उसे शुरू करने का कमांड क्या है। इनका जवाब देने के बाद, यह आपकी फ़ाइलें बना देता है।
पूरा काम एक मिनट से कम लेता है।
प्रॉम्प्ट्स का जवाब देना आसान होता है और शायद ही कभी अतिरिक्त व्याख्या की जरूरत पड़ती है। आप Enter दबाकर डिफ़ॉल्ट्स स्वीकार कर सकते हैं, या अगर वे उपयुक्त नहीं हैं तो अपनी वैल्यूज़ टाइप कर सकते हैं।
कमांड पहली बार चलाते समय आपको यह दिखेगा:

Docker init सेटअप स्क्रीन
अब मैं आपको यह प्रक्रिया थोड़ी और विस्तार से दिखाता/दिखाती हूँ।
यहाँ एक ओवरव्यू है कि प्रोजेक्ट फ़ोल्डर से चलते-चलते कंटेनर तक कैसे पहुँचना है।
अपना टर्मिनल खोलें और अपने प्रोजेक्ट के रूट पर जाएँ - वह फ़ोल्डर जिसमें आपका एप्लिकेशन कोड है।
cd /path/to/your/project
docker init जिन लोकेशन से चलाया जाता है, उसके सापेक्ष फ़ाइलें बनाता है, इसलिए आगे बढ़ने से पहले सुनिश्चित करें कि आप सही डायरेक्टरी में हैं।
निम्न कमांड चलाएँ:
docker init
Docker आपके प्रोजेक्ट फ़ोल्डर को स्कैन करेगा, आपका स्टैक डिटेक्ट करेगा, और इंटरैक्टिव सेटअप प्रॉम्प्ट लॉन्च करेगा।
docker init आपसे कुछ सवाल पूछेगा:
आप Enter दबाकर सुझाए गए डिफ़ॉल्ट स्वीकार कर सकते हैं, या अपनी वैल्यूज़ टाइप कर सकते हैं। अगर docker init आपका स्टैक डिटेक्ट कर लेता है, तो डिफ़ॉल्ट्स आमतौर पर शुरुआत के लिए पर्याप्त होते हैं।
प्रॉम्प्ट्स के जवाब देने के बाद, docker init आपके प्रोजेक्ट फ़ोल्डर में तीन फ़ाइलें लिख देता है:
.
├── Dockerfile
├── .dockerignore
└── compose.yaml
हर फ़ाइल खोलें और पढ़ें। जनरेटेड फ़ाइलों में कमेंट्स होते हैं जो हर लाइन का उद्देश्य समझाते हैं, इसलिए बिल्ड से पहले कुछ मिनट निकालकर समझ लेना लाभदायक है।
Docker Compose के साथ अपना कंटेनर बिल्ड और स्टार्ट करें:
docker compose up --build
फ्लैग --build Docker को बताता है कि कंटेनर शुरू करने से पहले Dockerfile से इमेज बिल्ड करे। एक बार चलने के बाद, आपकी ऐप स्टेप 3 में बताए गए पोर्ट पर एक्सेसिबल होनी चाहिए।
docker init आम एप्लिकेशन स्टैक्स को बॉक्स से बाहर सपोर्ट करता है। यहाँ कुछ उदाहरण हैं:
यह स्टैक ऑटोमैटिकली डिटेक्ट करता है। जब आप docker init चलाते हैं, तो यह आपके प्रोजेक्ट फ़ोल्डर में भाषा-विशिष्ट फ़ाइलें खोजता है - जैसे Python के लिए requirements.txt या Node.js के लिए package.json - और जो मिलता है उसके आधार पर सही टेम्पलेट चुनता है।
हर टेम्पलेट स्टैक के अनुरूप ढाला गया है। Python प्रोजेक्ट को Go प्रोजेक्ट से अलग बेस इमेज, इंस्टॉल कमांड्स और स्टार्ट कमांड मिलेंगे। आपको कोई एक-ही-आकार- सबके-लिए Dockerfile नहीं मिल रहा जिसमें बस भाषा का वैरिएबल बदला हो। जो स्ट्रक्चर बनता है, वह आपके बन रहे ऐप टाइप के हिसाब से बदलता है।
अगर docker init आपका स्टैक डिटेक्ट नहीं कर पाता, तो यह आपसे सूची में से एक को मैन्युअली चुनने को कहेगा।
docker init तीन फ़ाइलें जनरेट करता है, और सेटअप में हर एक की अलग भूमिका होती है।
Dockerfile परिभाषित करता है कि Docker आपका कंटेनर इमेज कैसे बनाएगा। यह Docker को बताता है कि किस बेस इमेज से शुरू करना है, डिपेंडेंसीज़ कैसे इंस्टॉल करनी हैं, और कंटेनर शुरू होने पर कौन-सा कमांड चलाना है।
यहाँ एक उदाहरण है कि जनरेटेड Python Dockerfile कैसा दिखता है:
FROM python:3.14-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
बिल्ड करने से पहले आप इस फ़ाइल की समीक्षा करना चाहेंगे। जनरेटेड आउटपुट अच्छा शुरुआती बिंदु है, लेकिन आपको इसे थोड़ा एडजस्ट करना पड़ सकता है - जैसे, एनवायरनमेंट वेरिएबल्स जोड़ना या बेस इमेज वर्ज़न बदलना।
.dockerignore फ़ाइल Docker को बताती है कि बिल्ड कॉन्टेक्स्ट से किन फ़ाइलों को बाहर रखना है। यही वह फ़ाइलों का सेट है जिसे Docker आपकी इमेज बनाते समय बिल्ड इंजन को भेजता है।
इसके बिना, Docker आपके प्रोजेक्ट फ़ोल्डर की हर चीज़ इमेज में कॉपी कर देगा, जिनमें .git, node_modules, या लोकल कॉन्फ़िग फ़ाइलें भी होंगी जिनकी प्रोडक्शन में जरूरत नहीं। इससे इमेज का आकार बढ़ता है और अनजाने में ऐसी फ़ाइलें शामिल हो सकती हैं जिन्हें आप नहीं जोड़ना चाहते थे।
एक सामान्य .dockerignore कुछ ऐसा दिखता है:
.git
.env
__pycache__
*.pyc
node_modules
compose.yaml फ़ाइल मल्टी-कंटेनर सेटअप चलाने के काम आती है। यह आपकी सर्विसेज़, पोर्ट्स, वॉल्यूम्स, और कंटेनरों के परस्पर कनेक्शन को परिभाषित करती है।
सिंपल सिंगल-कंटेनर ऐप के लिए इसकी आवश्यकता नहीं भी हो सकती। लेकिन अगर आपके प्रोजेक्ट में डेटाबेस, कैश, या आपकी ऐप के साथ चलने वाली कोई और सर्विस शामिल है, तो Compose फ़ाइल में ही सब कुछ एक जगह कॉन्फ़िगर किया जाता है।
आइए एक वास्तविक प्रोजेक्ट पर docker init चलाएँ। उदाहरण के तौर पर मैं एक मिनिमल FastAPI ऐप का उपयोग करूंगा/करूंगी जिसमें एक ही रूट है।
यह है प्रोजेक्ट स्ट्रक्चर docker init चलाने से पहले:
my-fastapi-app/
├── app.py
└── requirements.txt
app.py में एक Hello World रूट है:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello, World!"}
और requirements.txt में ये दो डिपेंडेंसीज़ हैं:
fastapi
uvicorn
शुरू करने के लिए, प्रोजेक्ट फ़ोल्डर पर जाएँ और चलाएँ:
docker init

Docker init ने प्रोजेक्ट डिटेक्ट किया
docker init requirements.txt से Python डिटेक्ट करता है और आपसे कुछ सवाल पूछता है। यहाँ प्रॉम्प्ट्स कैसे दिखते हैं और क्या जवाब देना है:

Python प्रोजेक्ट के लिए Docker init प्रॉम्प्ट्स
प्रॉम्प्ट्स के बाद आपका प्रोजेक्ट फ़ोल्डर कुछ ऐसा दिखेगा:

नया प्रोजेक्ट फ़ोल्डर स्ट्रक्चर
तीन नई फ़ाइलें हैं। आइए एक-एक करके देखें।
# syntax=docker/dockerfile:1
ARG PYTHON_VERSION=3.14
FROM python:${PYTHON_VERSION}-slim as base
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /app
ARG UID=10001
RUN adduser \
--disabled-password \
--gecos "" \
--home "/nonexistent" \
--shell "/sbin/nologin" \
--no-create-home \
--uid "${UID}" \
appuser
RUN --mount=type=cache,target=/root/.cache/pip \
--mount=type=bind,source=requirements.txt,target=requirements.txt \
python -m pip install -r requirements.txt
USER appuser
COPY . .
EXPOSE 8000
CMD uvicorn 'app:app' --host=0.0.0.0 --port=8000
यहाँ कुछ बातें ध्यान देने लायक हैं। PYTHONDONTWRITEBYTECODE=1 Python को डिस्क पर .pyc फ़ाइलें लिखने से रोकता है, और PYTHONUNBUFFERED=1 सुनिश्चित करता है कि लॉग्स बफर में रुके रहने के बजाय रीयल-टाइम में दिखें - दोनों ही कंटेनराइज़्ड ऐप्स के लिए अच्छे डिफ़ॉल्ट हैं।
adduser ब्लॉक एक appuser नाम का नॉन-प्रिविलेज्ड यूज़र बनाता है जो एप्लिकेशन चलाएगा। डिफ़ॉल्ट रूप से Docker कंटेनर root के रूप में चलते हैं, जो सुरक्षा जोखिम है। नॉन-रूट यूज़र के रूप में चलाने से, अगर कोई हमलावर आपकी ऐप से बाहर निकल भी जाए तो उसके नुकसान की सीमा कम होती है।
pip install स्टेप पर --mount=type=cache फ़्लैग Docker को बताता है कि डाउनलोड किए गए पैकेजों को बिल्ड्स के बीच कैश करे। इसका मतलब है कि आगे के बिल्ड्स डिपेंडेंसीज़ को दोबारा शुरू से डाउनलोड नहीं करेंगे, जिससे स्पीड बढ़ती है।
**/.DS_Store
**/__pycache__
**/.venv
**/.env
**/.git
**/.gitignore
**/node_modules
**/Dockerfile*
**/compose.y*ml
README.md
.dockerignore फ़ाइल उन फ़ाइलों को बाहर रखती है जो आपकी इमेज में नहीं जानी चाहिए। लोकल एनवायरनमेंट फ़ाइलें जैसे .env, वर्ज़न कंट्रोल फ़ोल्डर जैसे .git, और Python कैश फ़ाइलें जैसे __pycache__ सभी स्किप हो जाते हैं। Dockerfile और compose.yaml खुद भी एक्सक्लूड किए जाते हैं - Docker को उस इमेज के अंदर इनकी जरूरत नहीं जिसे वह बना रहा है।
services:
server:
build:
context: .
ports:
- 8000:8000
Compose फ़ाइल आपकी ऐप को server नाम की सर्विस के रूप में परिभाषित करती है, मौजूदा डायरेक्टरी के Dockerfile से इसे बिल्ड करती है, और होस्ट के 8000 पोर्ट को कंटेनर के 8000 पोर्ट से मैप करती है।
तीनों जनरेटेड फ़ाइलों में कुछ कमेंट्स होते हैं जिन्हें साफ़-सफाई के लिए मैंने यहाँ छोड़ दिया है।
docker compose up --build चलाएँ और आपकी FastAPI ऐप http://localhost:8000 पर लाइव होगी।

कंटेनर में चल रही FastAPI ऐप
दोनों तरीकों से आपको एक काम करने वाला Dockerfile मिल जाएगा, फर्क बस इतना है कि आपको कितनी कंट्रोल चाहिए और कितनी जल्दी आप वहां पहुँचना चाहते हैं।
docker init तेज़ विकल्प है। आप कुछ प्रॉम्प्ट्स का जवाब देते हैं और एक मिनट से भी कम समय में एक काम करने वाली, काफी हद तक सुरक्षित कॉन्फ़िगरेशन मिल जाती है। जनरेटेड फ़ाइलें Docker की अपनी बेस्ट प्रैक्टिसेज़ का पालन करती हैं - नॉन-रूट यूज़र्स, बिल्ड कैशिंग, उचित .dockerignore पैटर्न - इसलिए आप शून्य से शुरुआत नहीं कर रहे हैं।
यह तब उपयुक्त है जब आप नया प्रोजेक्ट शुरू कर रहे हों, किसी टीममेट को ऑनबोर्ड कर रहे हों, या बिना बोइलरप्लेट में समय लगाए एक ठोस बेसलाइन चाहते हों।
लेकिन लचीलापन एक सवाल है। टेम्पलेट्स आम स्टैक्स को अच्छी तरह कवर करते हैं, पर अंततः वे टेम्पलेट्स ही हैं। यदि आपके प्रोजेक्ट की संरचना असामान्य है या विशेष बिल्ड आवश्यकताएँ हैं, तो आप docker init की सीमाओं तक पहुँच सकते हैं।
अपना Dockerfile खुद लिखने से हर लेयर, हर इंस्ट्रक्शन और हर बिल्ड निर्णय पर आपका पूरा नियंत्रण रहता है। आप इमेज साइज घटाने के लिए मल्टी-स्टेज बिल्ड्स लागू कर सकते हैं, कस्टम बेस इमेजेस का उपयोग कर सकते हैं, या कैशिंग व्यवहार को इस तरह फाइन-ट्यून कर सकते हैं जैसा docker init पहले से नहीं जान सकता।
लेकिन इसके लिए जानकारी चाहिए। खराब तरीके से लिखा Dockerfile अनावश्यक रूप से बड़ी इमेज बना सकता है, सुरक्षा मुद्दे ला सकता है, या ऐसे तरीकों से फेल हो सकता है जिन्हें डिबग करना कठिन हो, खासकर यदि आप अनुभवहीन हैं।
इसे सरल तरीके से ऐसे सोचें:

Docker init बनाम मैनुअल सेटअप तुलना
अच्छा तरीका है docker init से शुरुआत करें और आवश्यकताएँ बढ़ने पर जनरेटेड फ़ाइलों को मैन्युअली एडिट करें।
docker init हर स्थिति के लिए सही टूल नहीं है। कब इसका उपयोग समझदारी है और कब नहीं, यह रहा:
इन स्थितियों में docker init चुनें:
आप नया प्रोजेक्ट शुरू कर रहे हैं: यह आपकी Docker कॉन्फ़िगरेशन को एक मिनट से कम में शुरू कर देता है, ताकि आप कंटेनराइज़ेशन सेटअप के बजाय कोड लिखने पर ध्यान दे सकें
आप Docker सीख रहे हैं: जनरेटेड फ़ाइलें अच्छे कमेंट्स वाली हैं और बेस्ट प्रैक्टिसेज़ फॉलो करती हैं। ये किसी रैंडम Stack Overflow स्निपेट से बेहतर शुरुआती बिंदु हैं
आप प्रोटोटाइपिंग कर रहे हैं: जब आपको जल्दी से कंटेनराइज़्ड एनवायरनमेंट चाहिए और बिल्ड फाइन-ट्यूनिंग मायने नहीं रखती, docker init आपको तुरंत काम करने लायक सेटअप देता है
आप टीम में मानकीकरण चाहते हैं: हर डेवलपर अपने-अपने Dockerfile लिखने के बजाय, docker init सभी को एक जैसा स्ट्रक्चर और डिफ़ॉल्ट्स वाला कंसिस्टेंट शुरुआती बिंदु देता है
इन स्थितियों में docker init को छोड़ दें:
आपको मल्टी-स्टेज बिल्ड्स चाहिए: अगर आप अलग-अलग स्टेज में बिल्ड बाँटकर इमेज साइज ऑप्टिमाइज़ कर रहे हैं - एक में कम्पाइल, दूसरे में रन - तो वह आपको मैन्युअली लिखना होगा। जनरेटेड Dockerfile सिंगल-स्टेज होता है
आपकी प्रोडक्शन आवश्यकताएँ जटिल हैं: कस्टम बेस इमेजेस, एडवांस्ड कैशिंग रणनीतियाँ, नॉन-स्टैंडर्ड प्रोजेक्ट लेआउट्स - ये वे चीजें नहीं हैं जिन्हें docker init पहले से भांप सके। आप जनरेटेड फ़ाइलों के इर्द-गिर्द काम करने में अधिक समय खर्च करेंगे, बजाए अपना खुद का लिखने के
संक्षेप में, docker init एक शुरुआती बिंदु है। इससे आगे बढ़ें, और जरूरतों के बढ़ने पर जनरेटेड फ़ाइलों को एडिट करें।
जैसे-जैसे आपका प्रोजेक्ट बढ़ता है, आपको कुछ सीमाएँ दिख सकती हैं। यहाँ कुछ हैं।
जनरेटेड फ़ाइलें टेम्पलेट-आधारित होती हैं। वे हर सपोर्टेड स्टैक के सबसे आम मामलों को कवर करने के लिए बनी हैं, इसलिए सामान्य प्रोजेक्ट्स में वे अच्छा काम करती हैं और उनके बाहर कम। यदि आपके प्रोजेक्ट की संरचना असामान्य है, तो संभव है कि जनरेटेड फ़ाइलें उसे ध्यान में न रखें।
एक और आम सीमा यह है कि मैन्युअल ट्यूनिंग लगभग हमेशा आवश्यक होती है। डिफ़ॉल्ट्स अच्छे हैं, पर वे फिर भी डिफ़ॉल्ट्स ही हैं। आपको बेस इमेज वर्ज़न एडजस्ट करना पड़ सकता है, एनवायरनमेंट वेरिएबल्स में बदलाव करना पड़ सकता है, या स्टार्ट कमांड मॉडिफ़ाई करना पड़ सकता है, ताकि कॉन्फ़िगरेशन आपके प्रोजेक्ट पर फिट बैठे। जनरेटेड फ़ाइलों को पहले ड्राफ्ट की तरह समझें, इससे ज़्यादा नहीं।
docker init एडवांस्ड बिल्ड पैटर्न्स को भी सपोर्ट नहीं करता। मल्टी-स्टेज बिल्ड्स, कस्टम बिल्ड आर्ग्युमेंट्स, कंडीशनल लॉजिक, और अन्य तकनीकें जिन पर अनुभवी Docker यूज़र्स प्रोडक्शन इमेजेज़ के लिए निर्भर करते हैं, इस टूल के दायरे से बाहर हैं। लेकिन अगर आपको यह सब चाहिए, तो आप वैसे भी अपना Dockerfile खुद लिख रहे होंगे।
इनमें से कोई भी बात docker init को खराब टूल नहीं बनाती। बस अपेक्षाएँ सही रखें - यह ब्लैंक-पेज समस्या हटाता है, लेकिन आपके Dockerfile को समझने की जरूरत को नहीं।
docker init जो फ़ाइलें बनाता है, वे शुरुआती बिंदु हैं। इन्हें प्रोडक्शन-रेडी बनाने के लिए आपको ये कदम उठाने चाहिए।
जनरेटेड फ़ाइलों की समीक्षा करें: Dockerfile, .dockerignore, और compose.yaml को लाइन-दर-लाइन पढ़ें। फ़ाइलों में अच्छे कमेंट्स हैं, इसलिए यह ज़्यादा समय नहीं लेगा। ऊपर कुछ बनाने से पहले आप समझ लें कि अंदर क्या है
अपनी इमेज साइज ऑप्टिमाइज़ करें: डिफ़ॉल्ट बेस इमेज python:3.x-slim है, जो पहले से हल्की है। लेकिन आप और आगे जा सकते हैं - सुनिश्चित करें कि आपका .dockerignore हर अनावश्यक चीज़ को एक्सक्लूड कर रहा है, और यह भी जाँचें कि आप इमेज में वे फ़ाइलें कॉपी नहीं कर रहे जिनकी जरूरत नहीं
सीक्रेट्स और एनवायरनमेंट-विशिष्ट वैल्यूज़ को एनवायरनमेंट वेरिएबल्स में रखें: API कीज़, डेटाबेस URLs, या एनवायरनमेंट फ़्लैग्स को अपने Dockerfile में हार्डकोड न करें। एनवायरनमेंट वेरिएबल्स का उपयोग करें, और उन्हें लोकल में .env फ़ाइल से या प्रोडक्शन में अपने डिप्लॉयमेंट प्लेटफ़ॉर्म के सीक्रेट मैनेजमेंट से मैनेज करें
कहीं पुश करने से पहले लोकली टेस्ट करें: docker compose up --build चलाएँ और सत्यापित करें कि कंटेनर के अंदर आपकी ऐप का व्यवहार बाहर जैसा ही है। अपने लॉग्स देखें, एंडपॉइंट्स पर जाएँ, और पोर्ट मैपिंग की पुष्टि करें
प्रोजेक्ट बढ़ने पर बिल्ड स्टेप्स को परिष्कृत करें: जनरेटेड Dockerfile डिपेंडेंसीज़ को एक ही लेयर में इंस्टॉल करता है। जैसे-जैसे प्रोजेक्ट परिपक्व होता है, लेयर ऑर्डरिंग पर विचार करें। यानी जो स्टेप्स कम बदलते हैं उन्हें फ़ाइल में ऊपर रखें ताकि Docker उन्हें कैश कर सके। यदि बिल्ड टाइम बढ़ने लगें, तो यही पहला स्थान है देखने का
टेक में हमेशा की तरह, कुछ बातें गलत हो सकती हैं। यहाँ देखें क्या जाँचना है और कैसे ठीक करना है।
अगर docker init गलत स्टैक चुन लेता है, तो यह ऐसी फ़ाइलें बनाएगा जो आपके प्रोजेक्ट से मेल नहीं खातीं। यह आमतौर पर तब होता है जब आपके प्रोजेक्ट फ़ोल्डर में मिक्स-भाषा फ़ाइलें हों या वह फ़ाइल गायब हो जिसे docker init ढूंढता है - जैसे Python के लिए requirements.txt या Node.js के लिए package.json।
जब प्रॉम्प्ट एप्लिकेशन प्लेटफ़ॉर्म पूछे, तो डिटेक्टेड डिफ़ॉल्ट स्वीकार करने के बजाय सही विकल्प मैन्युअली चुनें।
अगर आपका कंटेनर शुरू हो जाता है लेकिन आप अपनी ऐप तक नहीं पहुँच पाते, या Docker पोर्ट पहले से उपयोग में होने की त्रुटि देता है, तो संभवतः आपकी मशीन पर कोई और प्रोसेस उसी पोर्ट का उपयोग कर रहा है।
कन्फ्लिक्टिंग प्रोसेस को ढूँढकर बंद करें, या अपने compose.yaml में होस्ट-साइड पोर्ट बदलें:
ports:
- 8001:8000 # maps host port 8001 to container port 8000
बाएँ तरफ़ आपकी मशीन का पोर्ट है। दाएँ तरफ़ वाला कंटेनर के अंदर आपकी ऐप जिस पोर्ट पर सुनती है उससे मेल खाना चाहिए।
अगर आपका कंटेनर बिल्ड हो जाता है लेकिन स्टार्ट पर क्रैश हो जाता है, तो अक्सर वजह मिसिंग डिपेंडेंसीज़ होती है। देखें कि आपका requirements.txt (या समकक्ष) पूरा और अपडेटेड है या नहीं। अगर आपने लोकली कोई पैकेज जोड़ दिया है लेकिन उस फ़ाइल को अपडेट नहीं किया, तो कंटेनर में वह नहीं होगा।
docker compose logs चलाकर एरर आउटपुट देखें:
docker compose logs
एरर मैसेज आमतौर पर बताएगा कि कौन-सा पैकेज गायब है।
अगर कंटेनर बिल्कुल शुरू नहीं होता, तो समस्या लगभग हमेशा आपके Dockerfile की CMD लाइन में होती है। जाँचें कि स्टार्ट कमांड आपकी ऐप को वास्तव में जिस तरह चलाते हैं उससे मेल खाता है।
FastAPI उदाहरण के लिए, यह कुछ ऐसा होना चाहिए:
CMD uvicorn 'app:app' --host=0.0.0.0 --port=8000
यदि आपकी एंट्री प्वाइंट फ़ाइल का नाम अलग है या मॉड्यूल पथ गलत है, तो कंटेनर बाहर निकल जाएगा। CMD को ठीक करें, docker compose up --build से दोबारा बिल्ड करें, और लॉग्स फिर देखें।
docker init Docker की गहरी समझ का विकल्प नहीं है, लेकिन यह ब्लैंक-पेज समस्या से आपको निकाल देता है।
एक ही कमांड में, आपको काम करने वाला Dockerfile, .dockerignore, और compose.yml मिलता है - और ये सभी Docker की अपनी बेस्ट प्रैक्टिसेज़ फॉलो करते हैं। यह किसी भी नए प्रोजेक्ट के लिए अच्छी नींव है, और Stack Overflow या ChatGPT से कॉपी-पेस्ट किए गए टेम्पलेट की तुलना में कहीं बेहतर शुरुआत।
बस यहीं रुकें नहीं। जनरेटेड फ़ाइलें एडिट करने के लिए ही बनी हैं। उनकी समीक्षा करें, बिल्ड स्टेप्स को ट्यून करें, बेस इमेज वर्ज़न को लॉक करें, और अपने एनवायरनमेंट वेरिएबल्स जोड़ें। जैसे-जैसे आपका प्रोजेक्ट बढ़ेगा, आप डिफ़ॉल्ट्स से दूर जाते जाएँगे।
अगर आपको Docker की बुनियादी जानकारी है, तो अगला तार्किक कदम है मल्टी-स्टेज बिल्ड्स, नेटवर्किंग टूल्स, और Docker Compose के बारे में सीखना - जिन सबको हमारे Intermediate Docker कोर्स में कवर किया गया है।
यह एक Docker CLI कमांड है जो किसी प्रोजेक्ट को कंटेनराइज़ करने के लिए आवश्यक कॉन्फ़िगरेशन फ़ाइलें जनरेट करता है। यह आपके प्रोजेक्ट टाइप के आधार पर Dockerfile, .dockerignore, और compose.yaml बनाता है। इन्हें शून्य से लिखने के बजाय, आप कुछ प्रॉम्प्ट्स का जवाब देते हैं और बाकी काम docker init कर देता है।
नहीं, इसे विशेष रूप से उन डेवलपर्स के लिए बनाया गया है जो Docker में नए हैं, ताकि एंट्री की बाधा कम हो। फिर भी, यदि आपको कंटेनरों की बुनियाद समझ आती है तो आप इससे अधिक लाभ उठाएँगे। जनरेटेड फ़ाइलें अच्छे कमेंट्स वाली होती हैं, इसलिए वे हर कॉन्फ़िगरेशन स्टेप को समझने के लिए सीखने का टूल भी हैं।
docker init वर्तमान में Python, Node.js, Go, Java, और .NET को सपोर्ट करता है। यह आपके प्रोजेक्ट फ़ोल्डर को स्कैन करके requirements.txt या package.json जैसी भाषा-विशिष्ट फ़ाइलों से आपका स्टैक डिटेक्ट करता है। अगर डिटेक्शन फेल हो जाए या आपका स्टैक सपोर्टेड न हो, तो आप प्रॉम्प्ट से प्लेटफ़ॉर्म मैन्युअली चुन सकते हैं।
हाँ, आप docker init किसी भी प्रोजेक्ट फ़ोल्डर में चला सकते हैं, न कि सिर्फ नए प्रोजेक्ट्स में। अगर डायरेक्टरी में पहले से Docker कॉन्फ़िगरेशन फ़ाइलें मौजूद हैं, तो docker init उन्हें ओवरराइट करने से पहले चेतावनी देगा। यह किसी आउटडेटेड या खराब लिखे Dockerfile को एक साफ़-सुथरी, बेस्ट-प्रैक्टिस बेसलाइन से बदलने का अच्छा तरीका है।
जनरेटेड फ़ाइलें Docker की अपनी बेस्ट प्रैक्टिसेज़ का पालन करती हैं - नॉन-रूट यूज़र, बिल्ड कैशिंग, और स्लिम बेस इमेज - इसलिए ये एक ठोस शुरुआती बिंदु हैं। लेकिन ये फाइनल प्रोडक्शन सेटअप नहीं हैं। आपको फिर भी एनवायरनमेंट वेरिएबल्स कॉन्फ़िगर करने, बिल्ड स्टेप्स फाइन-ट्यून करने, और डिप्लॉयमेंट आवश्यकताओं के आधार पर संभवतः मल्टी-स्टेज बिल्ड्स लागू करने की आवश्यकता होगी।
DataCamp के साथ Docker सीखें
कोर्स
कोर्स
लर्निंग पाथ