Skip to content

Table of Contents


🌟 Introduction: Docker Kya Hai aur Kyun Zaroori Hai? (Aur Gehraai Mein)

Hello, mere future ke nanhe engineers! 👋 Yaad hai, humne pichli baar Docker ko ek jaadui box ki tarah samjha tha? Ab hum is magic ko aur kareeb se dekhenge. Socho, agar aap apne favourite game ko kisi bhi computer par ekdum theek se chalana chaho, toh Docker usmein kaise madad karta hai.

Docker - Ek Jaadui Box Factory Ki Tarah

Imagine karo aap ek bahut bade Magic Box Factory ke owner ho. 🏭 Aapka kaam hai apps (jaise games, websites) ko aise special boxes mein pack karna jo:

  1. Har jagah chal sakein: Chahe woh aapke dost ka laptop ho, aapki teacher ka computer ho, ya internet par koi bada server.
  2. Ek jaise kaam karein: Matlab, jaisi woh aapke computer par chalti thi, waisi hi sab jagah chale, bina kisi gadbad ke.
  3. Saare zaroori saamaan ke saath hon: Box ke andar app ko chalane ke liye jo bhi chahiye (jaise uske rules, uske tools, uski batteries), sab kuch ussi box mein pack ho.

Yeh Magic Box Factory hi Docker hai! 🐳 Aur jo individual Magic Boxes yeh factory banati hai, unhein hum Docker Containers kehte hain.

Picture time! Dekho, Docker kaise traditional virtual machines (VMs) se alag hai. VMs har app ke liye poora operating system copy karte hain (bada sa box), jabki Docker sirf app aur uske zaroori parts ko pack karta hai (chota aur tez box).

Docker Architecture: Docker vs VMsImage: Docker vs Virtual Machines. Docker lighter aur faster hota hai kyunki yeh OS kernel ko share karta hai. VMs ke paas apna poora OS hota hai.

Apps Ko Har Jagah Chalana: Kyun Itna Mushkil Hota Hai?

Kabhi aapne socha hai ki apps har computer par ek jaisi kyun nahi chalti? Iski wajah yeh hai:

  • Missing Ingredients (Zaroori Samaal): Har app ko chalane ke liye kuch special software ki zaroorat hoti hai (jaise koi special font, ya koi helper tool). Agar woh tools us computer par nahi hain jahan aap app chalana chahte ho, toh app kahegi, "Sorry, main nahi chal sakti!" 😔 Jaise aap pizza banana chaho, par aapke paas cheeze hi na ho!
  • Different Kitchens (Operating Systems): Har computer ka apna ek "kitchen" hota hai jise Operating System (OS) kehte hain (jaise Windows, macOS, Linux). Har kitchen mein kaam karne ka tarika thoda alag hota hai. Agar aapki app ek kitchen ke liye bani hai, toh ho sakta hai woh doosre kitchen mein theek se kaam na kare. 🍕
  • "Mere Computer Par Toh Chal Raha Tha!" Problem: Jab software developers apps banate hain, toh woh unke apne computer par ekdum theek se chalti hain. Lekin jab woh app kisi aur ko dete hain, toh woh "mere system pe toh chal raha tha!" wali problem aa jaati hai. Isko bade log "dependency hell" ya "configuration nightmare" bolte hain. Bahut frustrating hota hai! 😫

Docker Aaya, Saari Problems Bhagaya!

Docker in saari mushkilon ko ekdum aasan bana deta hai! Yeh aapki app aur uske saare zaroori samaan ko ek chote, alag-thalag Magic Box mein pack kar deta hai. Isse:

  • Consistent Environment (Har Jagah Ek Jaisa Maahol): Aapki app har jagah ek jaisi chalegi, chahe computer koi bhi ho. Jaise aapki favourite chocolate har dukaan par ek hi taste karti hai! 🍫
  • Efficient Resource Use (Computer Ki Power Kam Use Hoti Hai): Docker ke Magic Boxes Virtual Machines (VMs) se bahut chhote aur fast hote hain. VMs poora ek naya computer banate hain (jaise ek ghar ke andar doosra ghar banana), jabki Docker sirf app ke liye zaroori cheezein pack karta hai (jaise ek ghar ke andar ek chota sa room banana jahan app reh sake). Isse aapke computer ki power kam use hoti hai aur woh tez chalta hai. ⚡
  • Easy to Manage (Aasan Hai Sambhalna): Apps ko install karna, hatana, ya update karna bahut easy ho jaata hai. Jaise aap apne LEGO blocks ko boxes mein rakh ke easily handle karte ho. 🧱
  • Faster Delivery (Tez Delivery): Developers apni apps ko jaldi se jaldi test kar sakte hain aur doosron tak pahuncha sakte hain. Imagine, aapki game turant sabke paas pahunch gayi! 🚀

Toh ab aap samajh gaye na, Docker ek super-hero ki tarah hai jo apps ko har jagah smoothly chalane mein help karta hai! Chalo, ab iske baare mein aur details mein jaante hain.

Docker Seekhne Ke Liye Kya Chahiye? (Pre-requisites)

Docker ko use karne ke liye, aapko bas kuch basic cheezein chahiye:

  1. Ek Computer: Windows, macOS, ya Linux (agar aapke paas hai toh).
  2. Docker Desktop Installed Hona Chahiye: Yeh woh software hai jo aapke computer par Docker ko chalata hai. Isse install karna bahut easy hai. Aap apne parents se bol sakte ho ki woh https://www.docker.com/products/docker-desktop par jaakar isse download aur install kar dein. (Agar aapko Windows par WSL2 setup karna pade toh ghabrana mat, Docker Desktop khud help karega.)
  3. Ek Text Editor: Jaise Notepad (Windows), TextEdit (macOS), ya phir VS Code (agar aapko coding ka shauk hai, yeh bahut accha editor hai aur free hai).
  4. Terminal/Command Prompt: Yeh woh window hai jahan hum commands type karte hain. Windows mein "Command Prompt" ya "PowerShell" search karo. macOS aur Linux mein "Terminal" hota hai.

Bas, itna hi chahiye! Ab hum asli mazze mein chalte hain!


Chapter 1: Docker Ki Duniya Ka Darwaza Aur Gehraai Mein 🚪

Chalo, ab hum Docker ke andar ki cheezon ko aur acche se samajhte hain.

Picture time! Dekho, Docker Engine kaise kaam karta hai. Aap Command Line (CLI) se instructions dete ho, woh instructions Docker Daemon (manager) tak pahunchte hain, aur Daemon Magic Boxes (Containers) ko control karta hai.

Docker Engine ArchitectureImage: Docker Engine ka Architecture. CLI commands ko Docker Daemon tak bhejta hai jo images, containers, networks, aur volumes ko manage karta hai.

Docker Engine: Jaadui Box Ka Brain Aur Manager

Imagine karo, aapki Magic Box Factory mein ek bahut hi smart Brain hai, jo saara kaam dekhta hai. Yeh Brain hi Docker Engine hai. Yeh Manager ki tarah kaam karta hai.

Docker Engine ke 3 main hisse (parts) hain:

  1. Daemon (Manager Himself): Yeh woh asli Manager hai jo aapke computer ke background mein hamesha chalta rehta hai. Yeh saare Magic Boxes (Containers), Recipes (Images), aur unke saare connections (Networks) ko sambhalta hai. Agar aapko koi naya Magic Box banana hai ya kisi Magic Box ko band karna hai, toh Daemon hi woh kaam karta hai.

    • Analogy: Yeh ek Smart Robot jaisa hai jo factory mein saare machines ko control karta hai aur saare kaam karta hai. 🤖
  2. REST API (Manager Se Baat Karne Ki Bhasha): Jaise aap apne dost se baat karne ke liye Hindi, English, ya Hinglish use karte ho, waise hi computer programs Daemon se baat karne ke liye ek special computer language (REST API) use karte hain. Yeh ek set of rules hain jisse apps Daemon ko commands bhejti hain.

    • Analogy: Yeh ek Secret Code jaisa hai jisko type karke aap Robot Manager ko instructions de sakte ho. 🤫
  3. Command Line Interface (CLI) (Aapka Keyboard Aur Screen): Yeh woh tool hai jiska use karke hum apne keyboard se commands type karte hain, aur woh commands REST API ke zariye Daemon tak pahunchte hain. Jo output (result) Robot Manager wapas bhejta hai, woh aapko screen par dikhta hai.

    • Analogy: Yeh Aapka Phone jaisa hai, jisse aap text message bhejte ho (commands), aur reply (output) receive karte ho. 📱

Toh, jab aap terminal mein docker command type karte ho, toh aap asal mein CLI ka use kar rahe hote ho jo REST API ke zariye Daemon ko instructions bhej raha hota hai.

bash
# Example: Aapka CLI (Terminal) Docker Daemon se kaise baat karta hai
# Yeh command Docker Daemon ko bolta hai ki "jitne bhi Docker images hain, unki list dikhao".
docker images ls

Kya likha hai aur kyun:

  • docker: Yeh keyword batata hai ki hum Docker Engine se baat kar rahe hain.
  • images: Hum bol rahe hain ki "images" (yani Recipes) ke baare mein kuch karna hai.
  • ls: Yeh command hai jo "list" karne ke liye use hota hai. Matlab, "Images ko list karo".

Docker Hub: Apps Ki Super Online Library

Yaad hai, humne Docker Hub ko online library kaha tha? Ab socho, yeh library kitni badi hai!

  • Lakhon Images: Yahan par hazaron, balki lakhon, pehle se bani-banayi Docker Images (apps ki recipes) maujood hain. Jaise Google Play Store ya Apple App Store mein apps hoti hain, waise hi Docker Hub par Docker apps ki recipes hoti hain.
  • Free aur Paid: Kuch images free mein available hain, jo koi bhi use kar sakta hai (jaise ubuntu, nginx, python). Kuch images private ya paid bhi hoti hain jo companies apne secret projects ke liye banati hain.
  • Aap Bhi Upload Kar Sakte Ho: Aap apni khud ki banayi hui app ki recipe (image) bhi Docker Hub par upload kar sakte ho, taki doosre log use kar sakein. Jaise YouTube par aap apna video upload karte ho. 🎬

Aap https://hub.docker.com/ par jaakar dekh sakte ho.

Docker Hub ScreenshotImage: Docker Hub ka ek screenshot. Yahan aapko lakhon ready-to-use Docker Images (recipes) mil jayengi.

bash
# Example: Docker Hub se ek image download karna (pull)
# Yeh command Docker Daemon ko bolta hai ki "Docker Hub se 'alpine' image download karo."
docker image pull alpine

Kya likha hai aur kyun:

  • docker image pull: Yeh command Docker Hub se ek image ko download karne ke liye use hota hai. pull matlab "kheecho" ya "download karo".
  • alpine: Yeh us image ka naam hai jo hum download karna chahte hain. alpine ek bahut choti Linux ki image hai jo testing ke liye bahut acchi hoti hai.

Image vs. Container: Recipe Aur Bana Hua Khana (Aur Details)

Yeh concept bahut important hai, chalo isse aur acche se samajhte hain:

  • Docker Image (Recipe Book):

    • Yeh ek blueprint hai: Jaise aapki mummy ke paas ek recipe book hai jismein biryani banane ki recipe likhi hai. Woh recipe khud biryani nahi hai, bas banane ka tarika hai.
    • Read-Only (Sirf Dekh Sakte Ho): Images "read-only" hoti hain. Matlab, aap unko seedhe change nahi kar sakte. Agar aapko recipe mein koi change karna hai, toh aapko ek nayi recipe banani padegi.
    • Layers mein banti hai: Har image chhote-chhote "layers" se banti hai. Jaise sandwich mein alag-alag layers hoti hain. Jab aap image mein kuch add karte ho, toh ek naya layer ban jaata hai. Yeh bahut smart tarika hai jisse images choti rehti hain.
  • Docker Container (Bana Hua Khana):

    • Yeh ek running instance hai: Jab aap mummy ki recipe ko follow karke asli mein biryani banate ho aur use khaate ho, toh woh "Container" hai. Yeh live aur interactive hota hai.
    • Read-Write (Changes Kar Sakte Ho): Containers "read-write" hote hain. Matlab, aap unke andar changes kar sakte ho. Jaise, biryani mein aur namak dalna.
    • Image ke upar ek layer: Jab ek container banta hai, toh woh image ki ek copy (read-only) ke upar ek chota sa "read-write" layer bana leta hai. Jo bhi changes aap container ke andar karte ho, woh is read-write layer mein save hote hain. Isse original image safe rehti hai, aur aap ek hi recipe se kitni bhi biryani bana sakte ho, aur har biryani mein alag-alag changes kar sakte ho!

Image vs Container layers analogyImage: Image (read-only layers) ke upar Container (read-write layer). Jab aap container mein changes karte ho, woh naye read-write layer mein save hote hain, original image safe rehti hai.

Docker Commands: Batcheet Kaise Karein? (Basic Cheatsheet)

Docker se baat karne ke liye hum kuch special words (commands) use karte hain. In commands ka ek common structure hota hai:

docker [ManagementCommand] [ActionCommand] [Options/Arguments]

  • docker: Yeh har command ke shuru mein aayega, batane ke liye ki hum Docker se baat kar rahe hain.
  • [ManagementCommand]: Yeh batata hai ki aap kis cheez ke baare mein baat kar rahe ho (jaise container ke baare mein, image ke baare mein, volume ke baare mein).
  • [ActionCommand]: Yeh batata hai ki aapko kya action perform karna hai (jaise ls for list, run for chalao, stop for roko).
  • [Options/Arguments]: Yeh extra information hoti hai, jaise naam dena, ports specify karna, ya koi specific file ka path.

Yahan kuch bahut hi basic aur zaroori commands hain jo aapko baar-baar use karne padenge:

CommandKya Karta Hai? (Meaning)Analogy
docker image pull <image-name>Docker Hub se ek image (recipe) download karta hai.Online library se kitab (recipe) download karna.
docker image lsAapke computer par saari download ki hui images ki list dikhata hai.Aapki library mein kaun-kaun si kitabein hain, unki list.
docker container run <image-name>Ek naya container (bana hua khana) banata hai aur usse chalata hai.Recipe se naya khana banana aur usse serve karna.
docker container lsJo containers chal rahe hain, unki list dikhata hai.Jo khana abhi table par serve ho raha hai, unki list.
docker container ls -aSaare containers ki list dikhata hai, chahe woh chal rahe ho ya band ho.Sab khane ki list, chahe woh abhi kha rahe ho ya plate mein rakhe ho.
docker container stop <container-id>Ek chalte hue container ko rok deta hai.Khana khana rok do.
docker container rm <container-id>Ek band container ko delete kar deta hai.Khaali plate ko dustbin mein daal do.
docker volume lsSaare volumes (permanent lockers) ki list dikhata hai.Aapke paas kitne lockers hain, unki list.

Toh, chalo ab asli mein coding aur Docker Magic Box banana shuru karte hain! Next chapter mein hum apni pehli app banayenge! 🚀


Chapter 2: Pehla Step: Apni Pehli App Banana (LAB-01 - Full Details) 🏗️

Chalo, ab hum apni bilkul pehli choti si app banate hain aur usko Docker ke Magic Box mein pack karte hain. Yeh app itni simple hai ki woh bas browser par "Hello World!" likh kar dikhayegi. Yeh hamara "First Meal" hoga! 😊

Is process ko hum "Building an Image" aur "Running a Container" kehte hain.

Picture time! Dekho, hamare my_first_docker_app folder mein kaun-kaun si files hongi. Yeh hamare project ka ghar hai.

LAB01 Project StructureImage: Hamare 'my_first_docker_app' folder ka structure. Ismein Dockerfile, index.py, aur requirements.txt files hain.

Step 1: Ek Naya Ghar (Folder) Banao

Sabse pehle, hum apni app ke liye ek naya, saaf-suthra "ghar" (folder) banayenge apne computer par. Is folder mein hamari app se related saari files rahengi.

  1. Desktop par jaao: Apne computer ke Desktop par jaao.
  2. Right-click karo: Mouse se empty jagah par right-click karo.
  3. "New" option par jao: Ek menu khulega, usmein "New" option par mouse le jaao.
  4. "Folder" par click karo: Ek aur menu khulega, usmein "Folder" par click karo.
  5. Naam do: Naye folder ka naam my_first_docker_app rakho. Enter press karo.

Ab aapke Desktop par my_first_docker_app naam ka ek naya folder ban gaya hai. Isi folder mein hum apni teen zaroori files banayenge:

  • index.py (Hamari app ka asli code)
  • requirements.txt (App ko chalane ke liye zaroori samaan ki list)
  • Dockerfile (App ke Magic Box ko banane ki recipe book)

Step 2: Hamari App Ka Code Likho (index.py)

Ab hum apni app ka code likhenge. Yeh Python language mein hoga. Ismein hum Flask naam ki ek library use karenge jo web pages banane mein help karti hai.

  1. Text Editor kholo: Apne computer par Notepad (Windows) ya TextEdit (macOS) ya koi aur text editor (jaise VS Code) kholo.

  2. Code Type/Paste karo: Niche diya gaya code us text editor mein type karo ya copy-paste karo.

    python
    # index.py (Yeh hamari web app ka code hai)
    
    # Flask library se 'Flask' ko import kar rahe hain.
    # Flask ek special tool hai jo Python mein web apps banane mein help karta hai.
    from flask import Flask
    
    # Ek naya Flask web application banaya.
    # Isko 'app' naam diya hai.
    app = Flask(__name__)
    
    # Yeh @app.route("/") ek special rule hai.
    # Iska matlab hai ki jab koi hamari app ke homepage (yaani internet address ke aage sirf '/') par aayega,
    # toh usko kya dikhana hai.
    @app.route("/")
    # 'hello()' naam ka ek function banaya hai. Yeh function tab chalega jab koi homepage par aayega.
    def hello():
        # Yeh function browser ko "Hello World!" message wapas bhejega.
        # Jo browser mein dikhega.
        return "Hello World!"
    
    # Yeh if-statement check karta hai ki kya yeh file direct chalayi ja rahi hai.
    # Agar haan, toh app ko shuru karo.
    if __name__ == "__main__":
        # app.run() se hamari web app shuru ho jayegi.
        # host="0.0.0.0" ka matlab hai ki yeh app kisi bhi computer se access ki ja sakti hai (internet par bhi).
        # port=int("5000") ka matlab hai ki yeh app port number 5000 par sunegi.
        # debug=True se agar koi error aayega toh woh humein dikhega (developers ke liye accha hai).
        app.run(host="0.0.0.0", port=int("5000"), debug=True)
  3. File Save karo:

    • File menu par click karo.
    • Save As... par click karo.
    • Folder select karo: Ab jo my_first_docker_app folder aapne Desktop par banaya tha, usko select karo.
    • File Name type karo: File ka naam index.py type karo (exact yahi, .py extension zaroori hai).
    • Save as type (agar option hai): Agar Notepad use kar rahe ho, toh "Save as type" dropdown se "All Files (*.*)" select karna mat bhoolna, taki .txt extension na lage.
    • Save button par click karo.

