DEV Community

Cover image for Docker Hands-On: Image থেকে Container, তারপর নিজের Custom Image
Ragib Hasan
Ragib Hasan Subscriber

Posted on

Docker Hands-On: Image থেকে Container, তারপর নিজের Custom Image

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
Enter fullscreen mode Exit fullscreen mode

এটি 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
Enter fullscreen mode Exit fullscreen mode

একটি 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
Enter fullscreen mode Exit fullscreen mode

এই command local image cache-এর imageগুলো দেখায়।

সাধারণত এখানে আমরা দেখতে পারি:

REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
ubuntu        24.04     ........       ...           101MB
Enter fullscreen mode Exit fullscreen mode

এখানে গুরুত্বপূর্ণ কয়েকটি field:

  • REPOSITORY → image-এর নাম
  • TAG → version/variant
  • IMAGE ID → image-এর unique identifier
  • CREATED → image কখন তৈরি হয়েছে
  • SIZE → image-এর size

যেমন:

ubuntu:24.04
Enter fullscreen mode Exit fullscreen mode

এখানে:

ubuntu     → Repository
24.04      → Tag
Enter fullscreen mode Exit fullscreen mode

docker images local cache-এ থাকা imageগুলো দেখতে ব্যবহৃত হয়।


2. Docker Hub থেকে Image Pull করা

যদি local machine-এ ubuntu:24.04 না থাকে, তাহলে Docker Hub থেকে image pull করা যায়:

docker pull ubuntu:24.04
Enter fullscreen mode Exit fullscreen mode

এখানে Docker remote registry থেকে image-এর প্রয়োজনীয় layers download করে local machine-এ store করে।

তারপর আবার:

docker images
Enter fullscreen mode Exit fullscreen mode

চালালে 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
Enter fullscreen mode Exit fullscreen mode

কিন্তু যদি কোনো existing container এই image-এর সঙ্গে associated থাকে, Docker image remove করতে বাধা দিতে পারে।

সেক্ষেত্রে force removal:

docker rmi -f ubuntu:24.04
Enter fullscreen mode Exit fullscreen mode

তবে production environment-এ -f blindly ব্যবহার না করাই ভালো। আগে বুঝতে হবে কোন container বা resource-এর সঙ্গে image-এর dependency রয়েছে।


4. Image থেকে Container তৈরি করা

এখন আসি Docker-এর সবচেয়ে গুরুত্বপূর্ণ command-এ:

docker run
Enter fullscreen mode Exit fullscreen mode

সহজভাবে:

docker run ubuntu:24.04
Enter fullscreen mode Exit fullscreen mode

এখানে Docker ubuntu:24.04 image ব্যবহার করে একটি নতুন container তৈরি করে এবং সেটিতে specified/default process চালানোর চেষ্টা করে।

কিন্তু interactive shell নিয়ে কাজ করতে চাইলে আমরা সাধারণত ব্যবহার করব:

docker run -it ubuntu:24.04 bash
Enter fullscreen mode Exit fullscreen mode

এই command-টিকে ভেঙে দেখি।

docker run
    ↓
-it
    ↓
ubuntu:24.04
    ↓
bash
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

-i → Interactive / STDIN

-i container-এর standard input stream open রাখে।

অর্থাৎ container যেন input গ্রহণ করতে পারে।

docker run -i ubuntu:24.04 bash
Enter fullscreen mode Exit fullscreen mode

এখানে 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
Enter fullscreen mode Exit fullscreen mode

অর্থাৎ:

-i → Input open
-t → Terminal interface
Enter fullscreen mode Exit fullscreen mode

দুটো একসঙ্গে:

-it → Interactive terminal session
Enter fullscreen mode Exit fullscreen mode

এই breakdown-টি Docker-এর interactive usage বোঝার জন্য অত্যন্ত গুরুত্বপূর্ণ।


6. Container-এর ভিতরে কী হচ্ছে?

Container-এর ভিতরে ঢোকার পর আমরা সাধারণ Linux command ব্যবহার করতে পারি:

pwd
ls
cd /bin
ls
Enter fullscreen mode Exit fullscreen mode

এখানে গুরুত্বপূর্ণ বিষয় হলো:

আমরা Docker-এর কোনো magical command ব্যবহার করছি না।

আমরা আসলে container-এর filesystem-এর ভিতরে একটি process—এই ক্ষেত্রে bash—এর মাধ্যমে Linux environment-এর সঙ্গে interact করছি।

এই কারণেই Linux fundamentals জানা থাকলে Docker অনেক সহজ হয়ে যায়।


7. Running Container দেখতে docker ps

একটি container চালু থাকা অবস্থায়:

docker ps
Enter fullscreen mode Exit fullscreen mode

চালালে running containers দেখা যাবে।

