Docker-এর গোড়া: image, container ও প্রথম Dockerfile

Docker অ্যাপকে দরকারি সবকিছুসহ প্যাকেজ করে যাতে সর্বত্র একই চলে। মূল ধারণা ও প্রথমে যে কমান্ড লাগবে তা শিখুন।

অ্যাপ বহনকারী একটি shipping container

Docker একটি অ্যাপকে তার runtime, library ও সেটিংসসহ একটি ইউনিটে প্যাকেজ করে, যা ল্যাপটপ, server বা cloud-এ একইভাবে চলে। "আমার মেশিনে তো চলে" সমস্যার শেষ।

Image বনাম container

  • Image হলো read-only টেমপ্লেট: অ্যাপ, তার ফাইল ও dependency, স্তরে স্তরে বানানো।
  • Container হলো image-এর চলমান রূপ: নিজস্ব ফাইলসিস্টেম দৃশ্য, network ও সীমাসহ আলাদা করা process।

একটি image থেকে অনেক container চালানো যায়, যেমন একটি ইনস্টল করা কপি থেকে অনেক প্রোগ্রাম চলে।

Container virtual machine নয়। এরা host-এর kernel ভাগ করে, তাই সেকেন্ডে শুরু হয় ও কম memory লাগে, কিন্তু VM-এর চেয়ে বিচ্ছিন্নতা হালকা।

প্রথম Dockerfile

Dockerfile image বানানোর ধাপ তালিকা করে।

FROM node:22-slim
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
EXPOSE 3000
USER node
CMD ["node", "server.js"]
  • FROM: যে base image থেকে শুরু।
  • WORKDIR: image-এর ভেতরের কাজের folder।
  • COPY ও RUN: ফাইল যোগ ও build কমান্ড চালানো। প্রতিটি একটি layer বানায়। আগে package.json কপি করলে শুধু কোড বদলালে Docker dependency install cache থেকে নেয়।
  • EXPOSE: অ্যাপের port নথিভুক্ত করে।
  • USER node: non-root user হিসেবে চালান।
  • CMD: container শুরুর সময় যে কমান্ড চলবে।

আবর্জনা বা secret image-এ কপি এড়াতে (node_modules, .git, .env-এর জন্য) একটি .dockerignore ফাইল দিন।

প্রথমে যে কমান্ড লাগবে

docker build -t myapp:1.0 .                     # image বানানো
docker run -d --name myapp -p 8080:3000 myapp:1.0   # চালানো, 8080-কে 3000-এ map
docker ps                                       # চলমান container
docker logs -f myapp                            # log অনুসরণ
docker exec -it myapp sh                        # ভেতরে shell খোলা
docker stop myapp && docker rm myapp            # থামানো ও সরানো
docker images                                   # image-এর তালিকা

Port, environment ও volume

  • Port: -p host:container একটি port প্রকাশ করে। ব্যক্তিগত service-এ localhost-এ bind করুন: -p 127.0.0.1:5432:5432।
  • Environment: -e NAME=value বা --env-file .env সেটিংস পাঠায়। Secret image-এ বেক করবেন না।
  • Volume: container সরালে তার নিজস্ব ফাইলসিস্টেম হারিয়ে যায়। Data (database, upload) রাখতে volume mount করুন: -v mydata:/var/lib/data।

Docker Compose

কয়েকটি container (অ্যাপ, database, cache) হলে docker compose একটি compose.yaml-এ সবগুলো বর্ণনা করে এবং docker compose up -d দিয়ে চালু করে। এটি একটি private network-ও বানায় যেখানে container-রা service-এর নামে একে অপরকে পায়।

নিরাপত্তা অভ্যাস

  • ছোট, official, রক্ষণাবেক্ষিত base image ব্যবহার করুন এবং latest-এর বদলে সংস্করণ tag পিন করুন।
  • Non-root-এ চালান, আর সত্যিই দরকার না হলে --privileged ব্যবহার করবেন না।
  • যে port দরকার নেই তা প্রকাশ করবেন না। 0.0.0.0-এ খোলা database port firewall না আটকালে ইন্টারনেট থেকে পৌঁছানো যায়। Docker-এর প্রকাশিত port সাধারণ host firewall নিয়ম এড়াতে পারে, তাই service স্থানীয় হলে 127.0.0.1-এ bind করুন।
  • Image হালনাগাদ রাখুন এবং পরিচিত vulnerability-র জন্য scan করুন।
  • Dockerfile বা image layer-এ কখনো secret রাখবেন না। চালানোর সময় পাঠান।
  • দুষ্টুমি করতে পারে এমন container-এ memory ও CPU সীমা দিন।

মূল কথা: Dockerfile থেকে image বানান, তা থেকে container চালান, data volume-এ রাখুন, ব্যক্তিগত port localhost-এ bind করুন, non-root-এ চালান এবং secret image-এর বাইরে রাখুন।


Linux ও DevOps সিরিজ, পর্ব ১ (server ও container): 4 নম্বর (মোট 5)। আগের লেখা: Nginx reverse proxy ও বিনামূল্যের HTTPS (Let's Encrypt).

আরও পড়ুন

Recursion ও backtracking সহজ উদাহরণে

Recursion সমস্যার ছোট কপি সমাধান করে সমাধান করে। অনেক interview সমস্যায় ব্যবহৃত চিন্তার ধাপ ও backtracking টেমপ্লেট শিখুন।

Interview ও DSA•৩ মিনিটে পড়া