Step 3: Zaroori Samaal Ki List Banao (requirements.txt)

Hamari index.py app ko chalane ke liye Flask naam ki library chahiye. Docker ko batane ke liye ki yeh library install karni hai, hum requirements.txt naam ki ek simple text file banayenge.

  1. Naya text file kholo: Wapas apne text editor mein jao aur ek naya, khali file kholo (File -> New).

  2. Code Type/Paste karo: Niche diya gaya code us text editor mein type karo ya copy-paste karo.

    # requirements.txt (Yeh hamari app ke zaroori samaan ki list hai)
    
    # Hamari app ko 'Flask' library chahiye, aur uska version '2.3.2' hona chahiye.
    # Docker is list ko padhega aur Flask ko install karega.
    Flask==2.3.2
  3. File Save karo:

    • File menu par click karo.
    • Save As... par click karo.
    • Folder select karo: my_first_docker_app folder ko select karo.
    • File Name type karo: File ka naam requirements.txt type karo (exact yahi, .txt extension zaroori hai).
    • Save as type (agar option hai): Agar Notepad use kar rahe ho, toh "Save as type" dropdown se "All Files (*.*)" select karna mat bhoolna.
    • Save button par click karo.

Step 4: App Ki Recipe Book Banao (Dockerfile)

Ab sabse important file – hamari Dockerfile! Yeh woh blueprint hai jo Docker ko batayegi ki hamari app ka Magic Box (Docker Image) kaise banega. Ismein hum steps likhenge ki kaun sa base istemal karna hai, files kahan copy karni hain, aur kya-kya install karna hai.

  1. Naya text file kholo: Wapas apne text editor mein jao aur ek naya, khali file kholo.

  2. Code Type/Paste karo: Niche diya gaya code us text editor mein type karo ya copy-paste karo.

    dockerfile
    # Dockerfile (Yeh hamare Magic Box ko banane ki Recipe Book hai)
    
    # STEP 1: Pehle, humein kaun si base recipe chahiye?
    # Hum 'python:3.13.1-alpine3.21' naam ki base image (recipe) use kar rahe hain.
    # Iska matlab hai ki hamara Magic Box Python ke latest version aur ek bahut hi chote Linux OS (Alpine) ke saath shuru hoga.
    FROM python:3.13.1-alpine3.21
    
    # STEP 2: Container ke andar kaam kahan karna hai?
    # 'WORKDIR /app' ka matlab hai ki ab se saara kaam container ke andar '/app' naam ke folder mein hoga.
    # Jaise aap apne study desk par kaam karte ho.
    WORKDIR /app
    
    # STEP 3: Apne files ko Magic Box mein copy karo.
    # 'COPY . /app' ka matlab hai ki jahan Dockerfile hai us folder ('.' ka matlab current folder) mein jitne bhi files hain,
    # unko container ke andar ke '/app' folder mein copy kar do.
    # Yaani, 'index.py' aur 'requirements.txt' ab Magic Box ke andar aa gaye.
    COPY . /app
    
    # STEP 4: Zaroori samaan (Flask) install karo.
    # 'RUN pip install -r requirements.txt' ek command hai jo Magic Box ke andar chalega.
    # 'pip' ek tool hai jo Python libraries install karta hai.
    # '-r requirements.txt' matlab 'requirements.txt' file mein jo libraries likhi hain, unko install karo.
    # Isse hamari Flask library install ho jayegi.
    RUN pip install -r requirements.txt
    
    # STEP 5: Magic Box ka darwaza kholo.
    # 'EXPOSE 5000' ka matlab hai ki hamari app 5000 number ke darwaze (port) par sunegi aur communication expect kar rahi hai.
    # Yeh bas ek information hai, asli mein yeh darwaza kholne ke liye 'docker run' command mein '-p' option use karna padega.
    EXPOSE 5000
    
    # STEP 6: Jab Magic Box chalega, toh kaun sa command run karna hai?
    # 'CMD ["python", "index.py"]' ka matlab hai ki jab yeh Magic Box (container) chalega,
    # toh 'python index.py' command automatic chalega.
    # Is command se hamari web app shuru ho jayegi aur "Hello World!" dikhana shuru karegi.
    CMD ["python", "index.py"]
  3. File Save karo:

    • File menu par click karo.
    • Save As... par click karo.
    • Folder select karo: my_first_docker_app folder ko select karo.
    • File Name type karo: File ka naam Dockerfile type karo (exact yahi, koi extension nahi lagana hai, jaise .txt ya .doc).
    • Save as type (agar option hai): Agar Notepad use kar rahe ho, toh "Save as type" dropdown se "All Files (*.*)" select karna mat bhoolna.
    • Save button par click karo.

Ab, aapke my_first_docker_app folder mein yeh 3 files honi chahiye, aur unke naam exact wahi hone chahiye jo bataye gaye hain:

my_first_docker_app/
  Dockerfile
  index.py
  requirements.txt

Ek baar check kar lo, sab theek hai na? Great! Ab hum Magic Box banana shuru karte hain!

Step 5: App Ka Jaadui Box Banana: docker build Command

Ab time hai Dockerfile (recipe) ka use karke apni Docker Image (recipe book) banane ka! Is process ko "building" kehte hain.

  1. Terminal kholo: Apne computer par Terminal (Windows mein Command Prompt/PowerShell, macOS/Linux mein Terminal) kholo.

  2. Apne folder mein jaao: Terminal mein cd command ka use karke my_first_docker_app folder mein jaao.

    • Agar aapka folder Desktop par hai, toh aap aisa type kar sakte ho:
      • Windows: cd C:\Users\YourUsername\Desktop\my_first_docker_app (Replace YourUsername with your actual username)
      • macOS/Linux: cd ~/Desktop/my_first_docker_app
    • Enter press karo. Ab aapka terminal us folder ke andar hoga.
  3. Image banane ka command run karo: Ab yeh command type karo aur Enter press karo:

    bash
    # Yeh command Docker ko bolta hai ki ek naya image (recipe) banao.
    
    # --tag (ya -t) hamari image ko ek naam deta hai jisse hum use baad mein pehchan sakein.
    # Humne apni image ka naam 'my-python-app' rakha hai.
    # '.' (dot) ka matlab hai ki Dockerfile isi current folder mein hai jahan hum abhi hain.
    docker build --tag my-python-app .

    Kya likha hai aur kyun:

    • docker build: Yeh Docker ko bolta hai ki "ek image banao".
    • --tag my-python-app: Iska matlab hai ki jo image banegi, uska naam my-python-app hoga. tag dene se image ko dhundhna aur use karna easy ho jaata hai.
    • .: Yeh jo akela . (dot) hai, yeh bahut important hai! Yeh Docker ko batata hai ki "Dockerfile" aur baaki zaroori files (jaise index.py, requirements.txt) current folder mein hain, yaani jahan aapne docker build command chalaya hai.

    Yeh command chalne mein thoda time le sakta hai. Docker internet se python:3.13.1-alpine3.21 image download karega (agar pehle se nahi hai) aur phir Dockerfile ke saare steps (COPY, RUN) ek-ek karke follow karega. Jab sab ho jayega, toh aapko "Successfully built" ka message dikhega. 🎉

    # Aapko terminal mein kuch aisa output dikhega (yeh bas ek example hai):
    [+] Building 8.6s (7/7) FINISHED
     => [internal] load build definition from Dockerfile                        0.0s
     => => transferring dockerfile: 32B                                         0.0s
     => [internal] load .dockerignore                                           0.0s
     => => transferring context: 2B                                             0.0s
     => [internal] load metadata for docker.io/library/python:3.13.1-alpine3.21 0.0s
     => [1/4] FROM docker.io/library/python:3.13.1-alpine3.21                    0.0s
     => [internal] load build context                                           0.0s
     => => transferring context: 142B                                           0.0s
     => CACHED [2/4] WORKDIR /app                                               0.0s
     => CACHED [3/4] COPY . /app                                                0.0s
     => [4/4] RUN pip install -r requirements.txt                              7.0s
     => exporting to image                                                      0.9s
     => => exporting layers                                                     0.9s
     => => writing image sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  0.0s
     => => naming to docker.io/library/my-python-app

    Agar aapko Successfully built dikh gaya, toh samajh lo aapki image ban chuki hai! Ab hum is image se Magic Box chala sakte hain!

Step 6: App Ko Chalana: docker run Command

Image (recipe) ban gayi! Ab hum us image se ek Container (bana hua khana) banayenge aur usko chalayenge. Is process ko "running a container" kehte hain.

  1. Terminal mein command run karo: Ussi Terminal mein jahan aap Step 5 mein the, yeh command type karo aur Enter press karo:

    bash
    # Yeh command Docker ko bolta hai ki ek container chalao.
    
    # --name hamare chalte hue container ko ek naam deta hai, jisse use baad mein pehchan na easy ho.
    # Humne container ka naam 'my-web-app' rakha hai.
    # -p (ya --publish) host PC ke port ko container ke port se connect karta hai.
    # Yahan '5000:5000' ka matlab hai ki aapke computer ka port 5000, container ke andar ke port 5000 se connect hoga.
    # Imagine aapke ghar ka darwaza (Host PC Port 5000) Magic Box (Container) ke darwaze (Container Port 5000) se jud gaya hai.
    # 'my-python-app' us image ka naam hai jisse hum container banana chahte hain.
    docker run --name my-web-app -p 5000:5000 my-python-app

    Kya likha hai aur kyun:

    • docker run: Yeh command Docker Daemon ko bolta hai ki "ek naya container banao aur usko chalao".
    • --name my-web-app: Iska matlab hai ki jo container chalega, uska naam my-web-app hoga. Naam dene se container ko identify karna aur usse interact karna easy ho jaata hai.
    • -p 5000:5000: Yeh Port Mapping ya Port Publishing kehlata hai. Iska matlab hai ki aapke computer (Host PC) ka port 5000 container ke andar ke port 5000 se connect ho jayega. Hamari Python app container ke andar port 5000 par chal rahi hai, toh is mapping se hum apne computer ke browser se us app ko access kar paenge.
    • my-python-app: Yeh us Docker Image (recipe) ka naam hai jisse hum container (bana hua khana) banana chahte hain.

    Yeh command chalate hi aapki app container ke andar chal jaayegi. Aapko terminal mein kuch output dikhega, jaise Running on http://0.0.0.0:5000/.

    # Aapko terminal mein kuch aisa output dikhega (yeh bas ek example hai):
     * Serving Flask app 'index'
     * Debug mode: on
    WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
     * Running on http://0.0.0.0:5000
    Press CTRL+C to quit
     * Restarting with stat
     * Debugger is active!
     * Debugger PIN: 123-456-789

    Agar aapko Running on http://0.0.0.0:5000 dikh raha hai, toh app chal rahi hai!

Step 7: Result Dekho!

Ab sabse mazedaar part! Apne web browser (jaise Google Chrome, Mozilla Firefox, Microsoft Edge) ko open karo aur address bar mein yeh type karo:

http://127.0.0.1:5000

Ya fir simple http://localhost:5000 bhi type kar sakte ho. 127.0.0.1 ya localhost ka matlab hota hai "mera apna computer".

Agar sab kuch sahi raha, toh aapko browser par ek white screen par bade-bade letters mein "Hello World!" likha hua dikhega. 🎉🎉🎉

Picture time! Dekho, browser mein Hello World! ka output kaisa dikhta hai.

LAB01 Hello World ResultImage: Browser mein hamari pehli Docker app ka output – "Hello World!".

Congratulations! Aapne apna pehla Docker Image banaya aur usse apna pehla Docker Container successfully chalaya! Aapne ek app ko Magic Box mein pack karke use internet par dikha diya. Ab aap ekdum pro ho gaye ho! 💪

Important Note: Aapka terminal abhi app chalane mein busy hai. Agar aapko terminal ko free karna hai, toh CTRL+C dabakar app ko band kar sakte ho. Lekin abhi band mat karna, next chapter mein hum isi app ko modify karenge!


Chapter 3: Data Save Karna: Docker Volumes aur Bind Mounts (LAB-02 - Full Details) 💾

Yaad hai Magic Box ki painting wali kahani? Ki agar aap Magic Box (Container) ko band karte ho ya fek dete ho, toh uske andar banayi hui painting (data) gayab ho jaati hai?

Kyun Zaroori Hai Data Save Karna? (Aur Samjho)

Docker Containers by default "temporary" hote hain. Iska matlab hai ki jab aap ek container ko delete karte ho (docker container rm), toh uske andar ka saara data, jo usmein chalte waqt bana tha (jaise log files, users ka data, website ki photos), woh bhi delete ho jaata hai. Yeh theek nahi hai, kyunki humein apna data hamesha chahiye hota hai, bhale hi Magic Box ko naya banana pade.

Is problem ko solve karne ke liye Docker ne do superheroes banaye hain jo data ko permanent save karte hain: Volumes aur Bind Mounts. 💪 Yeh data ko container ke "bahar" rakhne mein help karte hain.

Picture time! Dekho, Docker Volume kaise container ke bahar data ko store karta hai.

Docker Volumes ConceptImage: Docker Volumes concept. Container ke andar ka data volume mein store hota hai, jo container delete hone par bhi safe rehta hai.

Docker Volume: Permanent Locker (Aur Clear Analogy)

Analogy: Imagine karo, aapke school mein ek Permanent Locker hai. 🔒 Aap apne books, toys, aur zaroori saamaan us locker mein rakh dete ho. Ab, aap chahe kitne bhi school bags (Containers) badlo, ya koi school bag gum bhi ho jaye, aapka saamaan us locker mein hamesha safe rahega. Jab aapko naya school bag milta hai, toh aap use ussi locker se jod dete ho, aur saara saamaan wapas mil jaata hai.

  • Managed by Docker: Docker khud Volumes ko manage karta hai. Aapko pata bhi nahi hoga ki woh files aapke computer par kahan store ho rahi hain, bas Docker unko sambhalta hai. Yeh thoda chhupa hua hota hai.
  • Best for permanent data: Database ka data, websites ki files jo hamesha chahiye, ya koi bhi data jise container delete hone par bhi delete nahi karna, uske liye Volumes sabse best hain.

Bind Mount: Shared Desk Ka Kamaal (Aur Clear Analogy)

Analogy: Imagine karo, aapke aur aapke dost ke beech ek Shared Desk hai. 🤝 Desk par ek folder rakha hai jismein aapki favourite drawings hain. Ab, aap desk par baith kar drawing mein kuch change karte ho, toh woh turant aapke dost ko bhi dikhega. Aur agar aapka dost desk par kuch change karta hai, toh woh turant aapko bhi dikhega. Yeh ek live synchronization hai!

  • You control the location: Aap decide karte ho ki woh "Shared Desk" (folder) aapke computer par kahan hoga. Iska path aapko pata hota hai.
  • Good for development (coding): Jab aap coding kar rahe ho, aur code mein changes karke turant result dekhna ho, toh Bind Mount bahut useful hai. Aap apne computer par code change karte ho, aur container mein app turant update ho jaati hai, bina container ko restart kiye!

Picture time! Dekho, Bind Mount kaise host PC ke folder ko container ke folder se link karta hai.

Docker Bind Mount ConceptImage: Bind Mount concept. Host file system ka data container ke andar ek specific path par available hota hai aur synced rehta hai.

Nginx App Ka Udaharan: Ek Webpage Dikhane Wala

Pichle chapter mein humne apni Python app banayi thi. Ab hum Nginx naam ki ek doosri simple web server app ka use karenge. Nginx ek software hai jo web pages ko internet par "show" karta hai. Hum is app ke andar ek index.html file banayenge aur usko Volume ya Bind Mount se jodenge.

LAB-02 Steps: Volume Ke Saath Khelna (Ek-Ek Step)

