Chỉ dẫn HEALTHCHECK cho Docker biết cách xác định xem trạng thái của container có bình thường hay không. Đây là một lệnh mới được giới thiệu trong Docker 1.12. Trước khi có chỉ thị HEALTHCHECK, công cụ Docker chỉ có thể xác định xem container có ở trạng thái bất thường hay không bằng cách xử lý chính trong container có exit hay không. Trong nhiều trường hợp, điều này là tốt, nhưng nếu chương trình đi vào trạng thái bế tắc hoặc trạng thái vòng lặp vô hạn, application process sẽ không exit, nhưng container không còn khả năng cung cấp dịch vụ. Trước 1.12, Docker không phát hiện ra trạng thái này của container và sẽ không lên lịch lại cho nó, khiến một số container không hoạt động đúng nhưng vẫn chấp nhận yêu cầu của người dùng.
Cú pháp trông giống như:
HEALTHCHECK [options] CMD <command>
Cú pháp trên đặt lệnh kiểm tra tình trạng của container
Làm thế nào nó hoạt động?
Khi một lệnh HEALTHCHECK được chỉ định trong một image, container được bắt đầu với nó, trạng thái ban đầu sẽ bắt đầu và sẽ trở nên healthy sau khi lệnh HEALTHCHECK được kiểm tra thành công. Nếu thất bại trong một số lần nhất định, nó sẽ trở nên unhealthy.
HEALTHCHECK hỗ trợ những tùy chọn nào?
--interval=<interval>
: khoảng thời gian giữa hai lần kiểm tra, mặc định là 30 giây; --timeout=<time length>
: Lệnh kiểm tra health chạy khoảng thời gian chờ. Nếu quá thời gian này, việc kiểm tra health coi như thất bại. Mặc định là 30 giây. --retries=<number>
: Khi số lần thất bại liên tiếp được chỉ định, trạng thái container được coi là unhealthy, mặc định là 3 lần. Giống như CMD, ENTRYPOINT, HEALTHCHECK chỉ được xuất hiện 1 lần. Nếu nhiều hơn một lần được viết, chỉ cái cuối cùng sẽ có hiệu lực.
Các bước
- Viết một Dockerfile với hướng dẫn HEALTHCHECK
- Xây dựng Docker image
- Kiểm tra xem tệp cấu hình nginx có tồn tại không
- Kiểm tra xem nginx có đang hoạt động
- Làm cho container Docker không hoạt động và kiểm tra
- Tạo tệp nginx.conf và Làm cho container hoạt động tốt
Viết một Dockerfile với hướng dẫn HEALTHCHECK
Giả sử chúng ta có một dịch vụ Web đơn giản. Chúng ta muốn thêm kiểm tra tình trạng để xác định xem dịch vụ Web của nó có hoạt động hay không. Chúng ta có thể sử dụng curl để giúp xác định HEALTHCHECK của Dockerfile của nó:
FROM nginx:1.13 HEALTHCHECK --interval=30s --timeout=3s \ CMD curl -f http://localhost/ || exit 1 EXPOSE 80
Ở đây chúng ta đặt kiểm tra 3 giây một lần (ở đây khoảng thời gian kiểm tra rất ngắn nên tương đối dài), nếu lệnh kiểm tra tình trạng không phản hồi trong hơn 3 giây thì được coi là lỗi và sử dụng curl – fs http://localhost/ | exit 1 Là lệnh kiểm tra trạng thái |
Build Docker image
docker image build -t nginx:1.13 .
Kiểm tra xem tệp cấu hình nginx có tồn tại không
docker run --name=nginx-proxy -d \ --health-cmd='stat /etc/nginx/nginx.conf || exit 1' \ nginx:1.13
Kiểm tra xem nginx có hoạt động tốt
docker inspect --format='' nginx-proxy
Làm cho bộ chứa Docker không hoạt động và kiểm tra
docker exec nginx-proxy rm /etc/nginx/nginx.conf
Kiểm tra xem nginx có đang hoạt động đúng
sleep 5; docker inspect --format='' nginx-proxy
Tạo tệp nginx.conf và Làm cho container hoạt động tốt
docker exec nginx-proxy touch /etc/nginx/nginx.conf
sleep 5; docker inspect --format='' nginx-proxy healthy