Bài 14. Bash và Docker trong DevOps: Quản Lý Container 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

  1. Danh sách container:

    docker ps -a
    • -a: Bao gồm cả container dừng.
  2. Chạy container:

    docker run -d --name myapp nginx
    • -d: Chạy ngầm.
  3. Dừng/Khởi động lại:

    docker stop myapp
    docker restart myapp
  4. 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

  1. 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
  2. Container đang chạy:

    • Chạy lại:
      [2025-03-13 10:01:00] Container myapp đang chạy
  3. 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

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.

Điều hướng chuỗi bài viết<< Bài 13. Tự Động Hóa SSH với Bash DevOps: Quản Lý Multi-Server Hiệu Quả
>> Bài 15. Monitoring với Bash DevOps: Báo Cáo Hệ Thống Hiệu Quả
Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận

Có thể bạn quan tâm