Chalo, ab Magic Box (Container) mein data ko save karne ke liye Volume ka use karte hain.

  1. Terminal mein my-web-app ko band karo:

    • Pichle chapter mein jo my-web-app container chal raha tha, usse band karna hoga. Terminal mein CTRL+C press karo. App band ho jayegi.
    • Agar aapko my-web-app container ko delete bhi karna hai, toh yeh command chala sakte ho:
      bash
      # 'my-web-app' container ko forcefully remove (delete) kar do.
      # -f ka matlab hai 'force', matlab agar container chal bhi raha ho, toh bhi use band karke delete kar do.
      docker container rm -f my-web-app
  2. Ek Naya Folder Banao: Apne Desktop par ek naya folder banao, naam rakho Webpage_Data.

  3. index.html File Banao: Webpage_Data folder ke andar ek index.html file banao aur usmein yeh code paste karo. Yeh hamari webpage ka content hoga.

    • Text Editor kholo.
    • Code paste karo:
      html
      <!DOCTYPE html>
      <html>
      <head>
      <title>Welcome to My Web Site</title>
      </head>
      <body>
      <center>
      <h1>Welcome to My Web Site</h1>
      </center>
      </body>
      </html>
    • File Save karo: Webpage_Data folder mein, naam index.html (no .txt extension, Save as type: All Files)
  4. Docker Volume Create Karo: Ab hum apna "Permanent Locker" banayenge.

    • Terminal kholo (agar band hai toh naya kholo).
    • Yeh command run karo:
      bash
      # Docker ko bolo ki ek naya Volume banao.
      # Is Volume ka naam 'my-nginx-volume' rakho.
      docker volume create my-nginx-volume
      Kya likha hai aur kyun:
      • docker volume create: Yeh Docker Daemon ko bolta hai ki "ek naya volume banao".
      • my-nginx-volume: Yeh us volume ka naam hai. Humne isse my-nginx-volume naam diya hai taki humein yaad rahe ki yeh Nginx app ke liye hai.

    Output mein my-nginx-volume dikhega.

  5. Nginx Container Chalao aur Volume Attach Karo: Ab hum Nginx app ka Magic Box chalayenge aur usko apne my-nginx-volume se jod denge.

    • Yeh command run karo:
      bash
      # Ek Nginx container chalao.
      # --name: container ka naam 'mywebserver' rakho.
      # -d: 'detached mode' mein chalao, matlab background mein chalta rahega aur terminal free ho jayega.
      # -p 80:80: Host PC ke port 80 ko container ke port 80 se connect karo. Nginx web server default roop se port 80 par chalta hai.
      # -v my-nginx-volume:/usr/share/nginx/html: Yeh sabse important part hai!
      #   'my-nginx-volume' (hamara Permanent Locker) ko container ke andar ke '/usr/share/nginx/html' folder se jod do.
      #   Nginx apni web files isi folder se serve karta hai.
      #   Matlab, ab Nginx jo bhi files '/usr/share/nginx/html' mein dekhega, woh 'my-nginx-volume' mein bhi hongi,
      #   aur wahan safe rahengi.
      # nginx: Yeh us image ka naam hai jisse container banega.
      docker container run --name mywebserver -d -p 80:80 -v my-nginx-volume:/usr/share/nginx/html nginx
      Kya likha hai aur kyun:
      • docker container run: Container chalao.
      • --name mywebserver: Container ka naam mywebserver rakha hai.
      • -d: Detached mode, background mein chalega.
      • -p 80:80: Port mapping (Host:Container). Ab aap http://localhost se app access kar paoge.
      • -v my-nginx-volume:/usr/share/nginx/html: Volume binding. my-nginx-volume ko container ke /usr/share/nginx/html path se bind kiya hai. Isse container mein jo bhi data is path par hoga, woh volume mein save hoga.
      • nginx: Yeh Nginx web server ki official image hai.

    Output mein container ID dikhega.

  6. Container Ke Andar Jao aur Files Change Karo: Ab hum mywebserver container ke andar jaate hain aur uski index.html file mein changes karte hain.

    • Yeh command chalao:

      bash
      # 'mywebserver' container ke andar shell (command line) kholo.
      # 'exec' ka matlab hai "execute" (chalao) ek command.
      # '-it' ka matlab hai "interactive" (aap command de sako) aur "tty" (output theek se dikhe).
      # 'mywebserver' woh container ka naam hai jismein jana hai.
      # 'sh' (shell) ek basic command line program hai jo container ke andar khulega.
      docker container exec -it mywebserver sh

      Ab aapka terminal mywebserver container ke andar hoga. Aapko prompt # ya $ jaisa dikhega.

    • Folder mein jao:

      bash
      # '/usr/share/nginx/html' folder mein jaao, jahan Nginx ki web files hoti hain.
      cd /usr/share/nginx/html
    • Files dekho:

      bash
      # Folder ke andar ki files list karo.
      # Aapko 'index.html' aur kuch aur files dikhengi.
      ls
    • Nano Install Karo (agar nahi hai): Nginx image mein nano (text editor) ya vim (text editor) pehle se nahi hote. Install kar lete hain.

      bash
      # Pehle packages ki list update karo.
      apt-get update
      
      # Phir 'vim' aur 'nano' text editors install karo.
      # '-y' ka matlab hai 'yes' to all questions, taki installation automatic ho jaye.
      apt-get install vim nano -y

      Yeh thoda time lega install hone mein.

    • index.html Mein Changes Karo:

      bash
      # 'nano' editor mein 'index.html' file kholo.
      nano index.html

      File khulegi. <h1>Welcome to My Web Site</h1> wali line dhundo. Use badal kar <h1>Welcome to My Web Site, This is written using First Container</h1> kar do.

      • Save karne ke liye: CTRL+O (Ctrl aur O dabao), Enter dabao.
      • Editor se bahar aane ke liye: CTRL+X (Ctrl aur X dabao).
  7. Browser Mein Dekho: Ab apne web browser mein http://127.0.0.1 (ya http://localhost) open karo.

    • Aapko Nginx ki default page ki jagah ab woh text dikhega jo aapne change kiya tha: Welcome to My Web Site, This is written using First Container! Kyunki humne container ke andar index.html change kiya tha, aur woh my-nginx-volume mein sync ho gaya.
  8. Container Se Bahar Aao: Terminal mein CTRL+P phir Q (Ctrl aur P ek saath daba kar chhod do, phir Q daba do) daba kar container se bahar aa jao. Aapka terminal ab host PC par wapas aa jayega. (exit type karke bhi bahar aa sakte ho, lekin isse container stop ho jayega, CTRL+P+Q se container chalta rehta hai background mein).

  9. Pehla Container Hatao: Ab hum mywebserver container ko delete kar denge. Lekin data my-nginx-volume mein safe rahega.

    • Yeh command chalao:
      bash
      # 'mywebserver' container ko forcefully remove (delete) kar do.
      docker container rm -f mywebserver
      
      # Check karo ki container delete ho gaya hai ya nahi.
      # '-a' se saare containers dikhte hain, chahe woh chal rahe ho ya band ho.
      docker container ls -a
      Aapko mywebserver container list mein nahi dikhega.
  10. Naya Container Bina Volume Ke (Dekhne ke liye): Ab hum ek naya Nginx container chalaenge, lekin iss baar my-nginx-volume ko attach nahi karenge.

    • Yeh command chalao:
      bash
      # Ek naya Nginx container chalao, naam 'mywebserver2' rakho.
      # Ismein volume attach nahi kiya hai.
      docker container run --name mywebserver2 -d -p 80:80 nginx
    • Browser mein http://127.0.0.1 open karo. Aapko Nginx ki default welcome page dikhegi! Kyun? Kyunki is container ka volume se koi connection nahi hai, aur iske paas original Nginx image ki index.html file hai.
  11. Dusra Container Hatao:

    • bash
      # 'mywebserver2' container ko delete kar do.
      docker container rm -f mywebserver2
      docker container ls -a # Check karo
  12. Teesra Container Volume Ke Saath (Data Check): Ab ek aur Nginx container chalaenge aur iss baar phir se my-nginx-volume attach karenge. Dekho, data wapas aayega!

    • Yeh command chalao:
      bash
      # Ek naya Nginx container chalao, naam 'mywebserver3' rakho.
      # Aur phir se 'my-nginx-volume' ko attach karo.
      docker container run --name mywebserver3 -d -p 80:80 -v my-nginx-volume:/usr/share/nginx/html nginx
    • Browser mein http://127.0.0.1 open karo. Aapko phir se Welcome to My Web Site, This is written using First Container dikhega! Yeh isliye hua kyunki my-nginx-volume mein woh data ab bhi saved hai, aur naye container ne usko wapas le liya. 🎉

LAB-02.1 Steps: Bind Mount Ke Saath Masti (Ek-Ek Step)

Bind Mount ka use karna aur bhi simple hai, khaas kar jab aap development (coding) kar rahe ho. Isse aap apne computer par file change karte hi container mein turant change dekh sakte ho.

  1. Sabse Pehle Purane Containers Hatao: Agar mywebserver3 chal raha hai, toh use band kar do:

    bash
    docker container rm -f mywebserver3
  2. Docker Desktop File Sharing Setup (Windows/Mac users ke liye zaroori):

    • Agar aap Windows ya Mac par ho, toh Docker Desktop ko batana padega ki aapke computer ka kaun sa drive ya folder Docker ke saath share karna hai. Ye ek security feature hai.
    • Docker Desktop icon par Right-click karo (Windows mein system tray mein ya Mac mein menubar mein).
    • "Settings" / "Preferences" par click karo.
    • Left side mein "Resources" par click karo, aur phir "File Sharing" par click karo.
    • Yahan aapko apne computer ke drives (jaise C: drive) ya specific folders ko add karna hoga. Jis drive mein aapka Webpage_Data folder hai (jaise C: drive), usko tick kar do.
    • "Apply & Restart" par click karo. Docker Desktop restart hoga.

    (Agar aap Linux par ho, toh yeh step karne ki zaroorat nahi hai.)

  3. Host PC Par Webpage_Data Folder check karo: Desktop par jo Webpage_Data folder aapne banaya tha, uske andar index.html file honi chahiye. Agar usmein pehle wale changes (Welcome to My Web Site, This is written using First Container) hain, toh bahut achha.

  4. Container Chalao aur Bind Mount Karo: Ab hum Nginx container chalayenge aur usko apne computer ke Webpage_Data folder se seedhe jod denge.

    • Yeh command run karo:
      bash
      # Ek Nginx container chalao, naam 'mywebserver_bind' rakho.
      # -d: Background mein chalao.
      # -p 80:80: Host PC ke port 80 ko container ke port 80 se connect karo.
      # -v C:\Users\YourUsername\Desktop\Webpage_Data:/usr/share/nginx/html: Yeh Bind Mount hai!
      #   'C:\Users\YourUsername\Desktop\Webpage_Data' (Replace 'YourUsername' with your actual username)
      #   yeh aapke computer (Host PC) ke 'Webpage_Data' folder ka pura path hai.
      #   '/usr/share/nginx/html' container ke andar ka folder hai jahan Nginx files serve karta hai.
      #   Yeh dono folders ab ek doosre se live synced hain.
      #   (Agar Linux/macOS use kar rahe ho, toh path hoga: -v /home/YourUsername/Desktop/Webpage_Data:/usr/share/nginx/html ya ~/Desktop/Webpage_Data:/usr/share/nginx/html)
      # nginx: Yeh image ka naam hai.
      docker container run --name mywebserver_bind -d -p 80:80 -v C:\Users\YourUsername\Desktop\Webpage_Data:/usr/share/nginx/html nginx
      Kya likha hai aur kyun:
      • -v C:\Users\YourUsername\Desktop\Webpage_Data:/usr/share/nginx/html: Yeh Bind Mount syntax hai. Pehla path (C:\Users\YourUsername\Desktop\Webpage_Data) aapke computer par folder ka location hai. Doosra path (/usr/share/nginx/html) container ke andar folder ka location hai. Isse yeh dono locations ek doosre se "mirrored" ho jaate hain.

    Output mein container ID dikhega.

  5. Browser Mein Dekho: http://127.0.0.1 (ya http://localhost) open karo. Aapko apni index.html ka content dikhega. Agar aapne pichle step mein text change kiya tha, toh wahi dikhega.

  6. Magic Dekho: Live Sync!

    • Ab apne computer par (Magic Box ke andar nahi!), Webpage_Data folder mein jao.
    • index.html file ko Notepad ya kisi text editor mein open karo.
    • Usmein kuch change karo, jaise <h1>Welcome to My Web Site, This is written using First Container</h1> ko badal kar <h1>Hello Docker Friends, This is updated Live!</h1> kar do.
    • File ko Save karo (Ctrl+S).
    • Browser ko refresh karte hi, aapko turant woh change dikhega! Bina container ko restart kiye! 🥳

    Picture time! Dekho, Bind Mount se live changes kaise dikhte hain.

    LAB02.1 Bind Mount Live SyncImage: Host PC par 'index.html' file mein changes karne se, browser mein turant update dikhta hai kyunki Bind Mount active hai.

    Yehi hai Bind Mount ka sabse bada fayda! Jab aap coding kar rahe ho, toh aapko har chote change ke liye container ko restart nahi karna padta. Bahut time bachata hai!

Toh ab aapne seekh liya ki data ko Docker mein kaise save karte hain, aur live changes kaise dekhte hain! Amazing!

Cleanup: Jab kaam ho jaye, toh yeh container band kar do:

bash
docker container rm -f mywebserver_bind

Chapter 4: Ek Saath Kai Apps Chalana: Docker Compose (LAB-03 - Full Details) 🤝

Yaad hai, pichle chapter mein humne ek Magic Box mein ek app chalayi thi. Lekin kya ho agar aapki app ko chalane ke liye aur bhi Magic Boxes ki zaroorat pade? 🤔

Jab Ek App Kaafi Na Ho! (Aur Deep)

Aaj kal ki apps akele kaam nahi karti. Unhein aksar doosri apps ki zaroorat hoti hai. Socho, agar aapko ek online game banani hai, toh:

  • Aapko game ka main code chahiye.
  • Game ke players ka score, unke items, unka level - yeh sab save karne ke liye ek database chahiye.
  • Shayd ek chat system ke liye ek chat server bhi chahiye.

Yeh sab alag-alag apps hain, aur har app ko apne Magic Box (Container) mein chalana padega. Agar hum in sabhi Magic Boxes ko ek-ek karke docker run commands se chalayenge, toh:

  • Bahut saare commands: Har app ke liye alag command, kitna mushkil hoga yaad rakhna! 🤯
  • Mushkil connections: In Magic Boxes ko ek doosre se baat karna bhi sikhana padega. Jaise game ka code database se kaise baat karega?
  • Order matter karta hai: Kabhi-kabhi ek app ko doosri app ke chalne ka intezaar karna padta hai (jaise database pehle chalna chahiye phir game).

Is mushkil ko aasan karne ke liye Docker ne ek super tool banaya hai jiska naam hai Docker Compose. 🦸‍♂️

Docker Compose: Master Party Planner

Analogy: Docker Compose ek Master Party Planner jaisa hai. 🎉 Imagine karo aapko ek bahut badi birthday party organize karni hai. Aap ek paper par saari details likh dete ho:

  • Kaun-kaun se log aayenge (networks)?
  • Khana kahan se aayega (services)?
  • Chairs kahan se aayengi (volumes)?
  • Kaun sa kaam pehle hoga (dependencies)?

Bas ek baar yeh poora plan (docker-compose.yml file) bana lo, aur phir Party Planner (Docker Compose) ko ek command do, aur woh saari cheezein automatic set kar deta hai. Saare Magic Boxes ban jaate hain, ek doosre se jud jaate hain, aur sahi order mein shuru ho jaate hain! Sab set! 🥳

docker-compose.yml: Master Plan File

Docker Compose apna plan ek special file mein likhta hai jiska naam hota hai docker-compose.yml. Yeh file YAML format mein hoti hai, jo ki bahut easy hai padhne aur likhne mein. Ismein hum apni saari services (apps), networks, aur volumes ko ek hi jagah define kar sakte hain.

Hum WordPress website ka udharaan lenge. WordPress ko chalane ke liye do Magic Boxes chahiye:

  1. WordPress App: Jo aapko website dikhayegi (frontend).
  2. MySQL Database: Jahan website ka saara data (posts, comments, users) save hoga (backend).

Yeh dono alag-alag apps hain jo alag-alag Docker Containers mein chalengi, lekin Docker Compose ki madad se hum inhein ek saath control karenge.

LAB-03 Steps: Compose Magic (Detailed)

