Danh sách bài viết trong series Bashscript từ cơ bản đến áp dụng vào DevOps
- Bài 1. Cơ Bản Bash Script trong DevOps
- Bài 2. Điều Kiện trong Bash DevOps: Xử Lý Logic Cơ Bản
- Bài 3. Vòng Lặp trong Bash DevOps: Tự Động Hóa Lặp Lại Hiệu Quả
- Bài 4. Xử Lý File trong Bash DevOps: Đọc, Ghi và Quản Lý Hiệu Quả
- Bài 5. Text Processing trong Bash DevOps: Grep, Awk, Sed Hiệu Quả
- Bài 6. Function trong Bash DevOps: Tái Sử Dụng Code Hiệu Quả
- Bài 7. Quản Lý Biến và Môi Trường trong Bash DevOps
- Bài 8. Cron Job trong Bash DevOps: Tự Động Hóa Theo Lịch Hiệu Quả
- Bài 9. Debug trong Bash DevOps: Tìm và Sửa Lỗi Hiệu Quả
- Bài 10. Error Handling Bash DevOps: Xử Lý Ngoại Lệ Hiệu Quả
- Bài 11. Bash trong CI/CD DevOps: Tích Hợp Pipeline Hiệu Quả
- Bài 12. Quản Lý Hệ Thống với Bash DevOps: Theo Dõi và Can Thiệp Hiệu Quả
- Bài 13. Tự Động Hóa SSH với Bash DevOps: Quản Lý Multi-Server Hiệu Quả
- Bài 14. Bash và Docker trong DevOps: Quản Lý Container Hiệu Quả
- Bài 15. Monitoring với Bash DevOps: Báo Cáo Hệ Thống Hiệu Quả
- Bài 16. Bash Nâng Cao: Parallel Execution trong DevOps Hiệu Quả
- Bài 17. Bash và API trong DevOps: Gọi và Xử Lý API Hiệu Quả
- Bài 18. Bash và Cloud CLI trong DevOps: Quản Lý Cloud Hiệu Quả
- Bài 19. Bash và Security trong DevOps: Bảo Mật Script Hiệu Quả
- Bài 20. Best Practice trong Bash DevOps: Làm Chủ Script Hiệu Quả
Bash và Docker – Quản Lý Container trong DevOps
Docker là công cụ không thể thiếu trong DevOps, và khi kết hợp với Bash, bạn có thể quản lý container Bash một cách linh hoạt, mạnh mẽ. Bash và Docker trong DevOps cho phép bạn viết Docker script Bash để tự động hóa Docker – từ khởi động, kiểm tra, đến dọn dẹp container. Trong bài thứ mười bốn của series Bash Script Chuyên Sâu cho DevOps, tôi sẽ dẫn bạn qua cách dùng Bash để làm việc với Docker, kèm thực hành thực tế. Đây là kinh nghiệm tôi áp dụng khi quản lý container trong pipeline và production, không chỉ là lý thuyết đâu nhé!
Tại Sao Bash và Docker?
Bash với Docker
Bash là cầu nối tự nhiên để gọi lệnh Docker:
- Chạy, dừng, kiểm tra container.
- Xử lý output từ
docker ps
,docker logs
. - Tự động hóa task phức tạp hơn
docker run
đơn giản.
Ví dụ: Script Bash kiểm tra container có chạy không, tự động khởi động lại nếu cần.
Lợi Ích trong DevOps
- Tự động hóa: Quản lý hàng loạt container mà không cần gõ lệnh tay.
- Pipeline: Tích hợp Docker vào CI/CD (bài 11).
- Nhẹ nhàng: Bash có sẵn, không cần ngôn ngữ nặng hơn.
Thực tế: Tôi từng dùng Bash để restart container bị treo trong cron, giữ service online mà không cần can thiệp thủ công.
Công Cụ Bash với Docker
Lệnh Docker Cơ Bản
-
Danh sách container:
docker ps -a
-a
: Bao gồm cả container dừng.
-
Chạy container:
docker run -d --name myapp nginx
-d
: Chạy ngầm.
-
Dừng/Khởi động lại:
docker stop myapp docker restart myapp
-
Xem log:
docker logs myapp
Kết Hợp với Bash
-
Lọc container:
docker ps -q --filter "name=myapp"
-q
: Chỉ lấy ID.
-
Kiểm tra trạng thái:
docker inspect myapp | grep '"Running": true'
Thực Hành: Script Quản Lý Container
Script Kiểm Tra và Khởi Động
Tạo docker_manager.sh
:
#!/bin/bash
set -e
trap 'echo "Lỗi tại dòng $LINENO: $BASH_COMMAND" >&2; exit 1' ERR
# Biến
CONTAINER_NAME="myapp"
IMAGE="nginx:latest"
LOG_FILE="/var/log/docker_manager.log"
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
# Hàm ghi log
log() {
echo "[$TIMESTAMP] $1" >> "$LOG_FILE" 2>/dev/null || {
echo "Không thể ghi log" >&2
exit 1
}
}
# Hàm kiểm tra container
check_container() {
if [ -z "$(docker ps -q --filter "name=$CONTAINER_NAME")" ]; then
log "Container $CONTAINER_NAME không chạy"
echo "Khởi động $CONTAINER_NAME..."
docker run -d --name "$CONTAINER_NAME" "$IMAGE" >/dev/null 2>&1 || {
log "Lỗi: Không thể chạy $CONTAINER_NAME"
exit 1
}
log "Đã khởi động $CONTAINER_NAME"
else
log "Container $CONTAINER_NAME đang chạy"
fi
}
# Hàm kiểm tra log lỗi
check_logs() {
if docker logs "$CONTAINER_NAME" 2>&1 | grep -i "error"; then
log "Phát hiện lỗi trong log $CONTAINER_NAME"
echo "Restart $CONTAINER_NAME..."
docker restart "$CONTAINER_NAME" >/dev/null 2>&1
log "Đã restart $CONTAINER_NAME"
fi
}
# Gọi hàm
check_container
check_logs
echo "Quản lý container hoàn tất, xem log tại $LOG_FILE"
Chạy và Test
-
Chạy script:
chmod +x docker_manager.sh ./docker_manager.sh
- Nếu
myapp
chưa chạy:Khởi động myapp... Quản lý container hoàn tất, xem log tại /var/log/docker_manager.log
- Log mẫu:
[2025-03-13 10:00:00] Container myapp không chạy [2025-03-13 10:00:00] Đã khởi động myapp
- Nếu
-
Container đang chạy:
- Chạy lại:
[2025-03-13 10:01:00] Container myapp đang chạy
- Chạy lại:
-
Mô phỏng lỗi:
- Thay
IMAGE="nginx:latest"
thành image lỗi (VD:nginx:broken
), chạy lại:[2025-03-13 10:02:00] Lỗi: Không thể chạy myapp
- Thay
Giải thích:
docker ps -q
: Kiểm tra container chạy.docker run -d
: Khởi động nếu không có.grep -i "error"
: Tìm lỗi trong log.
DevOps: Script này giữ container chạy ổn định, có thể dùng trong cron.
Debug Docker Script
- Thêm debug:
bash -x docker_manager.sh
- Kiểm tra log:
tail -f /var/log/docker_manager.log
Thực tế: Tôi từng quên kiểm tra container tồn tại, script chạy trùng – thêm -q --filter
giải quyết triệt để.
Ứng Dụng trong DevOps
Tự Động Hóa Docker
- Dọn dẹp container cũ:
docker ps -a -q --filter "status=exited" | xargs docker rm
Pipeline CI/CD
- Build và chạy:
deploy: script: - bash docker_manager.sh - docker tag myapp:$CI_COMMIT_SHA myapp:latest
Case study: Một team dùng Bash restart container lỗi trong cron, giảm 90% downtime – không cần tool giám sát nặng.
Best Practice
- Kiểm tra container trước khi chạy.
- Dùng
--name
để tránh trùng. - Ghi log mọi hành động.
Kết Luận
Bash và Docker trong DevOps với quản lý container Bash là cách mạnh mẽ để tự động hóa Docker. Thực hành với docker_manager.sh
cho thấy bạn có thể khởi động, kiểm tra container dễ dàng – kỹ năng cần thiết trong DevOps. Bài tiếp theo, chúng ta sẽ khám phá Monitoring với Bash – cách báo cáo hệ thống như pro.