Container vẫn hiện running nhưng healthcheck báo unhealthy. Bạn đã đặt restart: unless-stopped nên chờ nó tự khởi động lại, nhưng không thấy gì xảy ra. Hai cơ chế đang theo dõi hai tín hiệu khác nhau: tiến trình container kết thúc và kết quả probe sức khỏe.
Bài đối chiếu Docker Engine/Compose documentation ngày 30/10/2026, tập trung vào container thông thường do Docker Compose quản lý. Không áp dụng nguyên kết luận cho cơ chế điều phối Swarm hoặc Kubernetes. Các fragment được kiểm tra cú pháp tại máy; chưa chạy Docker daemon hoặc tạo container để đo hành vi trong bài.
Đọc ba trạng thái riêng
Trạng thái tiến trình trả lời container đang running, exited hay restarting. Health status trả lời probe đang starting, healthy hoặc unhealthy nếu có healthcheck. Restart policy mô tả cách daemon xử lý khi container kết thúc hoặc daemon khởi động lại theo chính sách.
Docker restart policies đặt điều kiện quanh việc container exit và daemon restart. HEALTHCHECK reference mô tả một health status bổ sung cho trạng thái thông thường. Từ hai hợp đồng này, không nên suy ra probe thất bại sẽ tự làm tiến trình chính exit hoặc tự kích hoạt restart policy của container thường.
Một app còn chạy nhưng trả lỗi có thể rơi đúng vào khoảng đó. Healthcheck vẫn hữu ích để quan sát tình trạng, nhưng hành động phục hồi cần được thiết kế rõ ràng.
Kiểm tra cấu hình thực tế của đúng container
Chạy lệnh đọc trước. APP_CONTAINER là placeholder cần thay bằng tên hoặc ID container cần chẩn đoán; không dùng nguyên chuỗi đó như tên thật:
docker compose ps -a
docker inspect --format '{{.State.Status}}' APP_CONTAINER
docker inspect --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}no-healthcheck{{end}}' APP_CONTAINER
docker inspect --format '{{json .HostConfig.RestartPolicy}}' APP_CONTAINER
docker inspect --format '{{.RestartCount}}' APP_CONTAINER
Nếu đọc được running và unhealthy, bạn đã xác nhận hai trường độc lập cùng tồn tại. Nếu nhận no-healthcheck, container hiện tại chưa có healthcheck; đừng dựa vào một file YAML khác hoặc image cũ để kết luận probe đang chạy.
RestartCount cho biết số lần restart đã ghi nhận, không giải thích toàn bộ nguyên nhân. Cần đối chiếu với log, thời điểm exit và cấu hình thực tế. Bài không đưa output giả thành kết quả từ một Docker host đã chạy.
Chọn restart policy theo tình huống exit
Theo Compose services reference, chính sách restart được áp dụng trên container termination. on-failure gắn với exit code lỗi; always và unless-stopped có quy tắc riêng khi container bị dừng thủ công và khi daemon trở lại.
Fragment dưới đây chỉ bổ sung vào service web đã có image/build và cấu hình của dự án, không phải một compose.yaml chạy độc lập:
services:
web:
restart: unless-stopped
Nó không thêm probe sức khỏe, không sửa endpoint /health, cũng không bảo đảm app phục hồi được mọi lỗi. Nếu app cần thoát khi gặp tình trạng không thể tiếp tục an toàn, đó là quyết định của tiến trình ứng dụng; không nên biến mọi lỗi dependency ngắn hạn thành crash loop.
Đừng nhầm service-level restart này với các tùy chọn có tên restart nằm bên trong cấu hình dependency. Vị trí trong YAML là một phần của ý nghĩa, không chỉ tên thuộc tính.
Áp dụng thay đổi rồi đọc lại
Sửa file trên đĩa chưa chứng minh container đã nhận policy mới. Với đúng project thử nghiệm và service đã xác định, bước áp dụng có thể là:
docker compose up -d web
Đây là thao tác ghi, có thể tạo lại container khi cấu hình thay đổi. Cần biết service và dữ liệu của project trước khi chạy. docker compose up mô tả việc tạo, khởi động và tái tạo container; sau đó đọc lại HostConfig.RestartPolicy của container thực tế.
Không chạy một lệnh update trên toàn bộ container chỉ để thử một giả thuyết. Giới hạn một service giúp giữ phạm vi thay đổi dễ kiểm tra và tránh tác động tác vụ một lần vốn cần kết thúc bình thường.
Kế hoạch kiểm tra phục hồi
Trên môi trường thử, tách ít nhất ba ca: tiến trình chính exit lỗi; probe thất bại nhưng tiến trình vẫn sống; người vận hành dừng container có chủ đích. Ghi lại State.Status, Health.Status nếu có và RestartCount cho từng ca. Đây là kế hoạch kiểm tra, chưa phải kết quả thực thi Docker trong bài.
Kiểm tra probe có đúng công cụ, đúng cổng và timeout phù hợp hay không. Một lệnh curl không tồn tại trong image có thể khiến probe lỗi dù ứng dụng đang phục vụ request. Ngược lại, probe chỉ kiểm tra process có thể bỏ sót lỗi nghiệp vụ.
Nếu có bộ giám sát riêng tự restart container unhealthy, ghi rõ đó là thành phần nào, có giới hạn tần suất và cách tránh lặp hay không. Không gán hành vi của thành phần bổ sung cho Docker restart policy mặc định.
Lỗi thường gặp và giới hạn
- Diễn giải unhealthy thành exited.
- Chỉ kiểm tra file Compose mà không đọc container đã tạo.
- Dùng restart để che lỗi cấu hình hoặc che mất bằng chứng chẩn đoán.
- Mong container bị dừng thủ công luôn tự bật lại bất kể policy.
Hãy tách tín hiệu sức khỏe khỏi hành động phục hồi. Khi biết chính xác điều kiện nào kích hoạt restart, bạn sẽ kiểm tra đúng ca lỗi và tránh xây hệ thống dựa trên một kỳ vọng không có trong hợp đồng vận hành.