Chalo, ab apni WordPress website ko Docker Compose ki madad se chalate hain.

  1. Ek Naya Folder Banao: Apne Desktop par ek naya folder banao, naam rakho my_wordpress_project.

  2. docker-compose.yml File Banao: my_wordpress_project folder ke andar docker-compose.yml naam ki file banao (exact yahi naam, koi extension nahi). Ismein hum apna Party Plan likhenge.

    • Text Editor kholo, naya, khali file banao.
    • Niche diya gaya code usmein paste karo:
    yaml
    # docker-compose.yml (Hamara Master Party Plan)
    
    # Yeh Compose file ka version hai. Docker ko batata hai ki is file ko kaise padhna hai.
    version: "3.8"
    
    # 'services' section: Yahan hum apni alag-alag apps (Magic Boxes) define karte hain jo ek saath chalengi.
    services:
      # Pehli app: Hamara MySQL database ka Magic Box. Isko 'mydatabase' naam diya hai.
      mydatabase:
        # Kaun si Docker Image use karni hai? 'mysql' ka version '5.7'.
        # Yeh image Docker Hub se download hogi agar pehle se nahi hai.
        image: mysql:5.7
        # Agar yeh Magic Box (container) ruk jaye ya crash ho jaye, toh Docker ise hamesha phir se shuru karega.
        restart: always
        # 'volumes' section: Is Magic Box ke data ko save karne ke liye.
        # 'mydata:/var/lib/mysql' ka matlab hai ki 'mydata' naam ka Volume (permanent locker)
        # container ke andar ke '/var/lib/mysql' folder se judega.
        # MySQL apna saara data isi folder mein save karta hai.
        volumes: 
          - mydata:/var/lib/mysql
        # 'environment' section: Is Magic Box ke andar kuch settings (variables) set karne ke liye.
        # Yeh MySQL database ko setup karne ke liye zaroori hain.
        # NOTE: Real projects mein passwords aise seedhe nahi likhte, 'Docker Secrets' use karte hain.
        environment: 
          MYSQL_ROOT_PASSWORD: somewordpress # Database ka superuser password
          MYSQL_DATABASE: wordpress         # Jo database banega uska naam
          MYSQL_USER: wordpress             # Database access karne wala username
          MYSQL_PASSWORD: wordpress         # Database access karne wala password
        # 'networks' section: Is Magic Box ko kaun se network se jodna hai.
        # 'mynet' naam ke network se judega, taki yeh doosre Magic Boxes se baat kar sake.
        networks:
          - mynet
    
      # Dusri app: Hamara WordPress website ka Magic Box. Isko 'mywordpress' naam diya hai.
      mywordpress:
        # Kaun si Docker Image use karni hai? 'wordpress' ka latest version.
        image: wordpress:latest
        # 'depends_on' section: Yeh batata hai ki 'mywordpress' Magic Box ko shuru hone se pehle
        # 'mydatabase' Magic Box ka shuru hona zaroori hai. Matlab, WordPress tabhi chalega jab database chal raha ho.
        depends_on: 
          - mydatabase
        # Agar yeh Magic Box (container) ruk jaye ya crash ho jaye, toh Docker ise hamesha phir se shuru karega.
        restart: always
        # 'ports' section: Host PC (aapke computer) ke ports ko container ke ports se connect karna.
        # "80:80" ka matlab hai ki aapke computer ka port 80, container ke port 80 se judega.
        # "443:443" ka matlab hai ki aapke computer ka port 443, container ke port 443 se judega (HTTPS ke liye).
        ports:
          - "80:80"
          - "443:443"
        # 'environment' section: WordPress ko database se connect karne ke liye settings.
        environment: 
          WORDPRESS_DB_HOST: mydatabase:3306 # Database ka address. 'mydatabase' yahan service ka naam hai, Docker ise IP address mein badal dega. ':3306' MySQL ka default port hai.
          WORDPRESS_DB_USER: wordpress     # WordPress ka database username
          WORDPRESS_DB_PASSWORD: wordpress # WordPress ka database password
          WORDPRESS_DB_NAME: wordpress     # WordPress ka database name
        # 'networks' section: Is Magic Box ko 'mynet' network se jodo.
        networks:
          - mynet
          
    # 'volumes' section: Yahan hum apne volumes (permanent lockers) define karte hain.
    volumes:
      # 'mydata' naam ka volume. Bas naam diya hai, Docker ise khud manage karega.
      mydata: {}
      
    # 'networks' section: Yahan hum apne networks define karte hain.
    networks:
      # 'mynet' naam ka network.
      # 'driver: bridge' ka matlab hai ki yeh ek "bridge network" hoga.
      # Bridge network ek virtual network hai jahan ek hi computer par chal rahe Magic Boxes ek doosre se baat kar sakte hain.
      mynet:
        driver: bridge
    • File Save karo: my_wordpress_project folder mein, naam docker-compose.yml (no extension, Save as type: All Files).
  3. Compose Ko Chalao! Ab Party Planner ko apna plan do.

    • Terminal kholo.
    • my_wordpress_project folder mein jaao (jaise cd C:\Users\YourUsername\Desktop\my_wordpress_project).
    • Yeh command run karo:
      bash
      # Docker Compose ko bolo ki 'docker-compose.yml' file mein define kiye gaye saare services (apps) ko shuru karo.
      # '-d' ka matlab hai 'detached mode' mein chalao, yaani background mein chalta rahega aur terminal free ho jayega.
      docker-compose up -d
      Kya likha hai aur kyun:
      • docker-compose up: docker-compose.yml file ko padhega aur usmein define kiye gaye saare services (containers), networks, aur volumes ko banaega aur start karega.
      • -d: Detached mode. Isse containers background mein chalte rahenge, aur aap terminal par doosre commands type kar paoge.

    Yeh command saari images download karega (MySQL aur WordPress, agar pehle se nahi hain) aur phir mydatabase aur mywordpress containers ko start karega.

    Picture time! Dekho, docker-compose up command chalate waqt terminal mein kya dikhta hai.

    Docker Compose Up OutputImage: docker-compose up -d command ka output. Yeh dikhata hai ki services ban rahi hain aur chal rahi hain.

  4. Containers Dekho:

    • Yeh command chalao:
      bash
      # Saare Docker containers ki list dikhao, chahe woh chal rahe ho ya band ho.
      docker container ls -a
    • Aapko my_wordpress_project_mydatabase_1 aur my_wordpress_project_mywordpress_1 (naam thode alag ho sakte hain, folder name ke aage _ lag jaata hai) jaise do containers chalte hue dikhenge. Isse pata chalta hai ki Compose ne successfully dono Magic Boxes bana diye hain.
  5. Result Dekho: Ab apne web browser mein http://127.0.0.1 (ya http://localhost) open karo.

    • Agar sab sahi hai, toh aapko WordPress ki installation page dikhegi! 🎉 Iska matlab hai ki aapki WordPress app aur MySQL database dono successfully chal rahe hain aur ek doosre se connected hain.

    Picture time! Dekho, browser mein WordPress installation page kaisa dikhta hai.

    WordPress Installation PageImage: Browser mein WordPress ka installation page. Iska matlab WordPress aur MySQL dono successfully chal rahe hain aur connected hain.

Containers Ke Andar Jhankna Aur Batcheet Karna

Chalo, dekhte hain ki kya mywordpress container, mydatabase container se baat kar pa raha hai ya nahi. Yeh bahut cool hai!

  1. WordPress Container Mein Jao:

    • Pehle docker container ls se my_wordpress_project_mywordpress_1 ka exact naam ya ID copy kar lo.
    • Ab us container ke andar jaane ke liye yeh command chalao:
      bash
      # 'my_wordpress_project_mywordpress_1' container ke andar shell (command line) kholo.
      # 'docker exec' se hum ek running container ke andar koi command chala sakte hain.
      # '-it' ka matlab hai interactive mode, jahan aap commands type kar sakte ho aur output dekh sakte ho.
      # 'sh' (shell) ek basic command line program hai jo container ke andar open hoga.
      docker exec -it my_wordpress_project_mywordpress_1 sh
      Ab aapka terminal my_wordpress_project_mywordpress_1 container ke andar hoga. Aapko prompt # ya $ jaisa dikhega.
  2. Tools Install Karo (Agar Zaroorat Pade): Kai containers mein ifconfig (IP address dekhne ke liye) aur ping (doosre computers/containers se connect hone ke liye) jaise tools pehle se nahi hote. Install kar lete hain, agar woh kaam na karein:

    • bash
      # Pehle packages ki list update karo.
      apt-get update
      
      # Phir 'net-tools' (jismein ifconfig hota hai) install karo.
      apt-get install net-tools -y
      
      # Phir 'iputils-ping' (jismein ping hota hai) install karo.
      apt-get install iputils-ping -y
      Yeh thoda time lega.
  3. IP Address Dekho:

    • Ab container ke andar yeh command chalao:
      bash
      # Current container ka IP address aur network settings dekho.
      ifconfig
    • Aapko apne current WordPress container ka IP address dikhega (jaise 172.19.0.3 ya kuch aur).
  4. Database Ko Ping Karo (Baat karke dekho): Ab hum mydatabase container ko ping karenge. mynet network mein, mydatabase ka naam hi uska address hai. Docker Compose ne unhein ek doosre ke naam se pehchan na sikhaya hai.

    • Container ke andar yeh command chalao:
      bash
      # 'mydatabase' (jo hamara database server hai) ko ping karo.
      # Ping karne se pata chalta hai ki kya dono containers ek doosre se baat kar pa rahe hain ya nahi.
      ping mydatabase
    • Agar packets return aa rahe hain (bytes from ...), iska matlab mywordpress container mydatabase container se successfully connect ho raha hai! 🎉 Yeh bahut important hai, kyunki iska matlab hai ki apps network mein ek doosre ko dhundh sakti hain aur baat kar sakti hain.

    Picture time! Dekho, container ke andar se database ko ping karna kaisa dikhta hai.

    Ping from WordPress to MySQL ContainerImage: WordPress container se MySQL container ko ping karna. Dikhata hai ki network connectivity sahi hai.

  5. Bahar Aao:

    • CTRL+C daba kar ping stop karo.
    • Phir CTRL+P phir Q (Ctrl aur P ek saath daba kar chhod do, phir Q daba do) daba kar container se bahar aa jao. Aapka terminal ab host PC par wapas aa jayega. (Ya exit type kar sakte ho, lekin isse container stop ho jayega, jo hum abhi nahi chahte.)
  6. Saaf-Sufai (Cleanup): Jab kaam ho jaye, toh saare containers, networks, aur volumes ko hata do jo Docker Compose ne banaye the.

    • Terminal mein yeh command run karo:
      bash
      # 'docker-compose.yml' file mein define kiye gaye saare services ko stop karo aur remove kar do.
      # Isse saare containers, unke networks aur volumes bhi delete ho jayenge.
      docker-compose down
      Kya likha hai aur kyun:
      • docker-compose down: Yeh command docker-compose up ka ulta kaam karta hai. Yeh docker-compose.yml file mein define kiye gaye saare services ko gracefully stop karta hai aur unke associated containers, networks, aur volumes ko remove kar deta hai. Yeh clean-up ke liye best command hai.

    Output mein aapko dikhega ki containers, networks, aur volumes delete ho rahe hain.

    Picture time! Dekho, docker-compose down command ka output.

    Docker Compose Down OutputImage: docker-compose down command ka output. Dikhata hai ki saari services, networks, aur volumes remove ho gaye hain.

Dekha kitna easy hai Docker Compose se multiple apps ko ek saath manage karna! Party plan karne jaisa, bas ek command, aur sab set! 🥳


Chapter 5: Badi Teams aur Bade Projects: Docker Swarm & Stack (LAB-04 - Full Details) 🌐

Yaad hai, pichle chapter mein humne ek hi computer par do Magic Boxes (WordPress aur MySQL) ko Docker Compose se chalaya tha? Lekin kya ho agar aapki app ko itne saare log use karein ki ek computer handle hi na kar paaye? 🤔

Jab Ek Computer Kaafi Na Ho (Aur Kahan Use Hota Hai?)

Imagine karo aapne ek bahut badi online game ya ek popular shopping website banayi hai. Festivals ya sales ke time par, lakhon log ek saath us website par aa sakte hain. Ek single computer (yaani ek Docker Host) uss traffic ko handle nahi kar paayega aur website slow ho jayegi ya crash ho jayegi. 💥

Tab kya karein? Is problem ko solve karne ke liye hum multiple computers ko ek saath kaam karwate hain, jaise ek bahut badi team. Is concept ko Container Orchestration kehte hain.

Docker ke paas apna khud ka ek orchestration tool hai jiska naam hai Docker Swarm.

Kahan Use Hota Hai?

  • High Traffic Websites: Jab bahut saare users ek website par aate hain, toh load ko alag-alag computers par distribute karne ke liye.
  • Reliability: Agar ek computer kharab ho jaye, toh app doosre computer par automatic chalne lage.
  • Scaling: Jab zyada users aayein, toh automatic aur Magic Boxes shuru ho jayein.

Docker Swarm: Sabka Super Team Manager

Analogy: Docker Swarm ek Super Team Manager jaisa hai. 👑 Yeh aapke saare computers (jinhe "nodes" kehte hain) ko ek badi team mein jod deta hai. Ab aapko bas Super Manager ko batana hai ki kya kaam karna hai (jaise "meri game ke 5 Magic Boxes chalne chahiye!"), aur woh khud decide karega ki kaun sa Magic Box kis computer par chalega, aur agar koi computer kharab ho jaye, toh us Magic Box ko doosre computer par chala dega. Super Cool, right? 😎

Picture time! Dekho, Docker Swarm ka architecture kaisa dikhta hai.

Docker Swarm ArchitectureImage: Docker Swarm Architecture. Ek ya zyada Manager Nodes saare Worker Nodes ko control karte hain aur apps ko distribute karte hain.

Docker Swarm mein do tarah ke "team members" hote hain:

  1. Manager Nodes (Team Leaders):

    • Yeh woh computers hain jo asali mein team ko manage karte hain. Jaise class ka monitor ya team ka captain.
    • Yeh decide karte hain ki kaun sa Magic Box (container) kahan chalega.
    • Agar ek Manager Node kharab ho jaye, toh doosra Manager Node uski jagah le leta hai.
    • Minimum 1 Manager Node chahiye, but zyada Manager Nodes hona accha hai safety ke liye.
  2. Worker Nodes (Asli Kaam Karne Wale):

    • Yeh woh computers hain jo asali kaam karte hain, matlab Magic Boxes (containers) ko chalate hain. Jaise class ke students.
    • Yeh Manager Nodes se instructions lete hain aur unhein follow karte hain.

Docker Service: Team Ko Kaam Dena (Aur Types)

Jab aap Docker Swarm ko koi kaam dete ho, toh usko Service kehte hain. Service mein aap batate ho ki aapko kitne Magic Boxes (containers) chahiye (jaise 3 WordPress apps), kaun si image use karni hai, aur kaun se ports.

Analogy: Service ek Project Assignment jaisa hai jo Super Team Manager (Swarm) apni team (nodes) ko deta hai. "Team, aapko 3 WordPress websites chalani hain aur unko hamesha chalta rehna chahiye!" 📋

Service ke Types:

  • Replicated Service: Aap batate ho ki aapko kitne copies (replicas) chahiye (jaise replicas: 3 matlab 3 WordPress containers). Swarm unhein alag-alag nodes par faila deta hai.
  • Global Service: Har Worker Node par app ki ek copy chalegi. Jaise har computer par anti-virus.

Docker Stack: Poora Project Plan (Ek Saath)

Jab aapke project mein ek se zyada services hoti hain (jaise WordPress aur MySQL), toh aap un sabhi services ko ek docker-compose.yml jaisi file mein define kar sakte ho. Is file ko jab aap Swarm par deploy کرتے ہو, toh usko Docker Stack kehte hain.

Analogy: Stack ek Complete Project Plan jaisa hai, jismein saare Project Assignments (Services) likhe hote hain, aur sab ek doosre se judte hain. 📚

PlayWithDocker: Hamara Online Practice Ground

Docker Swarm ko practice karne ke liye aapko kai computers ki zaroorat padegi. Lekin don't worry, hum PlayWithDocker.com naam ki ek free online website use karenge. Yeh aapko kuch temporary computers provide karti hai jahan aap Docker Swarm practice kar sakte ho. Best part, yeh free hai! 🎮

LAB-04 Steps: Swarm Banate Hain (Detailed)

