Docker শেখার সময় সবচেয়ে বড় সমস্যা Docker-এর command মনে রাখা নয়—বরং Docker আসলে কী করছে সেটা বোঝা।
docker run, docker pull, docker ps, docker exec, docker build—এই commandগুলো আলাদা আলাদা করে মুখস্থ করলে Docker কিছুদিন পরেই confusing মনে হতে পারে।
কিন্তু যদি আমরা একটি simple mental model তৈরি করি—
Image → Container → Process
তাহলে Docker-এর অনেক কিছুই surprisingly সহজ হয়ে যায়।
এই লেখায় আমরা একদম hands-on approach-এ দেখব কীভাবে Docker Hub থেকে একটি Ubuntu image local machine-এ আনা যায়, সেটি থেকে একাধিক container তৈরি করা যায়, container-এর সঙ্গে interactiveভাবে কাজ করা যায় এবং শেষে একটি Dockerfile ব্যবহার করে নিজের custom Docker image তৈরি করা যায়।
Docker শুরু করার আগে: Image আর Container-এর পার্থক্য
প্রথমে সবচেয়ে গুরুত্বপূর্ণ distinction:
Docker Image কী?
একটি Docker Image হলো একটি read-only template/package, যার মধ্যে application চালানোর জন্য প্রয়োজনীয় filesystem, libraries, configuration এবং অন্যান্য প্রয়োজনীয় উপাদান থাকে।
উদাহরণ:
ubuntu:24.04
এটি Ubuntu 24.04-এর একটি Docker image।
Docker Hub-এর মতো registry থেকে image local machine-এ pull করা যায়। তারপর সেই image ব্যবহার করে container তৈরি করা যায়।
Container কী?
Container হলো সেই image-এর running বা instantiated form।
অর্থাৎ—
Docker Image
↓
Container
↓
Process / Command
একটি image থেকে একাধিক independent container তৈরি করা সম্ভব। একই ubuntu:24.04 image ব্যবহার করে একাধিক container চালানো যায়, এবং প্রতিটি container-এর নিজস্ব runtime state থাকে।
এটাই Docker-এর একটি fundamental concept।
1. Local Machine-এ কোন Image আছে?
প্রথমে দেখি আমাদের Docker environment-এ কোন কোন image already available।
docker images
এই command local image cache-এর imageগুলো দেখায়।
সাধারণত এখানে আমরা দেখতে পারি:
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 24.04 ........ ... 101MB
এখানে গুরুত্বপূর্ণ কয়েকটি field:
- REPOSITORY → image-এর নাম
- TAG → version/variant
- IMAGE ID → image-এর unique identifier
- CREATED → image কখন তৈরি হয়েছে
- SIZE → image-এর size
যেমন:
ubuntu:24.04
এখানে:
ubuntu → Repository
24.04 → Tag
docker images local cache-এ থাকা imageগুলো দেখতে ব্যবহৃত হয়।
2. Docker Hub থেকে Image Pull করা
যদি local machine-এ ubuntu:24.04 না থাকে, তাহলে Docker Hub থেকে image pull করা যায়:
docker pull ubuntu:24.04
এখানে Docker remote registry থেকে image-এর প্রয়োজনীয় layers download করে local machine-এ store করে।
তারপর আবার:
docker images
চালালে image-টি local cache-এ দেখতে পাব।
এখানে একটি গুরুত্বপূর্ণ বিষয় আছে:
docker pullমূলত image-কে local environment-এ এনে রাখে; এটি নিজে থেকে interactive container তৈরি করে না।
Docker image layer-based হওয়ায় কোনো কোনো layer আগে থেকেই local machine-এ থাকলে Docker সেগুলো আবার download না করে reuse করতে পারে।
3. Image Remove করা
ধরুন local machine থেকে ubuntu:24.04 remove করতে চাই।
docker rmi ubuntu:24.04
কিন্তু যদি কোনো existing container এই image-এর সঙ্গে associated থাকে, Docker image remove করতে বাধা দিতে পারে।
সেক্ষেত্রে force removal:
docker rmi -f ubuntu:24.04
তবে production environment-এ -f blindly ব্যবহার না করাই ভালো। আগে বুঝতে হবে কোন container বা resource-এর সঙ্গে image-এর dependency রয়েছে।
4. Image থেকে Container তৈরি করা
এখন আসি Docker-এর সবচেয়ে গুরুত্বপূর্ণ command-এ:
docker run
সহজভাবে:
docker run ubuntu:24.04
এখানে Docker ubuntu:24.04 image ব্যবহার করে একটি নতুন container তৈরি করে এবং সেটিতে specified/default process চালানোর চেষ্টা করে।
কিন্তু interactive shell নিয়ে কাজ করতে চাইলে আমরা সাধারণত ব্যবহার করব:
docker run -it ubuntu:24.04 bash
এই command-টিকে ভেঙে দেখি।
docker run
↓
-it
↓
ubuntu:24.04
↓
bash
docker run
Container create এবং start করার মূল command।
ubuntu:24.04
যে image থেকে container তৈরি হবে।
bash
Container-এর ভিতরে যে command/process চালানো হবে।
-it
Interactive terminal session-এর জন্য প্রয়োজনীয় দুইটি option-এর combination।
5. -it আসলে কী?
Docker শেখার সময় -it সবচেয়ে বেশি দেখা যায়।
এটি দুটি flag-এর combination:
-i
-t
-i → Interactive / STDIN
-i container-এর standard input stream open রাখে।
অর্থাৎ container যেন input গ্রহণ করতে পারে।
docker run -i ubuntu:24.04 bash
এখানে input দেওয়া সম্ভব হলেও terminal experience সম্পূর্ণ normal terminal-এর মতো নাও হতে পারে।
-t → Pseudo-TTY
-t একটি pseudo-terminal allocate করে।
এর ফলে shell-এর terminal-style interface পাওয়া যায়।
কিন্তু শুধু -t দিলে interactive keyboard input-এর জন্য STDIN open নাও থাকতে পারে।
তাই আমরা সাধারণত ব্যবহার করি:
docker run -it ubuntu:24.04 bash
অর্থাৎ:
-i → Input open
-t → Terminal interface
দুটো একসঙ্গে:
-it → Interactive terminal session
এই breakdown-টি Docker-এর interactive usage বোঝার জন্য অত্যন্ত গুরুত্বপূর্ণ।
6. Container-এর ভিতরে কী হচ্ছে?
Container-এর ভিতরে ঢোকার পর আমরা সাধারণ Linux command ব্যবহার করতে পারি:
pwd
ls
cd /bin
ls
এখানে গুরুত্বপূর্ণ বিষয় হলো:
আমরা Docker-এর কোনো magical command ব্যবহার করছি না।
আমরা আসলে container-এর filesystem-এর ভিতরে একটি process—এই ক্ষেত্রে bash—এর মাধ্যমে Linux environment-এর সঙ্গে interact করছি।
এই কারণেই Linux fundamentals জানা থাকলে Docker অনেক সহজ হয়ে যায়।
7. Running Container দেখতে docker ps
একটি container চালু থাকা অবস্থায়:
docker ps
চালালে running containers দেখা যাবে।
Output-এ সাধারণত দেখা যায়:
CONTAINER ID
IMAGE
COMMAND
CREATED
STATUS
PORTS
NAMES
অর্থাৎ Docker শুধু container ID দেখাচ্ছে না; container কোন image ব্যবহার করছে, কোন command চালাচ্ছে, কখন তৈরি হয়েছে, status কী এবং তার নাম কী—এসব information-ও দেখায়।
8. Running + Stopped সব Container দেখতে
শুধু running container দেখতে:
docker ps
কিন্তু stopped বা exited container-সহ সব দেখতে:
docker ps -a
এটি খুব গুরুত্বপূর্ণ distinction।
docker ps
↓
Running containers
docker ps -a
↓
Running + Stopped/Exited containers
9. একটি Image থেকে Multiple Containers
এখানে Docker-এর একটি সুন্দর property দেখা যায়।
আমাদের কাছে যদি থাকে:
ubuntu:24.04
তাহলে আমরা করতে পারি:
docker run -it ubuntu:24.04 bash
তারপর আবার:
docker run -it ubuntu:24.04 sh
আবার:
docker run -it ubuntu:24.04 bash
ফলে একই image থেকে তিনটি আলাদা container তৈরি হতে পারে।
Conceptually:
ubuntu:24.04
│
┌─────────────┼─────────────┐
↓ ↓ ↓
Container 1 Container 2 Container 3
bash sh bash
Image একটি template; container হলো সেই template-এর runtime instance।
এটি Docker-এর mental model-এর অন্যতম গুরুত্বপূর্ণ অংশ।
10. Container-এর Random Name কেন আসে?
Docker যখন আমরা manually কোনো name না দিই, তখন container-এর জন্য একটি automatically generated name দিতে পারে।
যেমন:
hardcore_goldstine
সমস্যা হলো, এমন নাম মনে রাখা সবসময় সহজ নয়।
তাই আমরা নিজের meaningful name দিতে পারি।
docker run --name my_ubuntu -it ubuntu:24.04 bash
এখন container-এর নাম:
my_ubuntu
এটি পরে container access এবং management অনেক সহজ করে দেয়।
11. Running Container-এর ভিতরে docker exec
ধরুন একটি container already running:
my_ubuntu
অন্য একটি terminal থেকে সেই running container-এর ভিতরে নতুন interactive shell খুলতে পারি:
docker exec -it my_ubuntu bash
এখানে:
docker exec
↓
existing container
↓
bash
অর্থাৎ নতুন container তৈরি হচ্ছে না।
Already running container-এর ভিতরে একটি নতুন process execute হচ্ছে।
এটি docker run এবং docker exec-এর মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য।
docker run
→ নতুন container তৈরি করে
docker exec
→ existing running container-এর ভিতরে command চালায়
12. Container-এর ভিতরের State
ধরুন আমরা my_ubuntu container-এর ভিতরে:
mkdir /app
cd /app
touch myfile.txt
এখন অন্য terminal থেকে:
docker exec -it my_ubuntu bash
দিয়ে একই container-এ ঢুকলে:
ls /app
আমরা দেখতে পাব:
myfile.txt
কারণ দুই terminal আলাদা হলেও তারা একই container-এর filesystem-এর সঙ্গে কাজ করছে।
এটি docker exec বোঝার জন্য একটি অত্যন্ত কার্যকর hands-on example।
13. এবার নিজের Docker Image বানানো যাক
এখন পর্যন্ত আমরা existing image ব্যবহার করেছি।
কিন্তু real-world development-এ আমাদের প্রায়ই নিজের application-এর জন্য custom image তৈরি করতে হয়।
সেখানেই আসে:
Dockerfile
একটি নতুন directory তৈরি করি:
mkdir docker-tutorial
cd docker-tutorial
তারপর তৈরি করি:
Dockerfile
খেয়াল করুন:
Dockerfile
নামটি সাধারণত এই exact convention-এই রাখা হয়।
14. একটি Simple Dockerfile
আমাদের প্রথম Dockerfile:
FROM ubuntu:24.04
RUN echo "Hello World" > /hello.txt
CMD ["bash"]
এখন প্রতিটি instruction বুঝি।
FROM
FROM ubuntu:24.04
এটি আমাদের base image নির্ধারণ করে।
অর্থাৎ:
এই custom image-এর foundation হবে
ubuntu:24.04।
RUN
RUN echo "Hello World" > /hello.txt
Image build হওয়ার সময় এই command execute হবে।
ফলে image-এর filesystem-এর মধ্যে:
/hello.txt
নামে একটি file তৈরি হবে।
File-এর content:
Hello World
CMD
CMD ["bash"]
Container start হওয়ার সময় default command হিসেবে bash ব্যবহার করার নির্দেশ দেয়।
সহজভাবে:
FROM
↓
Base image
RUN
↓
Build-time operation
CMD
↓
Default runtime command
Dockerfile-এর এই basic structure পরবর্তীতে আরও advanced Docker configuration বোঝার foundation তৈরি করে।
15. Dockerfile থেকে Image Build করা
এখন Dockerfile যে directory-তে আছে সেখানে:
docker build -t custom_ubuntu .
এই command-এর তিনটি গুরুত্বপূর্ণ অংশ:
docker build
↓
-t custom_ubuntu
↓
.
docker build
Dockerfile-এর instructions অনুসরণ করে একটি নতুন image তৈরি করবে।
-t custom_ubuntu
Image-কে একটি meaningful name/tag দেয়।
.
বর্তমান directory-কে build context হিসেবে নির্দেশ করে।
অর্থাৎ Docker বর্তমান directory থেকে Dockerfile এবং প্রয়োজনীয় build context ব্যবহার করবে।
16. Build শেষ হলে কী হলো?
Build সফল হলে:
docker images
চালালে আমরা দেখতে পাব:
custom_ubuntu latest ........ 101MB
এখানে আমরা কোনো explicit tag না দিলে Docker সাধারণত:
latest
tag ব্যবহার করে।
অর্থাৎ:
custom_ubuntu
প্রকৃতপক্ষে:
custom_ubuntu:latest
হিসেবে দেখা যেতে পারে।
17. এবার নিজের Image Run করি
আমাদের custom image এখন ready।
চালাই:
docker run -it custom_ubuntu bash
Container-এর ভিতরে:
ls /
দিলে আমরা দেখতে পাব:
hello.txt
তারপর:
cat /hello.txt
Output:
Hello World
এখানেই Dockerfile-এর power স্পষ্ট হয়।
আমরা manually container-এর ভিতরে file তৈরি করিনি।
Image build করার সময় Dockerfile-এর:
RUN echo "Hello World" > /hello.txt
instruction file-টি image-এর filesystem-এ তৈরি করে দিয়েছে।
Docker-এর পুরো Flow এক নজরে
এখন পুরো বিষয়টাকে একটি flow হিসেবে দেখি:
Docker Hub
│
│ docker pull
▼
Local Image Cache
│
│ docker run
▼
Container
│
│ command/process
▼
bash
আর custom image-এর ক্ষেত্রে:
Dockerfile
│
│ docker build
▼
Custom Image
│
│ docker run
▼
Container
│
▼
Application
এই দুইটি flow বুঝতে পারলে Docker-এর অনেক command আর isolated command মনে হবে না।
সবচেয়ে গুরুত্বপূর্ণ Docker Commands
এই hands-on session-এর commandগুলো এক জায়গায়:
| Command | কাজ |
|---|---|
docker images |
Local images দেখা |
docker pull ubuntu:24.04 |
Docker Hub থেকে image pull করা |
docker rmi ubuntu:24.04 |
Image remove করা |
docker rmi -f ubuntu:24.04 |
Force করে image remove করা |
docker ps |
Running containers দেখা |
docker ps -a |
সব containers দেখা |
docker run -it ubuntu:24.04 bash |
Interactive Ubuntu container চালানো |
docker run --name my_ubuntu -it ubuntu:24.04 bash |
Custom name দিয়ে container চালানো |
docker exec -it my_ubuntu bash |
Running container-এর ভিতরে shell চালানো |
docker build -t custom_ubuntu . |
Dockerfile থেকে custom image build করা |
এই command reference-টির ভিত্তি দেওয়া hands-on notes-এও একইভাবে সংগঠিত হয়েছে।
কয়েকটি গুরুত্বপূর্ণ Mental Model
Docker শেখার সময় শুধু command মনে না রেখে এই কয়েকটি relationship মাথায় রাখা বেশি গুরুত্বপূর্ণ।
1. Image ≠ Container
Image → Template
Container → Runtime Instance
2. docker pull ≠ docker run
docker pull
→ Image local machine-এ আনে
docker run
→ Image থেকে container তৈরি ও start করে
3. docker run ≠ docker exec
docker run
→ New container
docker exec
→ Existing running container-এর ভিতরে নতুন process
4. docker ps ≠ docker ps -a
docker ps
→ Running
docker ps -a
→ Running + Exited
5. -i ≠ -t
-i → STDIN open
-t → Pseudo-TTY
-it → Interactive terminal experience
শেষ কথা: Docker কেন শুরুতে কঠিন মনে হয়?
Docker-এর command খুব বেশি কঠিন নয়।
কঠিন হয় যখন আমরা Docker-কে isolated technology হিসেবে শেখার চেষ্টা করি।
যদি Linux filesystem, process, shell, standard input/output, terminal, networking এবং basic operating-system concepts সম্পর্কে ধারণা থাকে, তাহলে Docker-এর behaviour অনেক বেশি logical মনে হয়।
এই hands-on journey-তে তাই সবচেয়ে গুরুত্বপূর্ণ lesson শুধু:
docker run
বা
docker build
মনে রাখা নয়।
বরং বোঝা:
একটি image কীভাবে container-এ পরিণত হয়, container-এর ভিতরে process কীভাবে চলে, এবং Dockerfile কীভাবে সেই environment reproducibly তৈরি করে।
আজ আমরা Docker-এর foundation তৈরি করলাম:
Image → Container → Process → Dockerfile → Custom Image
এর পরের ধাপে এই foundation-এর ওপর দাঁড়িয়ে আরও বাস্তব বিষয়—production-grade Dockerfile, application containerization, networking, ports, volumes, এবং multi-container architecture—বোঝা অনেক সহজ হবে।
Docker আসলে কোনো জাদু নয়।
ঠিক mental model তৈরি করতে পারলে এটি একটি অত্যন্ত predictable এবং powerful tool.
Learn the model, not just the commands. 🐳
Top comments (0)