Thursday, November 21, 2024

Tự động khởi động lại các Docker Container khi chúng gặp sự cố với Autoheal

-

1. Tổng quan.

willfarrell/autoheal là một Docker image được cung cấp bởi người dùng GitHub willfarrell. Image này được sử dụng để tự động khởi động lại các container Docker khi chúng gặp sự cố.

Nó hoạt động bằng cách lắng nghe sự kiện từ Docker daemon và khi một container dừng với mã lỗi không phải là 0 (điều này thường chỉ ra một sự cố), nó sẽ khởi động lại container đó.

Để sử dụng nó, bạn cần chạy nó như một container Docker với quyền truy cập vào Docker daemon. Bạn cũng cần đặt biến môi trường AUTOHEAL_CONTAINER_LABEL cho các container mà bạn muốn tự động khởi động lại khi gặp sự cố.

Bạn có thể tham khảo Repo Github của dự án ở đây https://github.com/willfarrell/docker-autoheal.

Đây là một giải pháp tạm thời cho đến khi Docker hỗ trợ natively chức năng --exit-on-unhealthy.

2. Cách sử dụng Docker Autoheal.

2.1. Docker CLI.

UNIX socket passthrough.

Chạy Docker Autoheal như một container Docker với quyền truy cập vào Docker daemon thông qua UNIX socket.

docker run -d \
    --name autoheal \
    --restart=always \
    -e AUTOHEAL_CONTAINER_LABEL=all \
    -v /var/run/docker.sock:/var/run/docker.sock \
    willfarrell/autoheal

TCP socket.

Chạy Docker Autoheal với quyền truy cập vào Docker daemon thông qua TCP socket.

docker run -d \
    --name autoheal \
    --restart=always \
    -e AUTOHEAL_CONTAINER_LABEL=all \
    -e DOCKER_SOCK=tcp://$HOST:$PORT \
    -v /path/to/certs/:/certs/:ro \
    willfarrell/autoheal

TCP with mTLS (HTTPS).

Chạy Docker Autoheal với quyền truy cập vào Docker daemon thông qua TCP socket, sử dụng mTLS.

docker run -d \
    --name autoheal \
    --restart=always \
    --tlscacert=/certs/ca.pem \
    --tlscert=/certs/client-cert.pem \
    --tlskey=/certs/client-key.pem \
    -e AUTOHEAL_CONTAINER_LABEL=all \
    -e DOCKER_HOST=tcp://$HOST:2376 \
    -e DOCKER_SOCK=tcps://$HOST:2376 \
    -e DOCKER_TLS_VERIFY=1 \
    -v /path/to/certs/:/certs/:ro \
    willfarrell/autoheal

Sử dụng trong hình ảnh container của bạn.

  • Áp label autoheal=true cho container của bạn để có nó được giám sát.
  • Đặt AUTOHEAL_CONTAINER_LABEL=all để giám sát tất cả các container đang chạy.
  • Đặt AUTOHEAL_CONTAINER_LABEL thành nhãn container hiện có có giá trị true.

Lưu ý: Bạn phải áp dụng HEALTHCHECK cho hình ảnh Docker của bạn trước.

Docker Compose (ví dụ)

services:
  app:
    extends:
      file: ${PWD}/services.yml
      service: app
    labels:
      autoheal-app: true

  autoheal:
    deploy:
      replicas: 1
    environment:
      AUTOHEAL_CONTAINER_LABEL: autoheal-app
    image: willfarrell/autoheal:latest
    network_mode: none
    restart: always
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock

Tuỳ chọn Labels Container.

autoheal.stop.timeout=20: Ghi đè thời gian dừng tối đa (tính bằng giây) trong quá trình khởi động lại cho từng container.

Các biến môi trường mặc định.

Đây là các biến môi trường mặc định mà Docker Autoheal sử dụng:

  • AUTOHEAL_CONTAINER_LABEL=autoheal: Đặt nhãn hiện có có giá trị true.
  • AUTOHEAL_INTERVAL=5: Kiểm tra mỗi 5 giây.
  • AUTOHEAL_START_PERIOD=0: Chờ 0 giây trước lần kiểm tra sức khỏe đầu tiên.
  • AUTOHEAL_DEFAULT_STOP_TIMEOUT=10: Docker chờ tối đa 10 giây (mặc định của Docker) cho một container dừng lại trước khi giết trong quá trình khởi động lại (có thể ghi đè cho từng container qua nhãn, xem phía dưới).
  • AUTOHEAL_ONLY_MONITOR_RUNNING=false: Tất cả các container được giám sát theo mặc định. Đặt giá trị này thành true để chỉ giám sát các container đang chạy. Điều này sẽ dẫn đến việc các container tạm dừng sẽ bị bỏ qua.
  • DOCKER_SOCK=/var/run/docker.sock: Unix socket cho các yêu cầu curl đến Docker API.
  • CURL_TIMEOUT=30--max-time giây cho các yêu cầu curl đến Docker API.
  • WEBHOOK_URL="": Đăng thông điệp lên webhook nếu một container đã được khởi động lại (hoặc khởi động lại thất bại).

Để kiểm tra (xây dựng cục bộ), bạn có thể sử dụng các lệnh sau:

docker buildx build -t autoheal .

docker run -d \
    -e AUTOHEAL_CONTAINER_LABEL=all \
    -v /var/run/docker.sock:/var/run/docker.sock \
    autoheal

Lệnh docker buildx build -t autoheal . sẽ xây dựng Docker image với tên autoheal từ Dockerfile trong thư mục hiện tại.

Lệnh docker run -d -e AUTOHEAL_CONTAINER_LABEL=all -v /var/run/docker.sock:/var/run/docker.sock autoheal sẽ chạy Docker Autoheal như một container Docker, với quyền truy cập vào Docker daemon và giám sát tất cả các container.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories