Chuyển đến nội dung chính

Bài 4: Docker Containers - Vòng đời và Quản lý

Hiểu vòng đời container (created, running, paused, stopped, deleted), các lệnh quản lý nâng cao, resource limits (CPU, memory), restart policies, docker inspect, docker stats và container debugging techniques.

🔒 DevSecOps — Bài 4 Bài 4: Docker Containers - Vòng đời và Quản lý

Docker từ Cơ bản đến Nâng cao

Phần 1: Nền tảng Docker

xdev.asia

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 \
    nginx

Kiể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 \
    nginx

CPU shares (relative weight, default 1024)

docker run -d --name app
--cpu-shares=512
nginx

Pin 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 \
    nginx

Giớ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-app

Lấ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 stats

Stats 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 bash

Mở 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.yaml

Copy 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-app

Follow 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 nginx

Thêm labels

docker run -d
--name my-app
--label environment=production
--label team=backend
--label version=1.0.0
nginx

Filter 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-app

Xem 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.