Output-এ সাধারণত দেখা যায়:

CONTAINER ID
IMAGE
COMMAND
CREATED
STATUS
PORTS
NAMES
Enter fullscreen mode Exit fullscreen mode

অর্থাৎ Docker শুধু container ID দেখাচ্ছে না; container কোন image ব্যবহার করছে, কোন command চালাচ্ছে, কখন তৈরি হয়েছে, status কী এবং তার নাম কী—এসব information-ও দেখায়।


8. Running + Stopped সব Container দেখতে

শুধু running container দেখতে:

docker ps
Enter fullscreen mode Exit fullscreen mode

কিন্তু stopped বা exited container-সহ সব দেখতে:

docker ps -a
Enter fullscreen mode Exit fullscreen mode

এটি খুব গুরুত্বপূর্ণ distinction।

docker ps
    ↓
Running containers

docker ps -a
    ↓
Running + Stopped/Exited containers
Enter fullscreen mode Exit fullscreen mode

9. একটি Image থেকে Multiple Containers

এখানে Docker-এর একটি সুন্দর property দেখা যায়।

আমাদের কাছে যদি থাকে:

ubuntu:24.04
Enter fullscreen mode Exit fullscreen mode

তাহলে আমরা করতে পারি:

docker run -it ubuntu:24.04 bash
Enter fullscreen mode Exit fullscreen mode

তারপর আবার:

docker run -it ubuntu:24.04 sh
Enter fullscreen mode Exit fullscreen mode

আবার:

docker run -it ubuntu:24.04 bash
Enter fullscreen mode Exit fullscreen mode

ফলে একই image থেকে তিনটি আলাদা container তৈরি হতে পারে।

Conceptually:

                ubuntu:24.04
                      │
        ┌─────────────┼─────────────┐
        ↓             ↓             ↓
   Container 1   Container 2   Container 3
      bash           sh            bash
Enter fullscreen mode Exit fullscreen mode

Image একটি template; container হলো সেই template-এর runtime instance।

এটি Docker-এর mental model-এর অন্যতম গুরুত্বপূর্ণ অংশ।


10. Container-এর Random Name কেন আসে?

Docker যখন আমরা manually কোনো name না দিই, তখন container-এর জন্য একটি automatically generated name দিতে পারে।

যেমন:

hardcore_goldstine
Enter fullscreen mode Exit fullscreen mode

সমস্যা হলো, এমন নাম মনে রাখা সবসময় সহজ নয়।

তাই আমরা নিজের meaningful name দিতে পারি।

docker run --name my_ubuntu -it ubuntu:24.04 bash
Enter fullscreen mode Exit fullscreen mode

এখন container-এর নাম:

my_ubuntu
Enter fullscreen mode Exit fullscreen mode

এটি পরে container access এবং management অনেক সহজ করে দেয়।


11. Running Container-এর ভিতরে docker exec

ধরুন একটি container already running:

my_ubuntu
Enter fullscreen mode Exit fullscreen mode

অন্য একটি terminal থেকে সেই running container-এর ভিতরে নতুন interactive shell খুলতে পারি:

docker exec -it my_ubuntu bash
Enter fullscreen mode Exit fullscreen mode

এখানে:

docker exec
      ↓
existing container
      ↓
bash
Enter fullscreen mode Exit fullscreen mode

অর্থাৎ নতুন container তৈরি হচ্ছে না।

Already running container-এর ভিতরে একটি নতুন process execute হচ্ছে।

এটি docker run এবং docker exec-এর মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য।

docker run
→ নতুন container তৈরি করে

docker exec
→ existing running container-এর ভিতরে command চালায়
Enter fullscreen mode Exit fullscreen mode

12. Container-এর ভিতরের State

ধরুন আমরা my_ubuntu container-এর ভিতরে:

mkdir /app
cd /app
touch myfile.txt
Enter fullscreen mode Exit fullscreen mode

এখন অন্য terminal থেকে:

docker exec -it my_ubuntu bash
Enter fullscreen mode Exit fullscreen mode

দিয়ে একই container-এ ঢুকলে:

ls /app
Enter fullscreen mode Exit fullscreen mode

আমরা দেখতে পাব:

myfile.txt
Enter fullscreen mode Exit fullscreen mode

কারণ দুই 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
Enter fullscreen mode Exit fullscreen mode

তারপর তৈরি করি:

Dockerfile
Enter fullscreen mode Exit fullscreen mode

খেয়াল করুন:

Dockerfile
Enter fullscreen mode Exit fullscreen mode

নামটি সাধারণত এই exact convention-এই রাখা হয়।


14. একটি Simple Dockerfile

আমাদের প্রথম Dockerfile:

FROM ubuntu:24.04

RUN echo "Hello World" > /hello.txt

CMD ["bash"]
Enter fullscreen mode Exit fullscreen mode

