sự khác biệt giữa `docker stop` và` docker kill` là gì?


116

Sự khác biệt giữa docker stopvà là docker killgì?

Afaik, cả hai sẽ dừng một container đang chạy. Có phải đó là docker stopcố gắng ngăn chặn quá trình chạy bên trong container theo đúng cách, trong khi docker killsẽ gửi tín hiệu tiêu diệt? Nếu vậy làm thế nào để docker stopbiết làm thế nào để dừng chính xác quá trình chạy. (Vì điều này khác nhau từ quá trình này đến quá trình khác)

Câu trả lời:


113

Có phải là docker dừng các nỗ lực để ngăn chặn quá trình chạy bên trong container theo đúng cách, trong khi docker kill sẽ gửi tín hiệu kill?

Về cơ bản là có, sự khác biệt là tinh tế, nhưng được nêu trong tham chiếu Dòng lệnh :

  • docker stop : Dừng một container đang chạy ( gửi SIGTERM, và sau đó SIGKILL sau thời gian gia hạn ) [...] Quá trình chính bên trong container sẽ nhận được SIGTERM, và sau một thời gian ân hạn, SIGKILL. [nhấn mạnh của tôi]
  • Giết docker : Giết một container đang chạy ( gửi SIGKILL hoặc tín hiệu được chỉ định ) [...] Quá trình chính bên trong container sẽ được gửi SIGKILL hoặc bất kỳ tín hiệu nào được chỉ định với tùy chọn --signal. [nhấn mạnh của tôi]

Vì vậy, stopcố gắng kích hoạt tắt máy duyên dáng bằng cách gửi tín hiệu POSIX tiêu chuẩn SIGTERM, trong khi killchỉ giết theo quy trình theo mặc định (nhưng cũng cho phép gửi bất kỳ tín hiệu nào khác):

Tín hiệu SIGTERM được gửi đến một quy trình để yêu cầu chấm dứt. Không giống như tín hiệu SIGKILL, nó có thể bị bắt và giải thích hoặc bỏ qua bởi quy trình. Điều này cho phép quá trình thực hiện chấm dứt tốt đẹp giải phóng tài nguyên và lưu trạng thái nếu thích hợp. Cần lưu ý rằng SIGINT gần giống với SIGTERM.

Mặc dù không được thi hành trong mọi trường hợp, các quy trình thường được mong đợi sẽ xử lý SIGTERMmột cách duyên dáng và thực hiện đúng tùy thuộc vào trách nhiệm của chúng - điều này có thể dễ dàng thất bại do nỗ lực tắt máy duyên dáng mất nhiều thời gian hơn thời gian ân hạn, đó là điều cần xem xét nếu tính toàn vẹn dữ liệu là tối quan trọng (ví dụ cho cơ sở dữ liệu); xem ví dụ SIGTERM của Major Hayden so với SIGKILL để được giải thích chi tiết hơn:

Ứng dụng có thể xác định những gì nó muốn làm sau khi nhận được SIGTERM. Trong khi hầu hết các ứng dụng sẽ dọn sạch tài nguyên của họ và dừng lại, một số có thể không. Một ứng dụng có thể được cấu hình để làm một cái gì đó hoàn toàn khác khi nhận được SIGTERM. Ngoài ra, nếu ứng dụng ở trạng thái xấu, chẳng hạn như chờ vào I / O của đĩa, nó có thể không thể hoạt động theo tín hiệu được gửi.


1
Vì vậy, nếu tôi muốn có một quy trình tắt máy chung cho các container, tôi có phải bắt SIGTERM trong quy trình giám sát / runit không?
CMCDragonkai

Thực hành tốt nhất ở đây là gì? Tôi hiểu lý do tại sao chúng ta sẽ sử dụng docker killbằng tay để tiết kiệm thời gian trong khi tắt máy, nhưng trong một kịch bản, sẽ không bao giờ tốt hơn để thử tắt máy duyên dáng thông qua docker stop? Tôi vẫn thấy rất nhiều docker kills trong các kịch bản mặc dù.
Dennis

10

docker kill sẽ dừng quá trình nhập cảnh chính / chương trình đột ngột

docker stop sẽ cố gắng ngăn chặn nó một cách duyên dáng (sẽ hỏi một cách lịch sự: P)

trong cả hai trường hợp, các thay đổi hệ thống tập tin sẽ được duy trì (tại thời điểm dừng hoặc tắt) vì vậy nếu bạn docker start <container>thì nó sẽ tiếp tục từ đó.


1
... nhưng trong trường hợp có docker killbất kỳ thay đổi hệ thống tệp đang chờ xử lý nào mà quy trình chính vẫn còn trong bộ nhớ sẽ bị mất, vì vậy hệ thống tệp có thể bị hỏng?
Arjan

rõ ràng, vì là một điểm dừng đột ngột, chỉ những thay đổi tại thời điểm giết sẽ được duy trì. Bất cứ điều gì đang chờ xử lý sẽ bị mất. Quan điểm của tôi là việc giết docker không thực sự ... giết container, nó dừng quá trình. như khi bạn tắt máy tính thay vì tắt máy
vụng về

2
Docker container không phải là VM và kernel vẫn tồn tại thông qua kill. Do đó, mọi thay đổi hệ thống tập tin đã đạt đến kernel sẽ được cam kết nguyên vẹn. Không nên làm hỏng hệ thống tập tin (theo nghĩa fsck; ứng dụng có thể không muốn mất một số ghi của nó). docker killtương tự như giết chết một quá trình, không tắt nguồn máy tính.
Ian Howson

3

Và ngoài các câu trả lời được thêm vào trước đó

chạy docker eventssau docker stopchương trình sự kiện

  • kill (tín hiệu 15): trong đó tín hiệu 15 = SIGTERM
  • chết
  • dừng lại

chạy docker eventssau docker killchương trình sự kiện

  • kill (tín hiệu 9): trong đó tín hiệu 9 = SIGKILL
  • Chết (Mã thoát 137)

docker stopcó một thời gian chờ trước khi giết quá trình. Mặc định là 10 giây.

Bảng này thậm chí còn có nhiều chi tiết hơn.


1

Nó tương tự như Kéo phích cắm ra khỏi màn hìnhTắt máy tính

Giống như rút phích cắm có nghĩa là tắt nguồn cứng, docker killcó nghĩa là cách trực tiếp để giết my_container, điều này không cố gắng tắt quá trình một cách duyên dáng trước tiên.

Tắt máy tính có nghĩa là gửi tín hiệu đến HĐH để tắt tất cả các quy trình trong đó docker stopcó nghĩa là gửi SIGTERMtín hiệu đến bộ chứa đang chạy để dừng các quy trình một cách duyên dáng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.