Chalo, ab apni ek badi team banate hain aur us par WordPress website chalate hain.

  1. PlayWithDocker Par Jao:

    • Apne web browser mein https://labs.play-with-docker.com/ open karo.
    • "Login" ya "Start" par click karo.
    • Yeh aapko Docker Hub account se login karne ke liye bolega. Agar aapka Docker Hub account nahi hai, toh Sign Up karke ek free account bana lo.
    • Login karne ke baad, aapko ek blank screen dikhegi.
  2. 5 Instances Banao (Virtual Computers):

    • Left side mein + ADD NEW INSTANCE button dikhega.
    • Is button par 5 baar click karo. Har click par ek naya virtual computer banega.
    • Aapko Node1, Node2, Node3, Node4, Node5 naam se 5 tabs dikhenge. Yehi hamare computers hain.
  3. Swarm Initialize Karo (Manager Node Choose Karo):

    • Node1 tab par click karo. Yeh hamara Manager Node hoga (Captain).

    • Terminal mein Node1 ka IP address dekho. Yeh usually terminal ke upar likha hota hai, jaise 192.168.0.18. Is IP ko copy kar lo.

    • Ab terminal mein yeh command run karo:

      bash
      # Docker Swarm ko shuru karo aur Node1 ko Manager banao.
      # --advertise-addr: Manager Node ko batata hai ki woh network mein kis IP address par doosre nodes se baat karega.
      # '192.168.0.18' ki jagah aapko Node1 ka actual IP address dalna hai jo aapko terminal mein dikh raha hai.
      docker swarm init --advertise-addr 192.168.0.18 # Apne Node1 ke IP se badal do

      Kya likha hai aur kyun:

      • docker swarm init: Yeh command Docker Swarm mode ko initialize karta hai aur current node (jahan aap command chala rahe ho) ko Swarm ka pehla Manager Node banata hai.
      • --advertise-addr: Yeh option Manager Node ke IP address ko specify karta hai, jisse doosre Worker Nodes aur Manager Nodes isse connect kar saken.
    • Yeh command chalate hi aapko terminal mein kuch output dikhega. Usmein ek command hoga jo docker swarm join --token SWMTKN-1... se shuru hoga. Is poore command ko copy kar lo! (PlayWithDocker mein copy karne ke liye CTRL+INSERT use hota hai). Yeh token workers ko join karne ke liye hai.

    Picture time! Dekho, docker swarm init command ka output kaisa dikhta hai.

    Docker Swarm Init OutputImage: docker swarm init command ka output. Yeh aapko Swarm initialization ka status aur worker nodes ko join karne ka command dikhata hai.

  4. Worker Nodes Join Karo (Team Members Add Karo):

    • Ab Node2, Node3, aur Node4 tabs par ek-ek karke click karo.

    • Har instance (Node2, Node3, Node4) ke terminal mein, woh copy kiya hua docker swarm join command paste karo aur Enter dabao. (PlayWithDocker mein paste karne ke liye SHIFT+INSERT use hota hai).

      bash
      # Example command (Aapka token aur IP alag hoga! Wahi paste karna jo aapne copy kiya tha)
      docker swarm join --token SWMTKN-1-1cfvch2ygu5h0ga357dte1i53ukbigei8qd0uyw93gcegogb3z-eebewiqny6obn9vcoxmdb4moq 192.168.0.18:2377

      Kya likha hai aur kyun:

      • docker swarm join: Yeh command ek node ko existing Swarm mein join karta hai.
      • --token SWMTKN-1...: Yeh security token hai jo join karne ke liye zaroori hai. Har Swarm ka apna unique token hota hai.
      • 192.168.0.18:2377: Yeh Manager Node ka IP address aur Swarm management port hai jahan join karna hai.
    • Har Node par This node joined a swarm as a worker jaisa message dikhega.

  5. Dusra Manager Node Add Karo (Backup Captain):

    • Ab wapas Node1 (pehle Manager Node) par jao.

    • Yeh command run karo:

      bash
      # Ek naya token generate karo jisse doosre nodes Manager ban sakein.
      docker swarm join-token manager

      Kya likha hai aur kyun:

      • docker swarm join-token manager: Yeh command ek naya join token generate karta hai jiska use karke doosre nodes bhi Manager बन सकते हैं. Yeh important hai redundancy ke liye (agar ek manager node fail ho jaye).
    • Yeh command chalate hi aapko ek aur docker swarm join --token SWMTKN-1... command dikhega. Isse copy kar lo.

    • Ab Node5 tab par click karo aur wahan yeh copy kiya hua docker swarm join command paste karo aur Enter dabao.

      bash
      # Example command (Aapka token aur IP alag hoga!)
      docker swarm join --token SWMTKN-1-23a47kkzf1hp8j7a51tx0fsc4hj1tprqi3kx04zfm0djf8ozr4-eqcsf6huttmugjf4yu4yoyrxd 192.168.0.13:2377
    • Node5 par This node joined a swarm as a manager message dikhega.

  6. Swarm Status Dekho (Team Kitni Badi Hai):

    • Wapas Node1 (Manager Node) par jao.
    • Ab Swarm ke saare nodes ki list dekho:
      bash
      # Swarm cluster ke saare nodes ki list dikhao.
      docker node ls
      Kya likha hai aur kyun:
      • docker node ls: Yeh command Swarm cluster ke sabhi nodes ko list karta hai, unka status (Ready), role (Manager/Worker), aur hostname dikhata hai.

    Picture time! Dekho, docker node ls command ka output jismein saare nodes dikhte hain.

    Docker Node List OutputImage: docker node ls command ka output. Yeh dikhata hai ki kitne Manager aur Worker nodes Swarm mein hain.

    • Output mein aapko 2 Manager nodes (Node1, Node5) aur 3 Worker nodes (Node2, Node3, Node4) dikhenge. Fantastic! Ab hamari ek badi Docker Swarm team ready hai! 🥳
  7. docker-compose.yml File Banao (for Docker Stack): Ab hum docker-compose.yml file banayenge jo Docker Stack ko deploy karne ke liye use hogi. Yeh file pichle lab jaisi hai, bas kuch extra sections hain jo Swarm ke liye zaroori hain (deploy aur overlay network).

    • Node1 (Manager Node) ke terminal mein paste karne ke liye:
      • cat > docker-compose.yml type karo aur Enter dabao.
      • Niche diya gaya code paste karo (PlayWithDocker mein SHIFT+INSERT).
      • Jab paste ho jaye, Enter aur phir CTRL+D dabao to save the file.
      • Agar aapko file content check karna hai, toh cat docker-compose.yml type kar sakte ho.
    yaml
    # docker-compose.yml (Hamara Docker Stack ka Complete Project Plan)
    
    # Compose file ka version define kiya.
    version: "3.8"
    
    # 'services' section: Yahan hum apni alag-alag apps (Magic Boxes) define karte hain.
    services:
      # Pehli app: Hamara MySQL database ka Magic Box. Isko 'mydatabase' naam diya hai.
      mydatabase:
        # Kaun si image use karni hai? MySQL version 5.7.
        image: mysql:5.7
        # Agar Magic Box ruk jaye, toh hamesha restart karo.
        restart: always
        # Ek volume attach kiya 'mydata' naam ka (permanent locker).
        volumes: 
          - mydata:/var/lib/mysql
        # Environment settings database ke liye.
        environment: 
          MYSQL_ROOT_PASSWORD: somewordpress
          MYSQL_DATABASE: wordpress
          MYSQL_USER: wordpress
          MYSQL_PASSWORD: wordpress
        # Is Magic Box ko 'mynet' network se jodo.
        networks:
          - mynet
    
      # Dusri app: Hamara WordPress website ka Magic Box. Isko 'mywordpress' naam diya hai.
      mywordpress:
        # Kaun si image use karni hai? Latest WordPress image.
        image: wordpress:latest
        # 'deploy' section: Yeh Docker Swarm ke liye special settings hain.
        deploy:
          replicas: 3 # Humein WordPress ke 3 copies chahiye (3 Magic Boxes chalne chahiye).
          update_config: # Jab app ko update karein toh kaise update ho.
            parallelism: 2 # Ek baar mein 2 Magic Boxes update honge.
            delay: 5s # Har update ke baad 5 second ka intezaar.
            order: stop-first # Pehle purane Magic Box ko roko, phir naya chalao.
        # 'depends_on' section: 'mywordpress' ko 'mydatabase' ka shuru hona zaroori hai.
        depends_on: 
          - mydatabase
        # Agar Magic Box ruk jaye, toh hamesha restart karo.
        restart: always
        # Ports expose kiye: Host ke ports container ke ports se judenge.
        ports:
          - "80:80"
          - "443:443"
        # Environment settings WordPress ko database se connect karne ke liye.
        environment: 
          WORDPRESS_DB_HOST: mydatabase:3306 # 'mydatabase' yahan service ka naam hai.
          WORDPRESS_DB_USER: wordpress
          WORDPRESS_DB_PASSWORD: wordpress
          WORDPRESS_DB_NAME: wordpress
        # Is Magic Box ko 'mynet' network se jodo.
        networks:
          - mynet
    
    # 'volumes' section: Apne volumes define karte hain.
    volumes:
      mydata: # 'mydata' naam ka volume.
    
    # 'networks' section: Apne networks define karte hain.
    networks:
      mynet:
        # 'driver: overlay' ka matlab hai ki yeh ek "overlay network" hoga.
        # Overlay network ek special network hai jo alag-alag computers (nodes) par chal rahe
        # Magic Boxes ko ek doosre se baat karne deta hai. Yeh Swarm ke liye zaroori hai.
        driver: overlay
    • File Save karo: my_wordpress_project folder mein, naam docker-compose.yml (no extension, Save as type: All Files).

    Picture time! Dekho, docker-compose.yml file ka content PlayWithDocker ke editor mein kaisa dikhta hai.

    Docker Compose YML File for StackImage: docker-compose.yml file content PlayWithDocker editor mein. Ismein deploy aur overlay network settings hain.

  8. Docker Stack Deploy Karo (Project Shuru Karo):

    • Node1 (Manager Node) par yeh command run karo:

      bash
      # Docker Stack ko deploy karo, 'docker-compose.yml' file ka use karke.
      # 'firststack' hamare project ka naam hai.
      docker stack deploy --compose-file docker-compose.yml firststack

      Kya likha hai aur kyun:

      • docker stack deploy: Yeh command docker-compose.yml file mein define kiye gaye saare services (apps) ko Docker Swarm cluster par deploy karta hai.
      • --compose-file docker-compose.yml: Batata hai ki plan kis file mein likha hai.
      • firststack: Yeh hamare poore project (Stack) ka naam hai.
    • Yeh command chalate hi, Docker Swarm saari images download karega aur phir firststack_mydatabase (1 copy) aur firststack_mywordpress (3 copies) ke containers ko alag-alag nodes par chalana shuru kar dega.

    Picture time! Dekho, docker stack deploy command ka output.

    Docker Stack Deploy OutputImage: docker stack deploy command ka output. Yeh dikhata hai ki services successfully create ho gayi hain.

  9. Stack Services Dekho (Project Ka Overview):

    • Node1 (Manager Node) par yeh command run karo:
      bash
      # 'firststack' project ke saare services ki list dikhao.
      docker stack services firststack
      Kya likha hai aur kyun:
      • docker stack services: Yeh command ek specific Docker Stack (project) ke andar chal rahe services (apps) ki list dikhata hai. Aapko yahan firststack_mydatabase (1/1 replicas) aur firststack_mywordpress (3/3 replicas) dikhenge.

    Picture time! Dekho, docker stack services command ka output.

    Docker Stack Services ListImage: docker stack services command ka output. Yeh Stack mein chal rahi services (apps) aur unki replicas (copies) dikhata hai.

  10. Kahan Chal Rahe Hain Containers? (Kaun Sa Kaam Kaun Kar Raha Hai):

    • Node1 (Manager Node) par yeh command run karo:
      bash
      # 'firststack' project ke andar, kaun se containers (tasks) kis node par chal rahe hain, woh dikhao.
      docker stack ps firststack
      Kya likha hai aur kyun:
      • docker stack ps: Yeh command ek Docker Stack ke andar chal rahe individual containers (jinhein Swarm mein 'tasks' kehte hain) ki detailed list dikhata hai, jismein yeh bhi bataya jata hai ki kaun sa task kis node par chal raha hai.

    Picture time! Dekho, docker stack ps command ka output.

    Docker Stack Processes (Tasks) ListImage: docker stack ps command ka output. Yeh dikhata hai ki kaun sa container (task) kis node par aur kis state mein chal raha hai.

    • Aapko dikhega ki firststack_mywordpress ke 3 containers alag-alag nodes par (jaise Node1, Node2, Node3) chal rahe honge, aur firststack_mydatabase ka 1 container kisi ek node par.
  11. WordPress Dekho:

    • PlayWithDocker ke interface par aapko blue box mein 80 port ka button dikhega (Node1 ke right side mein).
    • Uspar click karo. Ek naya tab khulega.
    • Aapko WordPress installation page dikhegi! 🎉 Matlab, aapki WordPress app aur MySQL database dono successfully chal rahe hain, bhale hi woh alag-alag computers par hon.
  12. Container Ke Andar Jao (Worker Node Par Batcheet Dekho):

    • Kisi ek Worker Node (jaise Node2 ya Node3) tab par click karo.
    • Wahan docker container ls -a type karo. Aapko us node par chal raha WordPress container dikhega. Uska Container ID copy kar lo (chota sa string jaise aeb ya b7f).
    • Ab us container ke andar jao:
      bash
      # Uss WordPress container ke andar shell (command line) kholo jo Node2/Node3 par chal raha hai.
      docker exec -it aeb sh # 'aeb' ki jagah aap apna container ID dalna
    • Container ke andar, apt-get update, apt-get install net-tools, apt-get install iputils-ping -y commands chala kar tools install karo (jaise pichle lab mein kiya tha).
    • ifconfig se IP address dekho.
    • Ab database container ko ping karo:
      bash
      # 'firststack_mydatabase' (jo hamara database service hai) ko ping karo.
      # Dekho, WordPress container database container se baat kar pa raha hai,
      # bhale hi woh alag-alag computers (nodes) par chal रहे hon!
      ping firststack_mydatabase
      Kya likha hai aur kyun: ping firststack_mydatabase se hum WordPress container se database container (service) ko ping kar rahe hain. firststack_mydatabase service ka naam hai, aur overlay network ki wajah se yeh alag-alag nodes par hote hue bhi ek doosre ko naam se dhundh sakte hain.

    Picture time! Dekho, Node5 par docker network inspect firststack_mynet ka output kaisa dikhta hai.

    Docker Network Inspect OverlayImage: docker network inspect firststack_mynet command ka output. Yeh overlay network ki details dikhata hai, jismein connected containers ke IPs bhi hote hain.

    • CTRL+C daba kar ping stop karo. CTRL+P phir Q daba kar container se bahar aa jao.
  13. Magic Dekho: Self-Healing Power! (Yeh bahut cool hai!)

    • Ussi Worker Node (jaise Node2) par, jahan aapka WordPress container chal raha tha, usko forcefully stop kar do:
      bash
      # Pehle dekho kaun sa WordPress container chal raha hai.
      docker container ls -a
      
      # Us container ko forcefully stop karo.
      docker container stop aeb # 'aeb' ki jagah container ID dalna
      
      # Ab phir se dekho, aapko dikhega ki purana container 'Exited' state mein hai.
      docker container ls -a
    • Ab wapas Node1 (Manager Node) par jao.
    • Phir se docker stack ps firststack run karo:
      bash
      # 'firststack' project ke containers ka status check karo.
      docker stack ps firststack
    • Aap dekhenge ki jo container aapne stop kiya tha (uska status Shutdown dikhega), Swarm ne usko automatically kisi doosre node par (Running state mein) phir se chala diya hai! Ya ho sakta hai usi node par ek naya container ban gaya ho.
    • Yeh hai Docker Swarm ki "self-healing" power! Agar koi container ya poora node hi crash hota hai, Swarm automatic usko theek kar deta hai, taki aapki app hamesha chalti rahe. 🤩 Isse apps bahut reliable ho jaati hain.

    Picture time! Dekho, Swarm ki self-healing power ka output.

    Docker Stack Ps Self-HealingImage: docker stack ps command ka output. Dikhata hai ki Swarm ne automatically ek stopped container ko restart (ya replace) kar diya hai.

  14. Saaf-Sufai (Cleanup): Jab kaam ho jaye, toh saare containers, services, networks, aur volumes ko Docker Swarm se hata do.

    • Node1 (Manager Node) par yeh command run karo:

      bash
      # 'firststack' naam ke poore project (Stack) ko Swarm se hata do.
      # Isse saare containers, services, networks, aur volumes bhi delete ho jayenge.
      docker stack rm firststack
      
      # Check karo ki project remove ho gaya hai ya nahi.
      docker stack ps firststack

      Kya likha hai aur kyun:

      • docker stack rm: Yeh command poore Docker Stack (project) ko Swarm cluster se remove karta hai, jismein uske saare services, containers, aur networks shamil hote hain.
    • Aapko dikhega ki koi service nahi chal rahi.

    Picture time! Dekho, docker stack rm command ka output.

    Docker Stack Remove OutputImage: docker stack rm command ka output. Dikhata hai ki poora Stack (project) Swarm se remove ho gaya hai.

Docker Swarm aur Stack samajhna thoda complex ho sakta hai, lekin isse hum badi apps ko aasani se manage kar sakte hain. Jab aap bade projects par kaam karoge, toh yeh tools aapke bahut kaam aayenge! 👍


Chapter 6: Apni App Library Banana: Docker Local Registry (LAB-05 - Full Details) 🏠

Yaad hai, humne Chapter 1 mein Docker Hub ke baare mein baat ki thi – woh ek public library hai jahan se hum images download karte hain aur upload bhi kar sakte hain. Lekin kabhi-kabhi hamein apni apps ko public par upload nahi karna hota (jaise koi secret project ya office ki app). Ya fir, agar internet slow ho, toh har baar Docker Hub se download karne mein time lagta hai. 🐌

Kyun Banaye Apni Khud Ki Library? (Real-World Use)

Is problem ka solution hai Docker Local Registry. Socho, aapke ghar mein apni khud ki ek chhoti library hai, jahan aap apni saari favourite books (app recipes) rakhte ho.

  • Security (Secrets Safe Rahenge): Aapki secret project ki recipes (images) public internet par nahi jayengi. Woh aapke network ke andar safe rahengi. Jaise aap apne secret diary ko ghar mein safe rakhte ho. 🤫
  • Speed (Fast Access): Images download karna bahut fast ho jayega kyunki woh aapke hi network par hain. Internet se download karne ka wait nahi karna padega. 🚀
  • Offline Access (Internet Na Ho Tab Bhi): Agar aapka internet chala jaye, tab bhi aap apni images access kar sakte ho aur containers chala sakte ho.
  • Version Control (Versions Ka Tracking): Aap apni images ke alag-alag versions ko aaram se manage kar sakte ho.

Local Registry Chalana: Ek Special Container

Hum registry naam ki ek special Docker Image use karke apna local registry chalaenge. Yeh registry image khud ek Magic Box hai jo doosre Magic Boxes ki recipes ko store kar sakta hai.

  1. Registry Image Pull Karo: Terminal kholo aur yeh command chalao:

    bash
    # Docker Hub se 'registry' naam ki image download karo.
    # Yeh image ek server hai jo Docker images ko store karta hai.
    docker image pull registry

    Kya likha hai aur kyun: docker image pull registry se hum registry naam ki official Docker Image ko Docker Hub se download kar rahe hain. Yeh image khud ek Dockerized application hai jo ek private Docker registry server chalati hai.

  2. Local Registry Container Chalao: Ab registry image se ek container banao aur usko chalao. Yeh hamara private app store hoga.

    bash
    # 'registry' image se ek container chalao, jo hamara local registry server hoga.
    # -d: 'detached mode' mein chalao (background mein).
    # -p 5000:5000: Host PC ke port 5000 ko container ke port 5000 se connect karo.
    #   Local registries default roop se port 5000 par chalte hain.
    # --restart always: Agar registry container band ho jaye, toh automatic restart ho jaye.
    # --name localregistry: Container ka naam 'localregistry' rakha, taki use pehchan sakein.
    # -e REGISTRY_STORAGE_DELETE_ENABLED=true: Yeh ek setting (environment variable) hai jo registry ko
    #   images delete karne ki permission deta hai. Agar yeh 'false' ho, toh images delete nahi ho payengi.
    # registry: Yeh image ka naam hai jisse container banega.
    docker container run -d -p 5000:5000 --restart always --name localregistry -e REGISTRY_STORAGE_DELETE_ENABLED=true registry

    Kya likha hai aur kyun:

    • -p 5000:5000: Port mapping for the registry. Ab aap apne browser ya docker commands se 127.0.0.1:5000 par registry ko access kar paoge.
    • --restart always: Ensures the registry is always running, even if the Docker Daemon restarts.
    • -e REGISTRY_STORAGE_DELETE_ENABLED=true: This environment variable is important if you later want to delete images from your local registry.

    Output mein container ID dikhega.

    Picture time! Dekho, docker container run command ka output jab local registry chalate hain.

    Run Local Registry OutputImage: docker container run command ka output jab local registry container chalate hain. Dikhata hai ki registry container background mein chal raha hai.

  3. Local Registry Check Karo: Browser mein http://127.0.0.1:5000/v2/_catalog open karo.

    • Abhi aapko ek empty list dikhegi { "repositories": [] } kyunki abhi tak humne koi image upload nahi ki hai. Is URL se aap registry mein maujood images ki list dekh sakte ho.

Images Ko Tag Karna: Address Dena

