Docker Container: Quản lý vòng đời Container
Bạn có biết?
Hãy tưởng tượng bạn đang quản lý một nhà máy thu nhỏ. Nhà máy đó chính là Container — nơi mọi thứ được vận hành. Bản thiết kế để xây nhà máy? Đó là Image. Và bạn — người quản lý — cần biết cách khởi động, tạm dừng, dừng, hay thậm chí phá dỡ nhà máy khi cần.
Đó chính xác là những gì bạn làm với Docker Container. Mỗi container là một instance đang chạy của một Image — cô lập, nhẹ, và có thể quản lý hoàn toàn bằng CLI.
Vòng đời Container là gì?
Một Container trải qua nhiều trạng thái trong suốt vòng đời của nó:
Created → Running → Paused → Stopped → Removed
│ │ │ │ │
│ │ │ │ └─ docker rm
│ │ │ └─ docker stop
│ │ └─ docker pause
│ └─ docker start / docker run
└─ docker create
Hiểu rõ vòng đời giúp bạn quản lý container hiệu quả hơn — biết khi nào nên dừng, khi nào nên xóa, và khi nào cần debug.
Các lệnh cơ bản
docker run — Tạo và chạy Container
docker run là lệnh phổ biến nhất — nó tạo container mới từ image và khởi động ngay lập tức.
# Chạy container ở chế độ background
$ docker run -d --name my-nginx -p 8080:80 nginx
# Chạy interactive với terminal
$ docker run -it --name my-ubuntu ubuntu bash
# Chạy và tự xóa khi dừng (--rm)
$ docker run --rm -it alpine sh
# Truyền biến môi trường
$ docker run -d -e MYSQL_ROOT_PASSWORD=secret mysql
Các flags quan trọng:
- -d: Chạy background (detached mode)
- -it: Interactive + TTY (để nhập lệnh trong container)
- –name: Đặt tên cho container
- -p: Map port (host:container)
- -e: Set biến môi trường
- –rm: Tự động xóa container khi dừng
docker ps — Xem Container đang chạy
# Xem container đang chạy
$ docker ps
# Xem tất cả container (kể cả đã dừng)
$ docker ps -a
# Format output đẹp hơn
$ docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
docker start / stop / restart
# Khởi động container đã dừng
$ docker start my-nginx
# Dừng container đang chạy
$ docker stop my-nginx
# Khởi động lại
$ docker restart my-nginx
docker stop gửi tín hiệu SIGTERM, cho container thời gian dọn dẹp (mặc định 10 giây) trước khi buộc dừng bằng SIGKILL.
docker pause / unpause
# Tạm dừng container (freeze process)
$ docker pause my-nginx
# Tiếp tục chạy
$ docker unpause my-nginx
Khác với stop, pause giữ container trong bộ nhớ — trạng thái được giữ nguyên, không cần khởi động lại từ đầu.
docker rm — Xóa Container
# Xóa container đã dừng
$ docker rm my-nginx
# Force xóa container đang chạy
$ docker rm -f my-nginx
# Xóa tất cả container đã dừng
$ docker container prune
docker exec — Chạy lệnh trong Container
# Mở shell trong container đang chạy
$ docker exec -it my-nginx bash
# Chạy lệnh một lần
$ docker exec my-nginx cat /etc/os-release
# Xem biến môi trường
$ docker exec my-nginx env
docker exec là công cụ debug mạnh mẽ nhất — giúp bạn “vào bên trong” container để kiểm tra.
docker logs — Xem log
# Xem log
$ docker logs my-nginx
# Follow log realtime
$ docker logs -f my-nginx
# Xem 100 dòng cuối
$ docker logs --tail 100 my-nginx
# Log có timestamp
$ docker logs -t my-nginx
docker inspect — Chi tiết Container
# Xem thông tin chi tiết (JSON)
$ docker inspect my-nginx
# Lấy IP address
$ docker inspect -f '{{.NetworkSettings.IPAddress}}' my-nginx
# Lấy environment variables
$ docker inspect -f '{{.Config.Env}}' my-nginx
# Lấy mount points
$ docker inspect -f '{{.Mounts}}' my-nginx

Use Cases thực tế
1. Chạy Web Server tạm thời
$ docker run -d -p 8080:80 --name web nginx
# Truy cập http://localhost:8080
2. Debug Container đang chạy
# Vào container kiểm tra
$ docker exec -it web bash
root@container:/# cat /var/log/nginx/access.log
root@container:/# curl localhost
3. Xem log ứng dụng
# Theo dõi log realtime
$ docker logs -f web
# Kiểm tra lỗi
$ docker logs web 2>&1 | grep -i error
Bảng so sánh: docker run vs docker create
| Tiêu chí | docker run | docker create |
|---|---|---|
| Hành động | Tạo + Khởi động | Chỉ tạo (chưa chạy) |
| Trạng thái sau | Running | Created |
| Cần start sau? | Không | Có |
| Use case | Chạy ngay | Chuẩn bị trước khi chạy |
Bảng so sánh: docker stop vs docker kill
| Tiêu chí | docker stop | docker kill |
|---|---|---|
| Tín hiệu | SIGTERM → SIGKILL | SIGKILL (ngay lập tức) |
| Thời gian chờ | 10 giây (mặc định) | Không chờ |
| Dọn dẹp? | Có thời gian | Không |
| Use case | Dừng bình thường | Container bị treo |
Best Practices
- Đặt tên cho Container — dễ quản lý với
--name, thay vì nhớ ID dài dằng dặc - Dùng
--rmcho container tạm — tự động xóa khi dừng, tránh đầy disk - Dùng
-dcho production — chạy background, không chiếm terminal - Xem log trước khi debug —
docker logsthường giải quyết 80% vấn đề - Dọn dẹp thường xuyên —
docker container prunexóa container không dùng
Bước tiếp theo
Bạn đã nắm vững vòng đời Container — từ tạo, chạy, dừng, đến xóa. Tiếp theo, hãy tìm hiểu cách lưu trữ dữ liệu bền vững với Docker Volume, giúp dữ liệu không mất đi khi container bị xóa.
👉 Bài tiếp theo: Docker Volume: Lưu trữ dữ liệu bền vững