1. Vòng đời của Container
Một Docker container trải qua các trạng thái sau:
docker create docker start docker pause
──────────► Created ──────────► Running ──────────► Paused
│ ◄──────────
│ docker unpause
│
│ docker stop / docker kill
▼
Stopped ──────────► Removed
docker rm
Created: Container được tạo nhưng chưa start (docker create)
Running: Container đang chạy (docker start / docker run)
Paused: Container bị tạm dừng, processes frozen (docker pause)
Stopped: Container đã dừng, processes terminated (docker stop)
Removed: Container bị xóa hoàn toàn (docker rm)
2. Resource Limits (CPU, Memory, I/O)
Giới hạn tài nguyên container là việc cực kỳ quan trọng trong production để tránh một container chiếm hết resources của host.
2.1. Memory Limits
# Giới hạn memory docker run -d --name app \ --memory=512m \ --memory-swap=1g \ --memory-reservation=256m \ nginxKiểm tra memory usage
docker stats app --format "{{.MemUsage}}"
2.2. CPU Limits
# Giới hạn CPU (1.5 cores) docker run -d --name app \ --cpus=1.5 \ nginxCPU shares (relative weight, default 1024)
docker run -d --name app
--cpu-shares=512
nginxPin container vào CPU cụ thể
docker run -d --name app
--cpuset-cpus="0,1"
nginx
2.3. I/O Limits
# Giới hạn Block I/O weight docker run -d --name app \ --blkio-weight=300 \ nginxGiới hạn read/write rate
docker run -d --name app
--device-read-bps /dev/sda:1mb
--device-write-bps /dev/sda:1mb
nginx
3. Restart Policies
Restart policies xác định hành vi khi container bị crash hoặc Docker daemon restart:
| Policy | Mô tả |
|---|---|
| no | Không tự restart (default) |
| always | Luôn restart, kể cả khi Docker daemon restart |
| unless-stopped | Như always, nhưng không restart nếu đã manually stopped |
| on-failure[:max] | Chỉ restart khi exit code ≠ 0, tối đa max lần |
# Always restart
docker run -d --restart=always --name my-app nginx
# Restart khi fail, tối đa 5 lần
docker run -d --restart=on-failure:5 --name my-app nginx
# Thay đổi restart policy cho container đang chạy
docker update --restart=always my-app
4. Docker Inspect - Xem chi tiết Container
# Xem toàn bộ thông tin docker inspect my-appLấy IP address
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-app
Xem mounts
docker inspect -f '{{json .Mounts}}' my-app | jq .
Xem environment variables
docker inspect -f '{{json .Config.Env}}' my-app | jq .
Xem port bindings
docker inspect -f '{{json .NetworkSettings.Ports}}' my-app | jq .
Xem trạng thái container
docker inspect -f '{{.State.Status}}' my-app docker inspect -f '{{.State.StartedAt}}' my-app
Xem restart count
docker inspect -f '{{.RestartCount}}' my-app
5. Docker Stats - Monitoring Container
# Real-time stats cho tất cả containers docker statsStats cho container cụ thể
docker stats my-app
Snapshot (không stream)
docker stats --no-stream
Custom format
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}"
6. Container Debugging Techniques
6.1. Exec vào container
# Mở shell bash docker exec -it my-app bashMở shell sh (nếu container dùng Alpine)
docker exec -it my-app sh
Chạy lệnh không interactive
docker exec my-app cat /etc/hosts docker exec my-app env docker exec my-app ps aux
6.2. Attach vào container
# Attach vào stdout/stderr của container
docker attach my-app
# Ctrl+P, Ctrl+Q để detach mà không stop container
6.3. Copy files
# Copy từ host vào container docker cp config.yaml my-app:/etc/app/config.yamlCopy từ container ra host
docker cp my-app:/var/log/app.log ./app.log
Copy cả thư mục
docker cp my-app:/etc/nginx/ ./nginx-config/
6.4. Diff - Xem thay đổi filesystem
# Xem các files đã thay đổi trong container
docker diff my-app
# A = Added, C = Changed, D = Deleted
6.5. Logs debugging
# Xem logs với timestamps docker logs -t my-appFollow logs real-time
docker logs -f my-app
Logs từ thời điểm cụ thể
docker logs --since "2026-03-30T10:00:00" my-app docker logs --until "2026-03-30T12:00:00" my-app
7. Container Naming và Labels
# Đặt tên container docker run -d --name production-web nginxThêm labels
docker run -d
--name my-app
--label environment=production
--label team=backend
--label version=1.0.0
nginxFilter containers theo labels
docker ps --filter "label=environment=production" docker ps --filter "label=team=backend"
8. Docker Wait và Events
# Đợi container kết thúc và lấy exit code docker wait my-appXem Docker events real-time
docker events docker events --filter "container=my-app" docker events --filter "event=start" docker events --since "2026-03-30T10:00:00"
9. Tổng kết
Trong bài này, bạn đã nắm được:
Vòng đời container và các trạng thái
Resource limits cho CPU, memory, I/O
Restart policies và khi nào sử dụng
Docker inspect để xem chi tiết container
Docker stats để monitoring real-time
Các kỹ thuật debugging: exec, attach, cp, diff, logs
Container naming conventions và labels
Bài tiếp theo sẽ đi sâu vào Dockerfile - cách viết Dockerfile chuyên nghiệp từ A đến Z.