Apni image ko local registry par upload karne ke liye, usko ek special naam dena padta hai, jismein local registry ka address bhi ho. Isko tagging kehte hain. Jaise kisi kitab par uska ISBN number hota hai.

  1. Pehle ek image pull karo (agar nahi hai): Jaise alpine ya busybox bahut choti images hain.

    bash
    # 'alpine' image ko Docker Hub se download karo.
    docker image pull alpine
    bash
    # 'busybox' image ko Docker Hub se download karo.
    docker image pull busybox
  2. Images Ko Tag Karo: Ab hum apni alpine image ko naya naam denge jismein hamare local registry ka address shamil hoga.

    bash
    # 'alpine' image ko naya tag do.
    # '127.0.0.1:5000/' hamare local registry ka address hai (IP address aur port).
    # 'alpine' naya image naam hai.
    # ':latest' image ka version tag hai (jaise v1.0, v2.0, default 'latest' hota hai).
    docker image tag alpine 127.0.0.1:5000/alpine:latest

    Kya likha hai aur kyun:

    • docker image tag: Yeh command ek existing image को एक नया नाम (या टैग) देता है.
    • alpine: Yeh source image ka naam hai (jo humne abhi pull ki thi).
    • 127.0.0.1:5000/alpine:latest: Yeh target image ka naya naam hai. 127.0.0.1:5000 hamare local registry ka address hai. Jab hum is format mein tag karte hain, toh Docker samajh jaata hai ki is image ko 127.0.0.1:5000 par push karna hai.

    Ek aur image tag kar lo:

    bash
    # 'busybox' image ko bhi tag karo, taki use bhi push kar sakein.
    docker image tag busybox 127.0.0.1:5000/busybox:latest

Images Ko Push Karna: Upload Karna

Tag karne ke baad, aap apni image ko local registry par push kar sakte ho. Jaise library mein koi nayi kitab rakhte ho.

  1. Images Ko Push Karo: Ab tagged images ko local registry par upload karo:

    bash
    # '127.0.0.1:5000/alpine:latest' naam ki image ko local registry par push karo.
    docker image push 127.0.0.1:5000/alpine:latest
    bash
    # '127.0.0.1:5000/busybox:latest' naam ki image ko local registry par push karo.
    docker image push 127.0.0.1:5000/busybox:latest

    Kya likha hai aur kyun:

    • docker image push: Yeh command Docker को एक tagged image को remote registry (yahan hamari local registry) पर अपलोड करने के लिए कहता है. Docker 127.0.0.1:5000/ prefix ko dekh kar samajh jaata hai ki image ko kahan push karna hai.

    Picture time! Dekho, docker image push command ka output.

    Docker Image Push OutputImage: docker image push command ka output. Dikhata hai ki image successfully local registry par upload ho rahi hai.

  2. Browser Refresh Karo: Browser mein http://127.0.0.1:5000/v2/_catalog ko refresh karo. Ab aapko apni uploaded images (alpine aur busybox) ki list dikhegi! 🎉 Matlab, woh ab hamare private app store mein hain.

    Picture time! Dekho, browser mein local registry ka catalog kaisa dikhta hai images push hone ke baad.

    Local Registry Catalog with ImagesImage: Browser mein local registry _catalog page. Ab yahan alpine aur busybox images list ho rahi hain, jo humne push ki hain.

Images Ko Pull Karna: Download Karna

Jab image registry par ho, toh koi bhi usko wahan se pull kar sakta hai. Jaise library se kitab nikalte ho.

  1. Pehle original image delete karo (test ke liye): Apne computer se original alpine image delete kar do, taki hum dekh sakein ki local registry se pull ho rahi hai ya nahi.

    bash
    # 'alpine' image ko apne local Docker storage se remove karo.
    docker image rm alpine
    # '127.0.0.1:5000/alpine:latest' wali image bhi delete kar do.
    docker image rm 127.0.0.1:5000/alpine:latest
    # Check karo ki alpine image ab available nahi hai.
    docker image ls alpine
  2. Local Registry se Image Pull Karo:

    bash
    # '127.0.0.1:5000/busybox:latest' image ko hamare local registry se download karo.
    docker image pull 127.0.0.1:5000/busybox:latest

    Kya likha hai aur kyun:

    • docker image pull: Yeh command registry से image को डाउनलोड करने के लिए use होता है. क्योंकि हमने registry का address (IP:Port) दिया है, Docker इसे local registry से pull करेगा.

    Aap dekhoge ki image bahut fast download ho jayegi kyunki woh aapke hi network par hai.

    Picture time! Dekho, local registry se image pull karne ka output.

    Docker Image Pull from Local RegistryImage: docker image pull command ka output jab image local registry se pull ki jaati hai. Dikhata hai ki image successfully download ho gayi hai.

Images Ko Delete Karna: Saaf-Sufai

Agar aapko registry se koi image hatani ho, toh aap use delete kar sakte ho.

  1. Registry Container Ke Andar Jao aur Files Delete Karo: Local registry images ko apne andar ek khas folder mein store karta hai (/var/lib/registry/docker/registry/v2/repositories). Hum is folder ke andar jaakar images ko delete kar sakte hain.

    bash
    # 'localregistry' container ke andar shell kholo.
    docker exec -it localregistry sh
    • Ab aap container ke andar hain. Yeh commands chalao:
      bash
      # 'alpine' image ke files ko delete karo.
      # 'rm -rf' forcefully delete karta hai folder aur uske andar ke saare files.
      rm -rf /var/lib/registry/docker/registry/v2/repositories/alpine
      
      # 'busybox' image ke files ko delete karo.
      rm -rf /var/lib/registry/docker/registry/v2/repositories/busybox
      
      # Container ke shell se bahar aao.
      exit
      Kya likha hai aur kyun: rm -rf एक Linux command है जो recursively और forcefully folders और files को डिलीट करता है. exit से आप container के shell से बाहर आ जाते हो.

    Picture time! Dekho, local registry container ke andar se files delete karne ka output.

    Delete Images from Local RegistryImage: docker exec -it localregistry rm -rf command ka output. Dikhata hai ki images ke files registry storage se delete ho gaye hain.

  2. Check Deletion:

    • Browser refresh karo http://127.0.0.1:5000/v2/_catalog. Images gayab honi chahiye.
    • Phir se pull karne ki koshish karo:
      bash
      # Ab pull karne ki koshish karo.
      # Error aayega kyunki image ab wahan nahi hai.
      docker image pull 127.0.0.1:5000/busybox:latest
      Aapko error dikhega ki image nahi mili (Error response from daemon: manifest unknown). Iska matlab image successfuly delete ho gayi hai.

Apni private app library banana bahut cool hai, hai na? Ab aap apni apps ko secure rakh sakte ho aur fast access bhi kar sakte ho! 🤩


Chapter 7: Files Idhar-Udhar Karna: Docker Content Transfer (LAB-06 - Full Details) 📂↔️📁

Imagine karo Magic Box (Container) mein files dalne aur nikalne ki baat? Kabhi aapko apne computer (Host PC) se files us Magic Box mein dalni hoti hain, aur kabhi Magic Box se files apne computer par copy karni hoti hain. Docker iske liye kuch bahut useful tarike provide karta hai.

Files Copy Karne Ke Tarike (Summary)

Humne pehle bhi kuch tarike dekhe hain, chalo unko phir se summarize karte hain, aur phir ek naya, bahut useful command seekhenge:

  1. Dockerfile COPY command: Yeh tab use hota hai jab aap image banate waqt hi files ko image ke andar pack karna chahte ho. Jaise recipe book mein pehle se hi saari ingredients pack kar dena.
  2. Bind Mount/Volume: Yeh tab use hota hai jab aapko files ko live sync karna ho ya unhein permanent store karna ho. Jaise shared desk ya permanent locker.
  3. docker cp command: Yeh tab use hota hai jab aapko ek bar mein files ko copy-paste karna ho, jaise aap apne computer par files copy karte ho. Yeh chalte hue container ke saath kaam karta hai.

Is chapter mein, hum docker cp command par zyada focus karenge kyunki yeh bahut versatile hai.

Picture time! Dekho, docker cp command host se container mein files kaise copy karta hai.

Docker CP Host to ContainerImage: docker cp command host PC se container mein files copy karta hua. Yeh Command Prompt (Host) aur Docker Container (Remote) ke beech file transfer dikhata hai.

Host PC Se Container Mein Copy Karna

Imagine karo, aapne apne computer par ek nayi website file banayi hai, aur aap use chalte hue Nginx Magic Box (container) mein daalna chahte ho.

  1. Pehle ek Nginx container chalao: Agar aapke paas koi Nginx container nahi chal raha, toh ek chala lo.

    bash
    # Ek Nginx container chalao, naam 'my_nginx_webserver' rakho.
    # Background mein chalao, aur host ke port 80 ko container ke port 80 se jodo.
    docker container run --name my_nginx_webserver -d -p 80:80 nginx
  2. Apne Host PC par ek test file banao:

    • Apne Desktop par my_test_files naam ka ek folder banao.
    • Us folder ke andar test.html naam ki file banao aur usmein yeh code paste karo:
      html
      <!DOCTYPE html>
      <html>
      <head>
      <title>My Test Page</title>
      </head>
      <body>
      <h1>Hello from my Test HTML File!</h1>
      </body>
      </html>
    • File ko my_test_files folder mein test.html naam se save karo.
  3. docker cp command se file copy karo: Ab hum test.html file ko apne computer se chalte hue my_nginx_webserver container ke andar copy karenge. Hum ise container ke /usr/share/nginx/html folder mein daalenge, jahan Nginx web pages dikhata hai.

    bash
    # Host PC ke 'my_test_files' folder (aur uske andar 'test.html' file) ko
    # 'my_nginx_webserver' container ke andar '/usr/share/nginx/html' folder mein copy karo.
    # Yahan 'C:\Users\YourUsername\Desktop\my_test_files' ko apne actual path se badalna.
    # Agar Linux/macOS use kar rahe ho, toh path aisa hoga: ~/Desktop/my_test_files
    docker cp C:\Users\YourUsername\Desktop\my_test_files my_nginx_webserver:/usr/share/nginx/html

    Kya likha hai aur kyun:

    • docker cp: Yeh command files aur folders ko host PC aur container ke beech copy karne ke liye use hota hai.
    • C:\Users\YourUsername\Desktop\my_test_files: Yeh source path hai, jahan se file copy karni hai. Yeh aapke Host PC ka path hai.
    • my_nginx_webserver:/usr/share/nginx/html: Yeh destination path hai, jahan file copy karni hai. Ismein container_name:container_path format use hota hai. my_nginx_webserver container ka naam hai, aur /usr/share/nginx/html container ke andar ka folder hai.
  4. Browser mein check karo: Ab browser mein http://127.0.0.1/my_test_files/test.html open karo.

    • Aapko "Hello from my Test HTML File!" dikhega! Matlab, file successfully copy ho gayi hai.

Container Se Host PC Mein Copy Karna

Ab ulta karte hain! Agar aapko container se kuch files (jaise logs ya koi reports jo app ne banayi hain) apne host PC par copy karni hain, toh bhi docker cp use kar sakte ho.

  1. Nginx container ke andar ek test file banao:

    • my_nginx_webserver container ke andar jao:
      bash
      # 'my_nginx_webserver' container ke andar shell (command line) kholo.
      docker exec -it my_nginx_webserver sh
    • Container ke andar, cd /usr/share/nginx/html mein jao.
    • Ek file banao:
      bash
      # 'container_output.txt' naam ki file banao aur usmein yeh text likho.
      echo "This file was created inside the container!" > container_output.txt
      # 'cat' command se file ka content dekh sakte ho.
      cat container_output.txt
    • CTRL+P+Q dabakar container se bahar aa jao.
  2. docker cp command se file copy karo: Ab container ke andar ki container_output.txt file ko apne host PC par copy karenge.

    bash
    # 'my_nginx_webserver' container ke andar ke '/usr/share/nginx/html/container_output.txt' file ko
    # apne Host PC ke 'C:\Users\YourUsername\Desktop\my_test_files\output' folder mein copy karo.
    # Pehle 'output' naam ka folder Desktop par 'my_test_files' ke andar bana lo.
    # Yahan 'C:\Users\YourUsername\Desktop\my_test_files\output\container_output_from_container.txt' ko apne actual path se badalna.
    # Agar Linux/macOS use kar rahe ho, toh path aisa hoga: ~/Desktop/my_test_files/output/container_output_from_container.txt
    docker cp my_nginx_webserver:/usr/share/nginx/html/container_output.txt C:\Users\YourUsername\Desktop\my_test_files\output\container_output_from_container.txt

    Kya likha hai aur kyun:

    • my_nginx_webserver:/usr/share/nginx/html/container_output.txt: Yeh source path hai, container ke andar file ka location.
    • C:\Users\YourUsername\Desktop\my_test_files\output\container_output_from_container.txt: Yeh destination path hai, aapke Host PC ka path jahan file copy karni hai.
  3. Host PC par check karo: Apne Desktop par my_test_files folder ke andar output folder mein jao. Aapko container_output_from_container.txt file dikhegi. Usse open karo aur dekho uska content "This file was created inside the container!" hoga.

Docker Volume Se Host PC Mein Copy Karna

Agar aapka data kisi Docker Volume mein save hai (jaise humne LAB-02 mein my-nginx-volume banaya tha) aur aap use apne host PC par copy karna chahte ho, toh aapko ek chota sa trick use karna padega. Kyunki Volumes direct docker cp se access nahi hote.

  1. Pehle ke containers band karo: Agar my_nginx_webserver chal raha hai, toh use band kar do:

    bash
    docker container rm -f my_nginx_webserver
  2. Volume mein data hona chahiye: Confirm karo ki my-nginx-volume mein data hai. Agar nahi hai toh my-nginx-volume ko LAB-02 ke step 5 aur 6 se phir se banao aur index.html change karo. (Matlab mywebserver container chalao, uske andar index.html change karo, CTRL+P+Q se bahar aao, phir mywebserver ko rm -f karo).

  3. Ek Temporary Container Banao: Hum ek bahut hi chota "helper" container (jaise busybox) banayenge. Yeh container chalega nahi, bas create hoga, aur isko apne my-nginx-volume se jodenge.

    bash
    # Ek naya, temporary container banao.
    # --name temp_helper_container: Isko 'temp_helper_container' naam do.
    # -v my-nginx-volume:/temp_data: 'my-nginx-volume' ko is container ke andar ke '/temp_data' folder se jodo.
    # busybox: Ek bahut hi choti Linux image hai, jo files copy karne jaise basic kaam ke liye perfect hai.
    # Is command se container sirf create hoga, chalega nahi.
    docker container create --name temp_helper_container -v my-nginx-volume:/temp_data busybox

    Kya likha hai aur kyun:

    • docker container create: Yeh run jaisa hi hai, lekin container ko start nahi karta, sirf banata hai.
    • -v my-nginx-volume:/temp_data: Volume binding. my-nginx-volume (hamara Permanent Locker) ko temp_helper_container ke andar /temp_data folder se jod diya. Ab temp_helper_container ke /temp_data folder mein my-nginx-volume ka saara data hoga.
    • busybox: Ek minimal Linux image, sirf basic utilities ke liye.
  4. Temporary container se data copy karo: Ab docker cp command ka use karke, temp_helper_container ke andar se data ko apne host PC par copy karo.

    bash
    # 'temp_helper_container' ke andar ke '/temp_data' folder se saara content (jismein hamara 'index.html' hai)
    # apne Host PC ke 'C:\Users\YourUsername\Desktop\my_test_files\volume_output' folder mein copy karo.
    # Pehle 'volume_output' naam ka folder Desktop par 'my_test_files' ke andar bana lo.
    # Yahan 'C:\Users\YourUsername\Desktop\my_test_files\volume_output' ko apne actual path se badalna.
    # Agar Linux/macOS use kar rahe ho, toh path aisa hoga: ~/Desktop/my_test_files/volume_output
    docker cp temp_helper_container:/temp_data C:\Users\YourUsername\Desktop\my_test_files\volume_output

    Kya likha hai aur kyun:

    • temp_helper_container:/temp_data: Yeh source hai, temp_helper_container ke andar का /temp_data folder.
    • C:\Users\YourUsername\Desktop\my_test_files\volume_output: Yeh destination hai, aapke host PC par.

    Picture time! Dekho, Docker Volume se Host PC mein files copy karna.

    Docker CP Volume to HostImage: docker cp command Docker Volume se Host PC mein data copy karta hua. Ismein ek temporary container ka use hota hai.

  5. Host PC par check karo: Apne Desktop par my_test_files folder ke andar volume_output folder mein jao. Aapko index.html file dikhegi (jo my-nginx-volume mein thi). Usko open karo aur dekho uska content "Welcome to My Web Site, This is written using First Container" hoga.

  6. Temporary container ko remove karo: Jab kaam ho jaye, toh temporary container ko hata do.

    bash
    # Temporary container ko remove karo.
    docker container rm temp_helper_container

Toh dekha, files ko Docker Magic Boxes ke andar aur bahar transfer karna kitna easy hai! 📂↔️📁


Chapter 8: C++ Build Environments: Linux & Windows (LAB-07, LAB-08 - Full Details) ⚙️

Dear little engineers,

Aap mein se kuch ko coding bahut pasand hogi, khaas kar C++ jaise languages mein. C++ mein jab aap code likhte ho, toh usko ek special process se guzarna padta hai jise "build" karna kehte hain. Ismein aapka code ek aise program mein badal jaata hai jo computer samajh sakta hai aur chala sakta hai.

C++ Build Kyun Docker Mein? (Problem & Solution)

Imagine karo aapko ek bahut complex robot banana hai. 🤖 Iske liye aapko bahut saare alag-alag tools chahiye (jaise special screwdriver, specific glue, measuring tape). Agar aap har baar naye bande ko woh saare tools laake doge, toh kitna time lagega? Aur agar tools ka version alag ho toh robot theek se na bane? ⏳

