IT & Lập trình

Docker cơ bản: image, container và các lệnh thiết yếu

📚
Phần 3 trong series
Hướng dẫn Docker từ A đến Z
3/8

Sau khi đã cài Docker, đây là lúc nắm vững những lệnh bạn sẽ dùng hằng ngày. Bài viết này tập trung vào hai khái niệm trung tâm — imagecontainer — cùng vòng đời và các lệnh quản lý chúng.

Image và Container — phân biệt cho rõ

Đây là cặp khái niệm dễ nhầm nhất với người mới:

text
   IMAGE  ──(docker run)──▶  CONTAINER
  (khuôn mẫu,                (bản đang chạy,
   chỉ đọc)                   có thể start/stop/xóa)

So sánh dễ hiểu:

ImageContainer
Bản chấtKhuôn mẫu chỉ đọcPhiên bản đang chạy của image
Tương tự lập trìnhclassobject (instance)
Số lượngMột imageTạo được nhiều container từ một image
Trạng tháiTĩnh, không đổiCó vòng đời: chạy, dừng, xóa

Từ một image nginx, bạn có thể chạy nhiều container nginx cùng lúc, mỗi cái độc lập.

Làm việc với Image

Tải image về (pull)

bash
# Tải image về máy từ Docker Hub
docker pull nginx

# Tải một version cụ thể bằng tag
docker pull nginx:1.27
docker pull node:20-alpine

Tag mặc định là latest nếu bạn không chỉ định. Trong thực tế nên ghi rõ version để tránh bất ngờ.

Xem và xóa image

bash
# Liệt kê image trên máy
docker images

# Xóa một image
docker rmi nginx:1.27

# Xóa các image không còn dùng (dangling)
docker image prune

Vòng đời của Container

Một container đi qua các trạng thái sau:

text
       docker run / create
       ┌────────────┐  docker stop   ┌────────────┐
       │  RUNNING   │ ─────────────▶ │  STOPPED   │
       │ (đang chạy)│ ◀───────────── │ (đã dừng)  │
       └────────────┘  docker start  └────────────┘
              │                            │
              │         docker rm          │
              └────────────┬───────────────┘
                       REMOVED (đã xóa)

Chạy Container — lệnh docker run

docker run là lệnh bạn dùng nhiều nhất. Nó tạo và khởi động container từ một image:

bash
docker run nginx

Các tùy chọn (flag) quan trọng:

bash
docker run \
  -d \                      # detached: chạy nền
  --name my-web \           # đặt tên cho container
  -p 8080:80 \              # map cổng host:container
  -e ENV=production \       # set biến môi trường
  nginx

Giải thích từng flag:

FlagÝ nghĩa
-dChạy ở chế độ nền (detached), trả lại terminal cho bạn
--nameĐặt tên dễ nhớ thay vì ID ngẫu nhiên
-p 8080:80Cổng 8080 trên máy host → cổng 80 trong container
-eTruyền biến môi trường vào container
-itChế độ tương tác (interactive) — dùng khi cần vào shell
--rmTự xóa container khi nó dừng
-vMount volume (sẽ học ở bài sau)

Port mapping — vì sao cần -p?

Container có mạng riêng, bị cô lập với máy host. Để truy cập được service bên trong, bạn phải “mở cửa” bằng port mapping:

text
Trình duyệt ──▶ localhost:8080 ──▶ [container: port 80 / nginx]
                    (host)              (bên trong container)

Quản lý Container

Xem container

bash
# Container đang chạy
docker ps

# Tất cả container (kể cả đã dừng)
docker ps -a

Dừng, khởi động lại, xóa

bash
# Dừng container
docker stop my-web

# Khởi động lại container đã dừng
docker start my-web

# Restart (dừng rồi chạy lại)
docker restart my-web

# Xóa container (phải dừng trước, hoặc thêm -f để ép)
docker rm my-web
docker rm -f my-web

Tương tác với Container đang chạy

Xem log

bash
# Xem log của container
docker logs my-web

# Theo dõi log realtime (như tail -f)
docker logs -f my-web

Vào bên trong container (cực kỳ hữu ích)

bash
# Mở shell bên trong container đang chạy
docker exec -it my-web bash

# Nếu image không có bash, thử sh (image alpine)
docker exec -it my-web sh

Lệnh này đưa bạn vào “bên trong” container như đang SSH vào một máy — rất hữu ích để debug.

Chạy một lệnh đơn lẻ

bash
# Xem nội dung thư mục bên trong container
docker exec my-web ls /usr/share/nginx/html

# Xem các process đang chạy trong container
docker exec my-web ps aux

Dọn dẹp — giải phóng dung lượng

Sau một thời gian, máy bạn sẽ đầy image và container không dùng:

bash
# Xóa tất cả container đã dừng
docker container prune

# Xóa image không dùng
docker image prune

# Dọn tổng lực: container dừng + image thừa + network + cache
docker system prune

# Dọn cả volume không dùng (cẩn thận: mất dữ liệu)
docker system prune -a --volumes

# Xem Docker đang chiếm bao nhiêu dung lượng
docker system df

Bảng lệnh thiết yếu — bỏ túi

LệnhCông dụng
docker runTạo và chạy container từ image
docker ps / docker ps -aXem container đang chạy / tất cả
docker imagesXem image trên máy
docker pullTải image từ registry
docker stop / docker startDừng / khởi động container
docker rm / docker rmiXóa container / xóa image
docker logs -fXem log realtime
docker exec -it ... bashVào shell bên trong container
docker system pruneDọn dẹp tài nguyên thừa

Ví dụ thực tế: chạy một database để dev

Ghép các lệnh lại trong một tình huống thật:

bash
# Chạy PostgreSQL cho việc phát triển
docker run -d \
  --name dev-postgres \
  -p 5432:5432 \
  -e POSTGRES_PASSWORD=secret \
  -e POSTGRES_DB=myapp \
  postgres:16

# Kiểm tra nó đang chạy
docker ps

# Xem log để chắc DB đã sẵn sàng
docker logs dev-postgres

# Vào psql bên trong container
docker exec -it dev-postgres psql -U postgres -d myapp

# Xong việc, dọn dẹp
docker rm -f dev-postgres

Chỉ vài lệnh, không cài đặt PostgreSQL trực tiếp lên máy, không để lại rác.

Tóm tắt

  • Image là khuôn mẫu chỉ đọc; container là bản đang chạy của image
  • docker run với các flag -d, --name, -p, -e là lệnh bạn dùng nhiều nhất
  • docker exec -it ... bash đưa bạn vào bên trong container để debug
  • Đừng quên docker system prune để giải phóng dung lượng định kỳ

Bài trước: ← Cài đặt Docker trên Windows, macOS, Linux

Bài tiếp theo: Dockerfile: tự đóng gói ứng dụng thành image →

Phần trước Cài đặt Docker trên Windows, macOS, Linux Phần tiếp theo Dockerfile: tự đóng gói ứng dụng thành image
NC
Nguyễn Chung
Senior Automation Test Engineer

5+ năm kinh nghiệm QA & Automation. Đam mê chia sẻ kiến thức về testing, tiếng Anh và tiếng Trung cho developer Việt.