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

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).