Programming ki duniya mein bhi aisa hi hota hai:

  • Too many tools: C++ code build karne ke liye bahut saare special tools (jaise compilers, build systems, libraries, dependency managers) install karne padte hain.
  • Version problems: Agar har developer alag version ke tools use kare, toh ho sakta hai code kisi ke computer par theek se build ho, aur kisi ke computer par na ho.
  • Messy computer: Ye tools aapke computer par bahut space le sakte hain aur kabhi-kabhi doosre software se takra sakte hain.

Solution: Docker Ka Tool Kit! 🛠️ Docker mein, hum ek "Tool Kit" (Docker Image) bana sakte hain jismein C++ code build karne ke liye saare zaroori tools pehle se installed hon, aur sahi versions mein hon. Phir har developer ussi Tool Kit ka use karke code build kar sakta hai.

  • Consistent Builds (Hamesha Ek Jaisa): Har baar code ek hi tarike se build hoga, chahe kaun sa developer build kare. Jaise sab ek hi brand ke tools use kar rahe hain.
  • Isolated Environment (Saaf-Suthra): Build process aapke main computer ko ganda nahi karega. Tools Magic Box ke andar hi rahenge.
  • Easy Setup (Aasan Shuruat): Naye developer ko bas Docker install karna hai, aur woh turant build karna shuru kar sakte hain, bina ghanto tools install kiye.

Hum do examples dekhenge:

  1. Linux (Ubuntu) par C++ build environment.
  2. Windows par C++ build environment (Visual Studio ke saath).

Picture time! Dekho, Dockerfile ka structure kaisa dikhta hai. Yeh hamari C++ build environment ki recipe book hai.

Dockerfile StructureImage: Dockerfile ka structure. Har line ek step hai jo Docker image ko banane mein help karta hai, jaise ingredients add karna ya cooking instructions.

LAB-07: Linux C++ Dockerfile (Detailed)

Yeh Dockerfile Ubuntu 18.04 Linux system par C++ build karne ke liye saare tools set karta hai.

  1. Ek Naya Folder Banao: Apne Desktop par ek folder banao, naam rakho linux_cpp_builder.

  2. Dockerfile File Banao: linux_cpp_builder folder ke andar Dockerfile naam ki file banao.

    • Text Editor mein paste karo:
    dockerfile
    # Dockerfile (Linux C++ Project Build Karne Ki Recipe Book)
    
    # STEP 1: Base Image Chunna.
    # 'ubuntu:18.04' ek popular aur free Linux operating system ki image hai.
    FROM ubuntu:18.04
    
    # STEP 2: Container ke andar kaam kahan karna hai.
    # '/home/project' naam ke folder ko hamara main working directory banao.
    # Hamara C++ project isi folder ke andar hoga.
    WORKDIR /home/project
    
    # STEP 3: Zaroori Tools Install Karna.
    # 'RUN' command Docker image banate waqt commands chalata hai.
    # 'apt-get update -y' saare available software packages ki list update karta hai.
    # 'apt-get install -y' bahut saare common tools install karta hai jaise:
    #   - net-tools: network ke commands (jaise ifconfig)
    #   - iputils-ping: network se doosre computers ko check karne ke liye (ping)
    #   - python3-distutils, python3-apt: Python ke kuch zaroori parts
    #   - sudo, wget, vim, nano: common utility tools (sudo root access ke liye, wget files download karne ke liye, vim/nano text editing ke liye)
    # '&& \' ka matlab hai ki ek command ke baad doosra command chalao, aur line change karo.
    RUN apt-get update -y && \
        apt-get install net-tools -y && \
        apt-get install iputils-ping -y &&\
        apt-get install python3-distutils -y &&  \
        apt-get install python3-apt -y &&\
        apt-get install sudo wget vim nano -y  
        
    # STEP 4: Python3, pip3, Conan, aur Git install karna.
    # 'curl': web se files download karne ke liye.
    # 'python3.7 python3.7-dev python3.7-distutils': Python 3.7 aur uske development parts install karo.
    # 'update-alternatives --install /usr/bin/python python /usr/bin/python3.7 1': System ko batao ki 'python' command ka matlab 'python3.7' hai.
    # 'curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && python3.7 get-pip.py': Pip (Python ka package manager) install karo.
    # 'pip3 install conan': Conan (C++ projects ke liye dependency manager) install karo.
    # 'apt-get install git -y': Git (code ko manage karne ke liye) install karo.
    RUN apt-get install -y curl python3.7 python3.7-dev python3.7-distutils &&\
        update-alternatives --install /usr/bin/python python /usr/bin/python3.7 1 &&\
        update-alternatives --set python /usr/bin/python3.7 &&\
        curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py &&\
        python3.7 get-pip.py &&\
        pip3 install conan &&\
        apt-get install git -y
    
    # STEP 5: GCC (GNU Compiler Collection) install karna.
    # GCC ek compiler hai jo C++ code ko computer ke samajhne wale program mein badalta hai.
    # 'software-properties-common' aur 'add-apt-repository': naye software sources add karne ke liye.
    # 'ppa:ubuntu-toolchain-r/test': ek source jahan se naye GCC versions milte hain.
    # 'apt install gcc-7 g++-7 gcc-8 g++-8 gcc-9 g++-9': GCC aur G++ ke alag-alag versions install karo.
    # 'update-alternatives': system ko batao ki default GCC aur G++ version kaun sa use karna hai (yahan hum 9, 8, 7 options de rahe hain).
    RUN apt install software-properties-common -y &&\
        add-apt-repository ppa:ubuntu-toolchain-r/test -y &&\
        apt install gcc-7 g++-7 gcc-8 g++-8 gcc-9 g++-9 -y &&\
        update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 --slave /usr/bin/g++ g++ /usr/bin/g++-9 --slave /usr/bin/gcov gcov /usr/bin/gcov-9 &&\
        update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 80 --slave /usr/bin/g++ g++ /usr/bin/g++-8 --slave /usr/bin/gcov gcov /usr/bin/gcov-8 &&\
        update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 70 --slave /usr/bin/g++ g++ /usr/bin/g++-7 --slave /usr/bin/gcov gcov /usr/bin/gcov-7
       
    # STEP 6: CMake install karna.
    # CMake ek tool hai jo bade C++ projects ko build karne mein help karta hai.
    # 'wget': web se CMake ka compressed file download karo.
    # 'tar zxvf': compressed file ko extract karo.
    # 'cd cmake-3.20.5': extracted folder mein jaao.
    # './bootstrap && make -j4 && make install': CMake ko compile aur install karo.
    # 'cmake --version': check karo ki CMake install ho gaya hai ya nahi.
    RUN apt-get update &&\
        wget https://github.com/Kitware/CMake/releases/download/v3.20.5/cmake-3.20.5.tar.gz &&\
        tar zxvf cmake-3.20.5.tar.gz &&\
        cd cmake-3.20.5 &&\
        ./bootstrap &&\
        make -j4 &&\
        make install &&\
        cmake --version &&\
        cd ..
    
    # STEP 7: Conan ko configure karna.
    # Conan ek C++ dependency manager hai jo libraries ko manage karta hai.
    # 'pip install conan --upgrade': Conan ko latest version par update karo.
    # 'conan profile new default --detect': Conan ka default profile banao aur system settings ko detect karo.
    # 'conan profile show default': default profile ki settings dekho.
    # 'conan profile update settings.compiler=gcc default': compiler ko 'gcc' set karo.
    # 'conan profile update settings.compiler.version=8 default': GCC version ko '8' set karo.
    # 'conan profile update settings.compiler.libcxx=libstdc++11 default': Standard C++ library ko set karo.
    # 'conan profile update settings.build_type=RelWithDebInfo default': build type ko set karo (RelWithDebInfo debugging ke liye).
    # 'conan remote list': Conan remotes (jahan se libraries download hoti hain) ki list dekho.
    RUN pip install conan --upgrade &&\
        conan profile new default --detect &&\
        conan profile show default &&\
        conan profile update settings.compiler=gcc default &&\
        conan profile update settings.compiler.version=8 default &&\
        conan profile update settings.compiler.libcxx=libstdc++11 default &&\
        conan profile update settings.build_type=RelWithDebInfo default &&\
        conan remote list
    
    # STEP 8: Container shuru hote hi Bash shell khulegi.
    # 'CMD bash' ka matlab hai ki jab yeh Magic Box (container) chalega, toh 'bash' shell open hogi.
    # Isse aap container ke andar commands type kar sakte ho.
    CMD bash
  3. Image Build Karo:

    • Terminal mein linux_cpp_builder folder mein jao.
    • Yeh command chalao:
      bash
      # 'Dockerfile' se image banao, aur iska naam 'build-env-ubuntu18' rakho.
      docker image build -t build-env-ubuntu18 .
      NOTE: Yeh command bahut time lega kyunki bahut saare tools internet se download aur install honge. Patience rakhna!
  4. Container Chalao aur Project Link Karo:

    • Ab ek dummy C++ project folder banao apne host PC par. Jaise C:\Linux-Project. Iske andar source aur build naam ke do empty folders bana lo. For example, C:\Linux-Project\MyCppProject\source aur C:\Linux-Project\MyCppProject\build (yahan MyCppProject ki jagah aap kuch bhi likh sakte ho).
    • Yeh command chalao:
      bash
      # 'build-env-ubuntu18' image se container chalao.
      # -it: Interactive mode aur TTY (shell access ke liye).
      # --name con-linux: Container ka naam 'con-linux' rakho.
      # -v C:\Linux-Project:/home/project: Host PC ke 'C:\Linux-Project' folder ko container ke '/home/project' se jodo (Bind Mount).
      #   (Linux/macOS user: -v /home/YourUsername/Desktop/Linux-Project:/home/project)
      # /bin/bash: Container shuru hote hi '/bin/bash' shell open karo.
      docker container run -it --name con-linux -v C:\Linux-Project:/home/project build-env-ubuntu18 /bin/bash
    • Ab aap container ke andar hain! Aap cd MyCppProject/source mein jaakar apne C++ project ko build kar sakte ho:
      bash
      # Container ke andar yeh commands chalao.
      # Project ke source folder mein jao.
      cd MyCppProject/source
      # CMake se build files generate karo.
      sudo cmake -S /home/project/MyCppProject/source -B /home/project/MyCppProject/build 
      # Build folder mein jao.
      cd ../build
      # Project ko build karo (4 parallel jobs).
      make -j4
      Agar aapke paas asli C++ code hai, toh woh /home/project/MyCppProject/source mein hoga, aur uska output /home/project/MyCppProject/build mein aa jayega, jo aapke host PC par bhi dikhega.

LAB-08: Windows C++ Dockerfile (Detailed)

Windows par C++ build karna thoda alag hota hai, khaas kar jab Visual Studio compiler use karna ho.

  1. IMPORTANT: Docker Desktop ko Windows Containers par switch karo:

    • Apne Docker Desktop icon par Right-click karo (Windows mein system tray mein).
    • "Switch to Windows containers" par click karo. Yeh thoda time lega.
    • WARNING: Windows containers bahut bade hote hain aur bahut disk space lete hain (minimum 20GB-25GB free space chahiye). Isliye, agar aapke computer mein kam space hai, toh yeh lab avoid kar sakte ho ya baad mein try karna.
  2. Ek Naya Folder Banao: Apne Desktop par ek folder banao, naam rakho windows_cpp_builder.

  3. run.bat File Banao: windows_cpp_builder folder ke andar run.bat naam ki file banao. Yeh ek Windows Batch script hai jo Visual Studio components install karegi aur project build karegi.

    • Text Editor mein paste karo:
      batch
      @ECHO OFF
      
      ECHO Starting installation of the visualstudio2019-workload-nativedesktop!
      # choco se Visual Studio ke C++ development ke liye zaroori workload install karo.
      choco install -y visualstudio2019-workload-nativedesktop
      ECHO Congratulations! visualstudio2019-workload-nativedesktop was installed successfully.
      
      ECHO Cmake added into Path!
      # CMake ka path environment variables mein add karo, taki 'cmake' command direct use ho sake.
      set PATH=%PATH%;C:\Program Files\CMake\bin\
      
      # C++ project ke liye build files (.sln files) generate karo.
      # -S: source code ka path.
      # -B: build files kahan banenge uska path.
      cmake -S C:\Project\ProjectName\source -B C:\Project\ProjectName\build
      ECHO Project .sln file created!
      
      # Build folder mein jao.
      cd C:\Project\ProjectName\build
      # MSBuild tool use karke actual C++ project ko build karo.
      # 'projectName.sln' ki jagah aapke project ki .sln file ka naam aayega.
      # /property:Configuration=RelWithDebInfo: build type ko set karo.
      "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\msbuild.exe" projectName.sln /property:Configuration=RelWithDebInfo
      ECHO Project builded!
    • File Save karo: windows_cpp_builder folder mein, naam run.bat (no .txt extension, Save as type: All Files).
  4. Dockerfile File Banao: windows_cpp_builder folder ke andar Dockerfile naam ki file banao.

    • Text Editor mein paste karo:
    dockerfile
    # Dockerfile (Windows C++ Project Build Karne Ki Recipe Book)
    
    # escape=` # Windows mein backtick (`) use hota hai line continue karne ke liye.
    
    # STEP 1: Base Image Chunna.
    # 'mcr.microsoft.com/dotnet/framework/sdk:4.8-windowsservercore-ltsc2019'
    # Yeh Windows Server Core image hai jismein .NET Framework 4.8 hai, jo Visual Studio ke liye zaroori hai.
    FROM mcr.microsoft.com/dotnet/framework/sdk:4.8-windowsservercore-ltsc2019
    
    # Environment variable set karo jismein Visual Studio tools ka path hai.
    ENV VS160COMNTOOLS C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Tools
    
    # STEP 2: Container ke andar kaam kahan karna hai.
    # 'C:\init' naam ke folder ko hamara main working directory banao.
    WORKDIR C:\init
    
    # STEP 3: Default Windows shell ko restore karo.
    # 'cmd /S /C' batch processing ke liye sahi shell setup karta hai.
    SHELL ["cmd", "/S", "/C"]
    
    # STEP 4: Chocolatey (choco) install karo.
    # choco Windows ke liye ek package manager hai, jaise Linux mein apt-get.
    RUN @"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
    
    # STEP 5: Python 3.9 install karo.
    # choco se Python 3.9 install karo aur uska path environment mein add karo.
    RUN choco install -y python3 `
        && set PATH=%PATH%;C:\Python39\
    
    # STEP 6: Visual Studio 2019 Community Edition install karo (compiler ke liye).
    # choco se Visual Studio 2019 install karo.
    RUN choco install -y visualstudio2019community 
    
    # STEP 7: Conan install karo.
    # pip3 (Python ka package manager) se Conan install karo.
    RUN pip3 install conan
    
    # STEP 8: Conan ko configure karo.
    # Conan ke default profile ko setup karo.
    RUN conan profile new default --detect `
        && conan profile show default `
        && conan profile update settings.build_type=RelWithDebInfo default `
        && conan remote list
    
    # STEP 9: CMake install karo.
    # choco se CMake install karo aur uska path environment mein add karo.
    RUN choco install cmake -y `
        && set PATH=%PATH%;C:\Program Files\CMake\bin\
        
    # STEP 10: Git install karo.    
    # choco se Git install karo aur uska path environment mein add karo.
    RUN choco install git -y `
        && set PATH=%PATH%;C:\Program Files\Git\bin\
        
    # STEP 11: 'run.bat' file ko container mein copy karo.
    # Yeh file Visual Studio workload, cmake aur msbuild commands ko run karegi.
    COPY run.bat .
    
    # STEP 12: Container shuru hote hi 'run.bat' aur phir 'cmd.exe' chalayega.
    # 'CMD C:\init\run.bat && cmd.exe' ka matlab hai ki jab yeh Magic Box (container) chalega,
    # toh pehle 'run.bat' script chalegi (jo baaki Visual Studio components install karegi aur project build karegi),
    # aur phir 'cmd.exe' open ho jayega jisse aap commands de saken.
    CMD C:\init\run.bat && cmd.exe
  5. Image Build Karo:

    • Terminal (Command Prompt/PowerShell - Admin Mode mein) mein windows_cpp_builder folder mein jao.
    • Yeh command chalao:
      bash
      # 'Dockerfile' se image banao, aur iska naam 'build-env-windows' rakho.
      # '-m 2GB': Docker ko batao ki is image ko build karne ke liye 2GB memory ka use karo.
      docker image build -t build-env-windows -m 2GB .
      NOTE: Yeh build hone mein bahut time lega (ghanto lag sakte hain!) aur bahut disk space (20GB-25GB) bhi lega. Isliye patience rakhna!
  6. Container Chalao aur Project Link Karo:

    • Ab ek dummy C++ project folder banao apne host PC par. Jaise C:\Win-Project. Iske andar ProjectName naam ka folder banao aur uske andar source aur build naam ke do empty folders bana lo. For example, C:\Win-Project\MyWindowsApp\source aur C:\Win-Project\MyWindowsApp\build.
    • Yeh command chalao:
      bash
      # 'build-env-windows' image se container chalao.
      # -it: Interactive mode aur TTY (shell access ke liye).
      # --name con-win: Container ka naam 'con-win' rakho.
      # -v C:\Win-Project:C:\Project: Host PC ke 'C:\Win-Project' folder ko container ke 'C:\Project' se jodo (Bind Mount).
      # Container shuru hote hi, 'run.bat' script automatic chalegi.
      docker container run -it --name con-win -v C:\Win-Project:C:\Project build-env-windows
    • Container shuru hote hi, run.bat script automatic chalegi, jo baaki Visual Studio components install karegi aur phir C:\Project\ProjectName ke andar aapke C++ project ko build karegi. Jab run.bat khatm hoga, toh cmd.exe open ho jayega jahan aap commands de sakte ho.

Toh dekha, Docker sirf apps chalane ke liye nahi, balki complex software build environments banane ke liye bhi kitna useful hai! Yeh ekdum ready-to-use Tool Kit jaisa hai. 🛠️


Chapter 9: Docker Settings Badalne: Proxy aur Registry Configuration (LAB-09 - Full Details) 🔧

Dear little engineers,

Jab aap Docker ko kisi badi company ke network mein ya special settings ke saath use karte ho, toh kabhi-kabhi usko kuch extra information deni padti hai. Jaise, internet access karne ke liye proxy settings, ya phir apni private Docker library (registry) ko pehchan ne ke liye settings. Yeh thodi advanced settings hain, par bahut zaroori hain.

Proxy Configuration: Internet Gatekeeper Ko Batana

Analogy: Proxy server ek Internet Gatekeeper jaisa hai. 🛡️ Jab aap internet access karte ho (jaise Docker Hub se images download karna), toh aap seedhe internet par nahi jaate. Aap pehle is Gatekeeper ke paas jaate ho. Gatekeeper permission deta hai tabhi aap internet par ja paate ho. Company networks mein yeh Gatekeeper security ke liye bahut common hota hai.

Agar aapka computer (jahan Docker install hai) kisi corporate proxy ke peeche hai, toh Docker ko proxy settings batani padegi, nahi toh woh internet se images download nahi kar paega. NO_PROXY settings un addresses ke liye hain jahan proxy ki zaroorat nahi hai (jaise local network resources ya apni local registry).

  • Linux Par Kaise Karein (Terminal mein):

    1. Folder Banao: docker.service.d naam ka folder banao jahan Docker ki custom settings rakhi jaati hain.

      bash
      # Agar yeh folder nahi hai toh banao.
      sudo mkdir -p /etc/systemd/system/docker.service.d
    2. Folder mein jaao:

      bash
      # Naye bane hue folder mein jaao.
      cd /etc/systemd/system/docker.service.d/
    3. File Banao aur Edit Karo: http-proxy.conf naam ki file banao aur usmein proxy settings add karo.

      bash
      # Ek naya file banao jismein proxy settings hongi.
      sudo touch http-proxy.conf
      # 'nano' editor mein file kholo aur edit karo.
      sudo nano http-proxy.conf

      File mein yeh content paste karo:

      # http-proxy.conf (Linux ke liye proxy settings)
      
      [Service] 
      # Yeh 'HTTP_PROXY' setting batati hai ki HTTP traffic ke liye kaun sa proxy server use karna hai.
      # '192.x.x.x:3128' ki jagah aapko apni company ka actual proxy server address aur port dalna hoga.
      Environment="HTTP_PROXY=http://192.x.x.x:3128"
      # Yeh 'HTTPS_PROXY' setting batati hai ki HTTPS traffic ke liye kaun sa proxy server use karna hai.
      Environment="HTTPS_PROXY=http://192.x.x.x:3128"
      # 'NO_PROXY' un addresses ki list hai jahan proxy use nahi karna hai (direct connection).
      # Jaise 'localhost' (apna hi computer), '192.168.1.0/16' (local network range),
      # '<RegistryIPorDNS>' (aapki apni local Docker registry ka IP address ya naam).
      Environment="NO_PROXY=localhost,192.168.1.0/16,<RegistryIPorDNS>"
      • Save karne ke liye: CTRL+O, Enter.
      • Editor se bahar aane ke liye: CTRL+X.
    4. Docker Service Reload aur Restart Karo: Settings ko apply karne ke liye Docker ko reload aur restart karna padega.

      bash
      # System daemon configuration files ko reload karo.
      sudo systemctl daemon-reload
      # Docker service ko restart karo, taki naye settings apply ho jayein.
      sudo systemctl restart docker
      # Docker service ki environment settings check karo, ki proxy apply hua ya nahi.
      sudo systemctl show --property=Environment docker
  • Windows Par Kaise Karein (PowerShell Admin se):

    1. PowerShell as Administrator kholo: Windows search bar mein "PowerShell" type karo, phir "Windows PowerShell" par right-click karke "Run as administrator" select karo.
    2. Proxy Environment Variables Set Karo:
      powershell
      # HTTP_PROXY environment variable set karo.
      # '192.x.x.x:3128' ki jagah apni company ka proxy address dalna.
      # [EnvironmentVariableTarget]::Machine ka matlab hai ki yeh setting poore computer ke liye hogi.
      [Environment]::SetEnvironmentVariable("HTTP_PROXY", "http://192.x.x.x:3128", [EnvironmentVariableTarget]::Machine)
      
      # HTTPS_PROXY environment variable set karo.
      [Environment]::SetEnvironmentVariable("HTTPS_PROXY", "http://192.x.x.x:3128", [EnvironmentVariableTarget]::Machine)
      
      # NO_PROXY environment variable set karo.
      # Yeh common exceptions hain jahan proxy ki zaroorat nahi hai (local network, localhost, apni registry).
      [Environment]::SetEnvironmentVariable("NO_PROXY", "192.168.*.*, *192.168.*.*,  172.24.*.*, 172.25.*.*, 10.*.*.*, localhost, 127.0.0.1, 0.0.0.0/8, <RegistryIPorDNS>", [EnvironmentVariableTarget]::Machine)
      
      # Docker service ko restart karo, taki naye environment variables apply ho jayein.
      Restart-Service docker
      Kya likha hai aur kyun: [Environment]::SetEnvironmentVariable PowerShell command hai jo system-wide environment variables set karta hai. Docker restart hone par in variables ko pick kar leta hai.

Registry Configuration: Apni Private Library Ko Pehchana

Agar aapne apni private Docker Registry banayi hai (jaise humne LAB-05 mein banayi thi), toh Docker ko batana padta hai ki yeh meri "insecure" registry hai. "Insecure" ka matlab yahan security weak nahi, balki HTTPS encryption use nahi ho rahi hai. Agar aap Docker ko nahi bataoge, toh woh usse images pull nahi karega (kyunki default roop se Docker ko secure HTTPS connections hi pasand hain).

  • Linux Par Kaise Karein (Terminal mein):

    1. Folder mein jaao:

      bash
      cd /etc/docker
    2. File Banao aur Edit Karo: daemon.json naam ki file banao. Yeh Docker Daemon ki main configuration file hoti hai.

      bash
      # 'daemon.json' file banao (agar nahi hai) ya edit karo.
      sudo touch daemon.json
      sudo nano daemon.json

      File mein yeh content paste karo:

      json
      {
              "exec-opts": ["native.cgroupdriver=systemd"],
              "insecure-registries": ["192.x.x.x", "192.x.x.x:5000"],
              "dns": [ "192.x.x.x", "8.8.8.8" ]
      }

      "insecure-registries" mein apni local registry ka IP address aur port (192.x.x.x:5000) dalna hai. Agar aapki registry sirf IP address par hai (no port, default 80/443), toh sirf IP bhi dal sakte ho. dns settings bhi add kar sakte ho agar aapko custom DNS servers use karne hain.

      • Save karne ke liye: CTRL+O, Enter.
      • Editor se bahar aane ke liye: CTRL+X.
    3. Docker Service Restart Karo:

      bash
      # Docker service ko restart karo, taki naye settings apply ho jayein.
      sudo systemctl restart docker
  • Windows Par Kaise Karein:

    1. daemon.json File Dhundo: Windows mein Docker ki daemon.json file is location par hoti hai: C:\ProgramData\docker\config\daemon.json

    2. File Edit Karo:

      • Is file ko Notepad ya kisi text editor mein open karo.
      • Agar file nahi hai, toh bana lo.
      • Usmein yeh content paste karo:
        json
        { 
        "insecure-registries": ["192.x.x.x:5000"],
        "dns": [ "192.x.x.x", "8.8.8.8" ]
        }
        "insecure-registries" mein apni local registry ka IP address aur port dalna.
    3. Docker Service Restart Karo (PowerShell Admin se):

      powershell
      # Docker service ko restart karo, taki naye settings apply ho jayein.
      Restart-Service -Name docker

    Picture time! Dekho, Docker Desktop mein insecure registries setting kahan hoti hai.

    Insecure Registries Setting in Docker DesktopImage: Docker Desktop settings mein insecure registries ka example. Yahan aap apni local registries ko add kar sakte ho.

Yeh configurations important hain, khaas kar jab aap ek bade setup mein Docker use karte ho. Thode technical hain, par ek baar samajh aa gaya toh bahut easy ho jaate hain! 😊


✨ Glossary: Important Terms Ka Dictionary (Detailed)

Yahan kuch important Docker terms hain jo humne is ebook mein seekhe, simple Hinglish explanations aur fun analogies ke saath!

  • Docker: Ek powerful tool jo apps ko unke saare zaroori samaan ke saath chhote, alag-thalag boxes (containers) mein pack karta hai, taki woh kahin bhi, kisi bhi computer par chal sakein, bilkul ek jaise.
    • Analogy: Apps ke liye Magic Box Factory jahan har app ka apna special, portable box banta hai. 📦✨
  • Docker Image: Ek read-only blueprint ya template jisse Docker Containers banaye jaate hain. Ismein app ka code, uski libraries, saare tools aur sab zaroori settings hoti hain. Yeh khud chalta nahi hai, bas banane ka tarika hai.
    • Analogy: App banane ki Recipe Book ya LEGO model ka instruction manual. 📝
  • Docker Container: Docker Image se bana hua ek live, runnable instance. Yeh app ka ek alag-thalag copy hota hai jo chal raha hota hai. Iske andar hum changes kar sakte hain.
    • Analogy: Recipe book se bana hua Bana Hua Khana (jo aap kha sakte ho) ya LEGO model jo aapne banaya hai. 🍲
  • Dockerfile: Ek simple text file jismein instructions (steps) likhe hote hain ki ek Docker Image kaise banayi jaye. Ismein FROM, COPY, RUN, EXPOSE, CMD jaise commands hote hain.
    • Analogy: Recipe Book mein likhi Cooking Recipe ya LEGO manual mein step-by-step instructions. 👩‍🍳
  • Docker Hub: Docker Images ki ek bahut badi public online repository ya library. Aap yahan se ready-made images pull (download) kar sakte ho aur apni banayi hui images push (upload) bhi kar sakte ho.
    • Analogy: Apps ki Online Library ya ek bada App Store jahan sab tarah ki apps ki recipes milti hain. 🌐📚
  • Docker Engine: Docker ka core software component jo Docker Images ko build karta hai, Containers ko run karta hai, aur Volumes & Networks ko manage karta hai. Yeh aapke computer ke background mein chalta rehta hai.
    • Analogy: Magic Boxes ko control karne wala Smart Robot Manager ya factory ka Brain. 🧠🤖
  • Docker Volume: Docker द्वारा managed ek special storage area jo containers ke liye permanent data save karta hai. Container delete hone par bhi ismein data safe rehta hai. Docker ise khud sambhalta hai.
    • Analogy: Data store karne ke liye Permanent Locker jo school mein hota hai. 🔒
  • Bind Mount: Host PC (aapke computer) ke kisi folder ko Docker Container ke andar ke folder se directly link karna. Isse dono locations ke beech live synchronization hoti hai. Aap data kahan store hoga yeh control karte ho.
    • Analogy: Ek Shared Desk jahan aap aur Magic Box (container) dono ek hi files par real-time mein kaam kar sakte ho. 🤝
  • Port Mapping / Port Publishing (-p flag): Host PC ke ek port ko Container ke ek port se connect karna. Isse internet se aane wala traffic host PC ke us port se container ke andar ke port tak pahunch jaata hai, taki bahar se log app ko access kar sakein.
    • Analogy: Apne ghar ka darwaza (Host PC Port) Magic Box (Container) ke darwaze (Container Port) se Jodna taki log andar aa ja sakein. 🚪🔗
  • Docker Compose: Ek smart tool jo multiple Docker Containers (apps) ko ek single YAML file (docker-compose.yml) mein define aur manage karne mein help karta hai. Yeh sabko ek saath start, stop, aur connect kar sakta hai.
    • Analogy: Ek badi birthday party organize karne ka Master Party Planner jo saare arrangements ek hi plan se handle karta hai. 📝🎉
  • Docker Swarm: Docker ka apna native orchestration tool jo multiple Docker hosts (computers) ko ek single virtual host mein group karta hai. Isse aap apps ko bade पैमाने par chala sakte ho, load distribute kar sakte ho, aur apps ko hamesha chalta rehne mein madad karta hai.
    • Analogy: Multiple computers ki Super Team Manager jo sabko milakar kaam karwati hai. 🦸‍♀️
  • Docker Service: Docker Swarm mein chalne wali ek app ya task. Aap ismein define karte ho ki aapko is app ki kitne copies (replicas) chahiye aur woh kaise run karegi.
    • Analogy: Team Leader द्वारा दिया गया Project Assignment ("Mujhe game ke 3 copies chalane hain"). 📋
  • Docker Stack: Multiple Services (aur unke associated Networks aur Volumes) ka collection jo ek docker-compose.yml file mein define hota hai aur Docker Swarm par deploy kiya jaata hai. Yeh poore project ko ek unit ki tarah handle karta hai.
    • Analogy: Poora Complete Project Plan jismein saare Project Assignments (Services) hote hain aur sab ek doosre se connected hote hain. 📚
  • Local Registry: Aapke apne network ya computer par chalne wali ek private Docker Image repository. Yahan aap apni secret ya frequently used images ko store kar sakte ho.
    • Analogy: Aapki Apni Khud Ki Private Library ya personal app store. 🏠
  • docker cp: Host PC aur running Container ke beech files aur folders ko copy karne ka command. Isse aap Magic Box ke andar aur bahar files transfer kar sakte ho.
    • Analogy: Simple Copy-Paste command, jaisa aap computer par karte ho. ↔️
  • Proxy: Ek server jo aapke computer aur internet ke beech ek intermediate link ki tarah kaam karta hai. Internet Gatekeeper ki tarah yeh requests ko filter ya forward karta hai.
    • Analogy: Internet access karne ke liye Gatekeeper. 🛡️
  • daemon.json: Docker Daemon ki configuration settings ko store karne wali file. Ismein aap proxy, registry, aur DNS jaise advanced settings set kar sakte ho.
    • Analogy: Docker Manager ki Secret Settings Book. 📖

🚀 Summary & Aage Kya Karein? (Aur Tips)

Kya Seekha Humne? 🤔

Wah! Aapne Docker ke baare mein ab aur bhi gehraai mein seekh liya hai! Aapne jaana ki:

  • Docker Engine kaise kaam karta hai, aur Docker Hub kitni badi library hai.
  • Image aur Container ka difference itne simple tarike se samjha, aur unki layers bhi dekhi.
  • Apni pehli Python web app ko Magic Box (Container) mein pack karke internet par kaise dikhaya.
  • Volumes aur Bind Mounts ka use karke data ko permanent kaise save karte hain, aur live changes kaise dekhte hain.
  • Docker Compose se WordPress aur MySQL jaise multiple apps ko ek Party Plan (docker-compose.yml) se ek saath kaise chalate hain.
  • Docker Swarm aur Stack se badi teams aur projects ko manage karna seekha, aur self-healing ki amazing power bhi dekhi, PlayWithDocker par.
  • Local Registry banakar apni private app library kaise maintain karte hain, images ko tag, push, pull, aur delete karna bhi seekha.
  • docker cp command ka use karke files ko Host aur Container ke beech kaise transfer karte hain.
  • C++ jaise complex build environments ko bhi Linux aur Windows par Docker mein kaise set karte hain.
  • Docker ki advanced settings jaise Proxy aur Registry ko daemon.json file se kaise configure karte hain.
  • Aur haan, har step par complete code snippets aur simple Hinglish comments ke saath! 🎉

Aage Kya Karein? 💡

Learning kabhi khatm nahi hoti! Ab jab aapne Docker ke basics itne acche se samajh liye hain, toh aap yeh kar sakte hain hain:

  1. Practice, Practice, Practice! 🧑‍💻
    • Upar diye gaye saare Labs ko apne computer par khud se ek-ek step follow karke dekho. Jab tak khud se nahi karoge, confidence nahi aayega.
    • Alag-alag images ko Docker Hub par search karo (jaise mongodb, redis, nginx) aur unko docker pull aur docker run karke dekho.
  2. Apni Choti Apps Banao: 🚀
    • Ek choti si Python, Node.js, ya Java app banao. Uske liye apna khud ka Dockerfile likho. Usse image banao aur container chalao. Try to add a simple database like SQLite inside it and use a volume.
  3. Docker Compose Files Explore Karo: 📚
    • GitHub par "docker-compose examples" search karo. Bahut saare ready-made examples milenge jismein complex applications (jaise blogging platforms, chat apps) ko compose se deploy kiya hota hai. Unko download karke docker-compose up -d karke dekho.
  4. Networking Ko Deeply Samjho: 🕸️
    • Docker ke networking concepts (Bridge, Host, Overlay networks, DNS resolution within Docker) aur advanced hain, unke baare mein aur padho.
  5. Kubernetes Ke Baare Mein Jaano: 💡
    • Docker Swarm ek orchestration tool hai, lekin industry mein Kubernetes (Kubernetes is pronounced "Koo-ber-net-eez") bahut popular hai. Jab aap Docker mein comfortable ho jao, toh Kubernetes explore karna. Yeh aur bhi bade projects ke liye use hota hai.
  6. Docker Community Se Judho: 💬
    • Online forums, YouTube channels, aur blogs dekho jahan log Docker ke baare mein discuss karte hain. Questions पूछो और आंसर दो!

Mujhe ummeed hai ki yeh ebook aapko Docker ki duniya mein ek bahut hi solid shuruaat dene mein madad karega. Yaad rakhna, har bade software engineer ya scientist ne kabhi na kabhi aise hi chote steps se shuruat ki thi. Har naya concept ek nayi puzzle jaisa hai, aur har puzzle ko solve karne mein mazaa aata hai! Keep learning, keep exploring!

All the best, mere young tech explorers! Aap future ke builders ho! 💪😊

Thank you for reading! 🙏