Lesson 7 — Beginner
Containers & Deployment
Tumhari service laptop par chal rahi hai — ab use public URL tak le jaana hai. Wo tabhi hoga jab environment bhi saath chale. Is lesson mein application vs environment vs machine, containers aur images, Dockerfile likhna, layers aur cache, container logs se startup debugging, FastAPI ko containerize karna, cloud deploy aur production secrets dekhoge.
Containers kya hain — aur kyun
WHAT
Container tumhare app ka portable box hai — code + dependencies + fixed environment ek saath. Image uska blueprint (read-only), container blueprint se bana ek chalta hua instance. Ek image se hazaaron containers chal sakte hain.
WHEN
Jab tak laptop pe chal raha hai zarurat nahi — deploy karte hi zaroori. "Mere paas chal raha hai" khatam karne ke liye, aur CI/CD mein ek hi image dev se prod tak jaane ke liye.
WHERE
Har cloud platform containers maangta hai — Render, Fly, Railway, ECS, AKS. Tumhari FastAPI service isi pack mein public URL pe jaayegi.
Teen cheezein alag hain: application (tumhara code), environment (Python version, dependencies, env vars, OS libraries) aur machine (laptop, server, cloud VM). Local pe theek chalna sirf ye prove karta hai ki tumhara laptop sahi hai — production ki machine alag hoti hai. Container isi gap ko bridge karta hai.
Images, layers aur cache
$ docker build -t order-service:1.0 .
=> [1/5] FROM python:3.12-slim 0.8s
=> [2/5] WORKDIR /app 0.0s
=> [3/5] COPY pyproject.toml uv.lock ./ 0.1s
=> [4/5] RUN uv sync --no-dev 12.4s
=> [5/5] COPY . . 0.2s
=> naming to docker.io/library/order-service:1.0
- Har Dockerfile instruction ek layer banati hai — aur layer cache hoti hai. Usme sirf ek line badli toh wahi layer dobara banti hai, baaki purane cache se aate hain.
- Order matter karta hai: pehle dependency files + install (kam badalta hai), phir app code (aksar badalta hai). Ulti order = har code change par poora install.
- Tags do: order-service:1.0 jaisa version. Latest par kabhi rely mat karo — server pe kya chal raha hai kisi ko nahi pata.
- .dockerignore = build context ka filter — .git, .env, .venv build mein jaane se pehle hi bahar.
Dockerfile — instruction ka instruction
FROM python:3.12-slim
WORKDIR /app
# Pehle dependency files — inke badle par hi install dobara
COPY pyproject.toml uv.lock ./
RUN pip install uv && uv sync --no-dev
# Phir baaki code
COPY . .
EXPOSE 8000
CMD ["uv", "run", "uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
- FROM = base image. python:3.12-slim = chhota official image — zaroorat ke bina bloat nahi.
- WORKDIR = andar ka current directory — COPY, CMD sab yahan se chalte hain. Path confusion isi se aata hai.
- EXPOSE sirf documentation hai (kaunsa port andar chal raha hai) — host se port tabhi khulta hai jab run mein -p do.
- CMD = container start ka command. Image banana alag hai, chalana alag — doosra command de kar override bhi ho jaata hai.
FastAPI service ko chalao
# Build -> chala -> smoke test (cloud se pehle, hamesha local)
docker build -t order-service:1.0 .
docker run --rm -p 8000:8000 --env-file .env order-service:1.0
# Ab: http://localhost:8000/docs
# Env vars safely — image ke andar bake nahi, run ke waqt do
docker run --rm -p 8000:8000 -e DATABASE_URL="postgres://app@db:5432/orders" -e LOG_LEVEL=info order-service:1.0
# Debug
docker ps
docker logs -f <container-id>
docker exec -it <container-id> sh
- -p 8000:8000 = host:container. Andar app 8000 pe chalti hai, bahar tum 8000 se pahunche — dono alag hain.
- --env-file .env ya -e: secrets image ke andar kabhi mat COPY karo — wo layers mein chhap jaate hain aur docker history se nikal jaate hain.
- Local smoke test: build -> run -> curl /health. Cloud mein jaake debug karna sabse mehnga tareeqa hai.
- docker exec sh se andar jaakar dekho: env vars set hain? files hain? Python import ho raha hai?
Logs, .dockerignore aur debugging
# .dockerignore — context chhota + secrets ke andar jaane se bachav
.git
.env
.env.*
__pycache__/
.pytest_cache/
.venv/
node_modules/
# Container ka crash dekho
docker logs <container-id>
=> Traceback (most recent call last):
=> File "/app/app/main.py", line 3, in <module>
=> from app.routes import orders
=> ModuleNotFoundError: No module named "app.routes"
# matlab: COPY/WORKDIR order galat — code sahi jagah nahi pahauncha
- Logs stdout/stderr se aate hain — print() aur uvicorn logging dono docker logs mein dikhte hain. Alag log file banane ki zarurat nahi, production rule bhi wahi hai.
- Common startup failures: missing env var (KeyError), wrong import path, port mismatch (app 8000 pe, platform dusra de raha hai), dev dependency --no-dev mein chali gayi.
- .env image mein gaya toh tar/history se recover ho sakta hai — .gitignore ki tarah .dockerignore bhi zaroori hai.
- docker history image se har layer dikhti hai — isse verify karo ki koi secret layer mein toh nahi pada.
Public URL pe deploy aur production secrets
# Generic flow — platform koi bhi ho, steps same hain
docker build -t registry.example.com/team/order-service:1.0 .
docker push registry.example.com/team/order-service:1.0
# Platform par: image reference + env vars -> service chalu -> public URL
# Public URL ka smoke test (docs UI nahi, curl se)
curl -sS https://order-service.example.com/health
curl -sS -X POST https://order-service.example.com/orders -H "Content-Type: application/json" -d @order.json
# Production config alag — local .env se kabhi mat uthao:
# DATABASE_URL, API_KEY, LOG_LEVEL platform ke secrets manager/dashboard se
- Flow: image banao -> registry push -> platform ko image do -> env vars/secrets set -> health check. Code ek baar build hota hai, har environment alag config leta hai.
- Public URL aate hi pehla kaam: health endpoint + ek real POST curl se — scriptable hai, CI mein bhi chalega. Sirf homepage kholna smoke test nahi.
- Local vs production config alag: .env sirf local (gitignored), production mein platform ke secrets manager se env vars inject hote hain.
- Secret leak ho jaye toh turant rotate karo. Repo mein pada hai toh history se hatana bhi padega — prevention hi sasta hai.
Exercise
Question: Dockerfile ka har instruction kya banati hai? (ek shabd)
Question: Container ke andar chalne wale process ke logs dekhne wali command? (do shabd)
Question: Image ko chalane wali command kaunsi hai? (do shabd)
Question: Secrets ko image ke bajaye run/deploy ke waqt kaise dete hain? (do shabd)
Common mistakes
- COPY . . se .env aur .venv bhi image mein: Secrets layers mein chhap jaate hain aur image bhaari. Fix: .dockerignore pehle likho — .env, .venv, .git sab bahar.
- Dependency aur code ki layer order ulta: Har chhote code change par poora install chalega — build minutes se hours mein. Fix: dependency files + install neeche, code COPY upar.
- Port confusion: EXPOSE se port khulta nahi — sirf document hota hai. Fix: run mein -p host:container, aur app ko 0.0.0.0 par bind karo (localhost nahi).
- Cloud mein jaake debug karna: Deploy ke baad error dhoondhna mehnga aur dheema hai. Fix: local par wahi image build + run + curl smoke test, tabhi push.
Ghar ka tiffin tumhara laptop jaisa — jahan banaya, wahi waisa khaya. Restaurant chain ka standardized box = container: box (image) mein sab fixed, kisi bhi outlet pe kholo wahi khana. Recipe badalni ho toh box badlo — khana pakde jaate waqt nahi:
docker build -t kitchen/paneer-box:1.0 . # box pack hua
docker run -p 8000:8000 kitchen/paneer-box:1.0 # outlet par khola
docker push registry/kitchen/paneer-box:1.0 # dusre outlet bheja
# Wahi box, wahi khana — sirf outlet (machine) badla.- Q: Image aur container ka farq? — Image read-only blueprint, container uska chalta hua instance.
- Q: Docker layers ka cache kaise kaam karta hai aur order kyun matter karta hai? — Pehle dependency install (kam change), phir code COPY — warna cache toot-ti hai.
- Q: EXPOSE aur -p port mapping mein farq? — EXPOSE documentation hai, -p host port kholta hai.
- Q: Production secrets manage kaise karein? — Env vars platform secrets se, image/repo mein kabhi nahi; leak par rotate.
- Q: Container start hoke exit ho raha hai toh kya karoge? — docker logs, phir env, port, path ka order.
Containers aur deployment clear. Agla lesson — Capstone — mein poora L0 ek service banakar public URL pe ship karoge.