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ànhtrue
để 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.