Bash và Docker trong DevOps: Quản lý container hiệu quả
Hướng dẫn kết hợp Bash và Docker trong DevOps: wrapper script, quản lý container, dọn image cũ, healthcheck, deploy stack với docker compose và tự động restart khi crash.
Trong bài viết trước, chúng ta đã tìm hiểu cách tự động hóa SSH để quản lý nhiều server song song. Bây giờ, chúng ta sẽ bước vào thế giới container — nơi Bash đóng vai trò như một bridge mạnh mẽ giữa bạn và Docker daemon, giúp bạn quản lý container một cách linh hoạt hơn bất kỳ UI nào.
Docker CLI đã rất mạnh mẽ, nhưng khi bạn cần chạy hàng loạt container, kiểm tra health status định kỳ, dọn dẹp image cũ, hay deploy một stack phức tạp — việc gõ lệnh từng cái một không còn thực tế. Bash cho phép bạn viết wrapper script để tự động hóa toàn bộ vòng đời container: từ build, deploy, healthcheck, restart khi crash, đến cleanup resource.
Bài viết này sẽ hướng dẫn bạn các kỹ thuật kết hợp Bash và Docker, từ những lệnh cơ bản đến một script thực hành quản lý container hoàn chỉnh.
Lệnh Docker cơ bản trong Bash
Liệt kê và lọc container
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Liệt kê tất cả container đang chạydocker ps
# Liệt kê cả container đã dừngdocker ps -a
# Chỉ lấy container ID (phù hợp cho script)docker ps -q
# Lọc theo têndocker ps --filter "name=nginx"# Lọc theo trạng tháidocker ps --filter "status=running"docker ps --filter "status=exited"# Kết hợp filter và format outputdocker ps --format "{{.ID}} {{.Names}} {{.Status}} {{.Ports}}"
Kiểm tra trạng thái container
1
2
3
4
5
6
7
8
# Kiểm tra container có đang chạy không (trả về 0 nếu có)docker inspect --format='{{.State.Running}}' myapp
# Lấy trạng thái chi tiếtdocker inspect --format='{{.State.Status}}' myapp
# Kiểm tra health status (nếu có healthcheck)docker inspect --format='{{.State.Health.Status}}' myapp
Quản lý container
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Khởi động container đã dừngdocker start myapp
# Dừng containerdocker stop myapp
# Restart containerdocker restart myapp
# Xóa container đã dừngdocker rm myapp
# Force remove (kể cả khi đang chạy)docker rm -f myapp
Docker Compose
1
2
3
4
5
6
7
8
9
10
11
# Khởi động stackdocker compose up -d
# Dừng stackdocker compose down
# Xem logdocker compose logs -f
# Restart một servicedocker compose restart nginx
Wrapper script cho Docker
Hàm tiện ích
Trước khi viết script phức tạp, hãy tạo một số hàm tiện ích để tái sử dụng:
#!/usr/bin/env bash
# Kiểm tra Docker daemon có chạy khôngdocker_ready(){ docker info >/dev/null 2>&1}# Lấy ID của container theo tên, trả về rỗng nếu không tồn tạicontainer_id(){ docker ps -q --filter "name=$1"}# Kiểm tra container có đang chạy khôngcontainer_running(){[[ -n "$(container_id "$1")"]]}# Kiểm tra container có tồn tại (dù đã dừng) khôngcontainer_exists(){ docker ps -a -q --filter "name=$1"| grep -q .
}# Lấy logs của container (số dòng gần nhất)container_logs(){localname="${1:?Container name required}"locallines="${2:-50}" docker logs --tail "$lines""$name" 2>&1}
#!/usr/bin/env bash
# Kiểm tra HTTP endpoint của containercheck_http(){localcontainer_name="${1:?Container name required}"localport="${2:-80}"localpath="${3:-/}"localexpected_status="${4:-200}"local ip
ip=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'"$container_name" 2>/dev/null)if[[ -z "$ip"]];thenecho"[ERROR] Cannot get IP for container $container_name"return1filocal status
status=$(curl -s -o /dev/null -w "%{http_code}""http://${ip}:${port}${path}" 2>/dev/null ||echo"000")if[["$status"=="$expected_status"]];thenecho"[OK] $container_name HTTP check passed (status: $status)"return0elseecho"[WARN] $container_name HTTP check failed (status: $status, expected: $expected_status)"return1fi}# Kiểm tra nhiều containerscheck_http "nginx"80"/""200"check_http "api"8080"/health""200"
Deploy stack với Bash
Khi deploy một Docker Compose stack, bạn thường cần: pull image mới, dừng service cũ, khởi động lại, và kiểm tra status. Bash giúp bạn orchestrate toàn bộ quá trình này:
[2026-08-31 10:00:01] [INFO] nginx is healthy
[2026-08-31 10:00:01] [WARN] api is not running — restarting...
[2026-08-31 10:00:06] [INFO] api restarted successfully
[2026-08-31 10:00:06] [INFO] worker is healthy
Ghi chú triển khai
Docker socket permission: Script Bash cần truy cập Docker daemon qua socket /var/run/docker.sock. Đảm bảo user chạy script thuộc nhóm docker hoặc có quyền sudo.
BatchMode SSH: Khi chạy script Docker qua SSH (từ bài trước), sử dụng ssh -o BatchMode=yes để tránh prompt xác nhận host key.
Container naming convention: Luôn dùng --name khi chạy container để dễ quản lý. Tránh dùng generated ID vì khó nhớ và không ổn định.
Resource cleanup: Script watchdog chỉ restart container — không tự động xóa. Kết hợp với docker system prune chạy định kỳ để giải phóng disk space.
Logging aggregation: Trong môi trường production, container logs nên được ship đến centralized logging system (ELK, Loki) thay vì chỉ ghi local file.
Lời kết
Kết hợp Bash và Docker tạo ra một công cụ quản lý container mạnh mẽ, linh hoạt và nhẹ nhàng hơn bất kỳ orchestration tool phức tạp nào. Từ việc liệt kê container, kiểm tra health status, dọn dẹp resource đến viết script watchdog tự động restart khi crash — tất cả đều nằm trong tay bạn chỉ với Bash và Docker CLI.
Ở bài tiếp theo, chúng ta sẽ khám phá cách monitoring với Bash: thu thập metric hệ thống, gửi báo cáo qua email/webhook, và tạo dashboard báo cáo hàng ngày.