এখন প্রতিটি instruction বুঝি।


FROM

FROM ubuntu:24.04
Enter fullscreen mode Exit fullscreen mode

এটি আমাদের base image নির্ধারণ করে।

অর্থাৎ:

এই custom image-এর foundation হবে ubuntu:24.04


RUN

RUN echo "Hello World" > /hello.txt
Enter fullscreen mode Exit fullscreen mode

Image build হওয়ার সময় এই command execute হবে।

ফলে image-এর filesystem-এর মধ্যে:

/hello.txt
Enter fullscreen mode Exit fullscreen mode

নামে একটি file তৈরি হবে।

File-এর content:

Hello World
Enter fullscreen mode Exit fullscreen mode

CMD

CMD ["bash"]
Enter fullscreen mode Exit fullscreen mode

Container start হওয়ার সময় default command হিসেবে bash ব্যবহার করার নির্দেশ দেয়।

সহজভাবে:

FROM
 ↓
Base image

RUN
 ↓
Build-time operation

CMD
 ↓
Default runtime command
Enter fullscreen mode Exit fullscreen mode

Dockerfile-এর এই basic structure পরবর্তীতে আরও advanced Docker configuration বোঝার foundation তৈরি করে।


15. Dockerfile থেকে Image Build করা

এখন Dockerfile যে directory-তে আছে সেখানে:

docker build -t custom_ubuntu .
Enter fullscreen mode Exit fullscreen mode

এই command-এর তিনটি গুরুত্বপূর্ণ অংশ:

docker build
     ↓
-t custom_ubuntu
     ↓
.
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

চালালে আমরা দেখতে পাব:

custom_ubuntu    latest    ........    101MB
Enter fullscreen mode Exit fullscreen mode

এখানে আমরা কোনো explicit tag না দিলে Docker সাধারণত:

latest
Enter fullscreen mode Exit fullscreen mode

tag ব্যবহার করে।

অর্থাৎ:

custom_ubuntu
Enter fullscreen mode Exit fullscreen mode

প্রকৃতপক্ষে:

custom_ubuntu:latest
Enter fullscreen mode Exit fullscreen mode

হিসেবে দেখা যেতে পারে।


17. এবার নিজের Image Run করি

আমাদের custom image এখন ready।

চালাই:

docker run -it custom_ubuntu bash
Enter fullscreen mode Exit fullscreen mode

Container-এর ভিতরে:

ls /
Enter fullscreen mode Exit fullscreen mode

দিলে আমরা দেখতে পাব:

hello.txt
Enter fullscreen mode Exit fullscreen mode

তারপর:

cat /hello.txt
Enter fullscreen mode Exit fullscreen mode

Output:

Hello World
Enter fullscreen mode Exit fullscreen mode

এখানেই Dockerfile-এর power স্পষ্ট হয়।

আমরা manually container-এর ভিতরে file তৈরি করিনি।

Image build করার সময় Dockerfile-এর:

RUN echo "Hello World" > /hello.txt
Enter fullscreen mode Exit fullscreen mode

instruction file-টি image-এর filesystem-এ তৈরি করে দিয়েছে।


Docker-এর পুরো Flow এক নজরে

এখন পুরো বিষয়টাকে একটি flow হিসেবে দেখি:

                 Docker Hub
                     │
                     │ docker pull
                     ▼
              Local Image Cache
                     │
                     │ docker run
                     ▼
                 Container
                     │
                     │ command/process
                     ▼
                   bash
Enter fullscreen mode Exit fullscreen mode

আর custom image-এর ক্ষেত্রে:

             Dockerfile
                  │
                  │ docker build
                  ▼
            Custom Image
                  │
                  │ docker run
                  ▼
              Container
                  │
                  ▼
            Application
Enter fullscreen mode Exit fullscreen mode

এই দুইটি 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
Enter fullscreen mode Exit fullscreen mode

2. docker pulldocker run

docker pull
→ Image local machine-এ আনে

docker run
→ Image থেকে container তৈরি ও start করে
Enter fullscreen mode Exit fullscreen mode

3. docker rundocker exec

docker run
→ New container

docker exec
→ Existing running container-এর ভিতরে নতুন process
Enter fullscreen mode Exit fullscreen mode

4. docker psdocker ps -a

docker ps
→ Running

docker ps -a
→ Running + Exited
Enter fullscreen mode Exit fullscreen mode

5. -i-t

-i → STDIN open
-t → Pseudo-TTY
-it → Interactive terminal experience
Enter fullscreen mode Exit fullscreen mode

শেষ কথা: 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
Enter fullscreen mode Exit fullscreen mode

বা

docker build
Enter fullscreen mode Exit fullscreen mode

মনে রাখা নয়।

বরং বোঝা:

একটি 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)