‫Lệnh Kiểm tra sức khỏe Docker. Đó là một tính năng mới được thêm vào trong 1. 12, ra mắt vào giữa năm 2016, cùng
‫thời điểm mà Swarm Kit và Swarm Mode có sẵn trong Docker. Nó thực sự được thêm vào như một phần của bộ
‫công cụ đó, nhưng nó vẫn hoạt động trong tất cả các tệp khác nhau như Dockerfile, tệp Soạn, lệnh docker run sử dụng
‫nó, các tệp Stack hỗ trợ nó, cập nhật dịch vụ và lệnh tạo dịch vụ hỗ trợ nó.
‫.
‫Nó ở mọi nơi.
‫Tôi thực sự khuyên rằng khi bạn đang sản xuất, bạn nên tham gia vào các tùy chọn thử nghiệm cho lệnh kiểm tra
‫sức khỏe này.
‫Nó sẽ hoạt động ngay lập tức với một giám đốc điều hành.
‫Nó sẽ thực hiện lệnh đó bên trong vùng chứa giống như khi bạn đang chạy lệnh thực thi của
‫riêng mình.
‫Vì vậy, nó không chạy nó từ bên ngoài vùng chứa; nó chỉ chạy nó bên trong, có nghĩa là ngay
‫cả những nhân viên đơn giản không có cổng tiếp xúc, bạn có thể chạy một lệnh đơn giản trong đó để xác thực xem họ
‫đang trả về dữ liệu tốt hay bất cứ thứ gì.
‫Đó là một thực thi đơn giản của một lệnh, có nghĩa là nó nhận được một kết quả đơn giản. Nó mong đợi là 0 hoặc 1.
‫Trong Linux và Windows, bạn có mã thoát khỏi các lệnh và số 0 là một điều tốt.
‫Nó có nghĩa là mọi thứ đều ổn.
‫Bất kỳ điều gì khác với số 0 sẽ là lỗi trong hầu hết các ứng dụng.
‫Nhưng trong Docker, chúng ta cần ứng dụng đó để thoát khỏi 1 cụ thể. Chúng tôi sẽ cho bạn thấy cách bạn làm điều
‫đó trong một phút.
‫Chỉ có ba trạng thái để kiểm tra sức khỏe trong Docker. Nó bắt đầu với việc bắt đầu. Bắt đầu là 30 giây đầu
‫tiên, theo mặc định, khi nó chưa chạy lệnh kiểm tra sức khỏe.
‫Sau đó, nó sẽ chạy một.
‫Nếu trả về giá trị 0, nó sẽ bắt đầu bằng số khỏe mạnh. Nó sẽ thay đổi thành tùy chọn lành mạnh.
‫Nó sẽ nhận lệnh đó và nó sẽ chạy lại sau mỗi 30 giây theo mặc định. Nếu nó từng nhận được một phản hồi không lành mạnh, chẳng hạn
‫như lối ra 1, thì nó sẽ đánh dấu nó là một thùng chứa không lành mạnh.
‫Chúng tôi có các tùy chọn để kiểm soát tất cả những điều này bao gồm cả việc thử lại.
‫Chúng tôi sẽ thấy điều đó trong một phút.
‫Đây là một lựa chọn tốt hơn nhiều so với trước đây vì Docker, cho đến nay, chỉ đảm bảo
‫rằng ứng dụng vẫn đang chạy.
‫Nó không có bất kỳ thông tin chi tiết nào về việc liệu ứng dụng đó có đang làm những gì nó phải làm hay không.
‫Bây giờ chúng ta có thể làm điều đó bên trong chính vùng chứa Docker.
‫Nhưng đây không phải là giải pháp thay thế cho giải pháp giám sát của bên thứ ba của bạn.
‫Điều này sẽ không cung cấp cho bạn biểu đồ hoặc trạng thái theo thời gian hoặc bất kỳ loại công cụ nào của bên thứ ba mà bạn mong
‫đợi từ một giải pháp giám sát.
‫Đây là về việc Docker hiểu được liệu bản thân vùng chứa có mức độ lành mạnh cơ bản hay không.
‫Vì vậy, trong một Nginx, nó có thể trả về một máy chủ cục bộ của tệp chỉ mục gốc. Trả về 200 hoặc 300 đều tốt và cung cấp cho nó mã
‫thoát là 0 và nó coi nó là tốt.
‫Đó không phải là một công cụ giám sát siêu tiên tiến.
‫Nhưng nếu nó trả về lỗi 404 hoặc 500, thì nó sẽ coi nó là lỗi không lành mạnh và chúng ta có thể làm gì đó để
‫khắc phục điều đó.
‫Chúng ta sẽ xem kiểm tra sức khỏe Docker này ở đâu trong GUI?
‫Vị trí đầu tiên là trong container ls.
‫Nó sẽ chỉ xem nó là tùy chọn mới này.
‫Nó ở giữa. Chúng ta sẽ thấy trong giây lát, nơi nó sẽ hiển thị cho chúng ta một trong ba trạng thái nếu quá
‫trình kiểm tra sức khỏe đang chạy và đó là cách chúng ta thực sự biết rằng có một cuộc kiểm tra sức khỏe.
‫Đó là cách dễ nhất, ít nhất, để biết. Chúng ta sẽ thấy lịch sử, năm lần kiểm tra sức
‫khỏe gần đây nhất, hiển thị trong phần kiểm tra vùng chứa đó. Và chúng ta có thể thấy một số xu hướng cơ bản theo thời gian ở đó.
‫Nhưng lệnh chạy của docker không thực hiện hành động trên một vùng chứa không lành mạnh.
‫Khi kiểm tra sức khỏe cho rằng một vùng chứa không lành mạnh, việc chạy docker sẽ chỉ ra rằng trong lệnh ls và trong
‫quá trình kiểm tra, nhưng nó sẽ không thực hiện hành động.
‫Đó là nơi chúng tôi mong đợi Dịch vụ Swarm thực hiện hành động.
‫Vì vậy, các ngăn xếp và dịch vụ sẽ thực sự thay thế vùng chứa đó bằng một tác vụ mới, có thể trên một máy chủ mới,
‫tùy thuộc vào bộ lập lịch.
‫Ngay cả trong lệnh cập nhật, chúng tôi cũng thấy thêm một chút tiền thưởng bằng cách sử dụng kiểm tra sức khỏe vì các
‫bản cập nhật sẽ coi kiểm tra sức khỏe là một phần của sự sẵn sàng cho vùng chứa đó trước khi nó đi và thay đổi
‫vùng chứa tiếp theo.
‫Nếu một vùng chứa xuất hiện, nhưng nó không vượt qua kiểm tra tình trạng của nó, thì bản cập nhật dịch
‫vụ sẽ không chuyển sang bản tiếp theo. Hoặc nó sẽ thực hiện hành động dựa trên những thay đổi bạn cung cấp cho nó.
‫Hãy xem xét một vài ví dụ trước khi chúng ta đi đến dòng lệnh.
‫Đây là cái mà chúng tôi đang sử dụng khi chạy docker.
‫Điều này cho phép chúng tôi sử dụng hình ảnh hiện có không có kiểm tra sức khỏe trong đó và chúng tôi đang
‫thêm kiểm tra sức khỏe trong thời gian chạy.
‫Trong trường hợp này, chúng tôi đang sử dụng hình ảnh Elasticsearch. Bạn có thể thấy lệnh là cURL localhost 9200, là
‫cổng mà Elasticsearch đang chạy bên trong vùng chứa, không phải là cổng đã xuất bản mà là bên
‫trong vùng chứa. Đối với Elasticsearch,
‫có một URL tình trạng thực tế.
‫Vì vậy, chúng ta có thể sử dụng nó ở đây.
‫Bạn sẽ nhận thấy hai đường ống có dấu sai ở cuối lệnh đó.
‫Và điều đó sẽ khá
‫phổ biến nếu sử dụng một thứ gì đó như cURL hoặc một công cụ khác sẽ gửi mã lỗi không phải là 1.
‫Nhớ khi tôi đề cập đến điều đó trong khi trước đây? Chúng tôi cần nó để thoát bằng 1 nếu có vấn đề. Bởi vì đó là
‫một mã lỗi mà Docker sẽ làm điều gì đó.
‫Chúng ta cần đảm bảo rằng trong trường hợp này, một trình bao sẽ luôn trả về mã thoát 1 sai nếu có
‫bất kỳ điều gì thoát ra từ lệnh đó khác 0.
‫Đó là một cách hay để giải quyết vấn đề đó.
‫Điều này cũng xảy ra với cURL, cURL sẽ cung cấp các mã lỗi tiềm ẩn khác và chúng tôi không muốn nó
‫làm điều đó.
‫Trong các tệp Docker thực tế, chúng ta có thể thêm lệnh tương tự. Định dạng hơi khác một chút. Nhưng bạn thấy rằng
‫chúng tôi có các tùy chọn này ở đây. Chúng tôi có khoảng thời gian, thời gian chờ, khoảng thời gian bắt đầu (mới) và các lần thử lại.
‫Khoảng thời gian là những gì bạn nghĩ. Theo mặc định, cứ 30 giây một lần.
‫Tần suất thực hiện kiểm tra sức khỏe này. Thời gian chờ đợi là bao lâu trước khi lỗi và
‫trả về mã không hợp lệ, nếu có thể ứng dụng chạy chậm. Khoảng thời gian bắt đầu là một tính năng mới cho
‫phép chúng tôi bây giờ ở tuổi 17. 09 và mới hơn, để cho thời gian chờ lâu hơn 30 giây đầu tiên của thời lượng. Trước đây, nó sẽ luôn luôn
‫chờ đợi ... khoảng thời gian trước khi bắt đầu kiểm tra sức khỏe.
‫Nhưng có thể bạn có ứng dụng Java hoặc cơ sở dữ liệu hoặc thứ gì đó mất nhiều thời gian hơn để bắt đầu.
‫Có thể mất năm phút.
‫Bạn có thể thêm khoảng thời gian bắt đầu đó vào đó. Nó vẫn sẽ kiểm tra sức khỏe. Nhưng những gì nó sẽ làm
‫là nó sẽ không báo động về một kiểm tra không lành mạnh cho đến khi thời gian đó trôi qua.
‫Vì vậy, nếu bạn đặt hai phút ở đó, mặc dù nó kiểm tra sức khỏe 30 giây một lần, nó sẽ chỉ
‫coi nó là không lành mạnh khi quá hai phút đó. Lần cuối cùng ở đó, thử lại, có nghĩa là
‫chúng tôi sẽ thử kiểm tra sức khỏe này x số lần trước khi chúng tôi coi nó là không lành mạnh.
‫Điều đó cho phép một ứng dụng có khả năng không ổn định có cơ hội trở lại với trạng thái khỏe mạnh và tự phục
‫hồi trước khi chúng tôi coi đây là một vùng chứa thực sự không lành mạnh.
‫Lệnh kiểm tra sức khỏe cơ bản mà bạn sẽ sử dụng trong Dockerfile được
‫gọi là HEALTHCHECK, tất cả các chữ cái viết hoa ở đó. Định dạng tương tự tồn tại nếu chúng ta chỉ thực hiện một cURL đơn giản của máy chủ cục bộ
‫vì có thể đó là ứng dụng PHP hoặc thứ gì đó. Chúng ta có thể làm điều đó.
‫Đây là cách bạn thêm tất cả các tùy chọn đó vào Dockerfile để bạn sẽ thấy
‫cách tôi thêm khoảng thời gian chờ và các lần thử lại trước chính lệnh đó.
‫Cái đầu tiên ở đó cho lệnh cơ bản, lưu ý rằng tôi không phải đặt
‫CMD nếu tôi chỉ đưa lệnh chạy. Nhưng nếu tôi muốn hiển thị các tùy chọn, nếu tôi
‫muốn cung cấp cho nó các tùy chọn tùy chỉnh với thời gian chờ, v.v., thì tôi phải chỉ định cái nào là lệnh.
‫Bây giờ đây không phải là hai dòng khác nhau.
‫Chú ý dấu gạch chéo ngược ở cuối dòng đầu tiên ở đó.
‫Vì vậy, đừng để bị nhầm lẫn.
‫Ở đây chúng tôi có một ví dụ đơn giản về những gì nó có thể sẽ như thế nào nếu bạn có một ứng dụng tĩnh đang
‫chạy bên trong máy chủ Nginx.
‫Bạn có thể đặt khoảng thời gian và thời gian chờ từ Dockerfile của mình và bạn chỉ
‫cần thực hiện một lệnh cURL trên localhost.
‫Nếu nó trả về 200 hoặc 300, nó coi đó là tiền phạt. Nếu nó trả về 4 hoặc 5 hoặc một cái gì đó khác, nó sẽ coi đó
‫là một lỗi.
‫Bạn lưu ý ở đây rằng tôi có lối ra 1, điều này giống với lối ra sai.
‫Tôi làm vậy chỉ để cho bạn thấy rằng một số ví dụ nhất định trên Internet sẽ có sai. Một số ví dụ nhất định sẽ có
‫lối ra 1.
‫Cả hai đều làm điều tương tự.
‫Đây là một ví dụ nâng cao hơn một chút.
‫Trong trường hợp này, chúng tôi đang sử dụng một ứng dụng PHP được kết hợp với Nginx.
‫Những gì tôi đã làm là, trong các tài nguyên, bạn sẽ tìm thấy một liên kết đến ví dụ PHP này. Tôi đã thêm vào tệp cấu
‫hình Nginx tùy chỉnh sử dụng URL trạng thái Nginx và PHP-FPM.
‫Cả hai ứng dụng đó đều có trang trạng thái riêng và loại URL ping kiểm tra sức khỏe.
‫Bạn có thể sử dụng chúng trong ứng dụng của mình nếu bạn đang sử dụng PHP hoặc Nginx. Có hai URL khác nhau, nhưng bạn có thể
‫sử dụng cả hai URL trong cùng một kiểm tra sức khỏe.
‫Trong trường hợp này, chúng tôi chỉ sử dụng một trong số chúng và chúng tôi đang đưa vào localhost
‫/ ping, đây thực
‫sự là một lệnh trạng thái PHP-FPM, nhưng bạn phải bật nó bên trong PHP-FPM của mình. Một lần nữa, trong các tài nguyên của bài giảng này, có
‫một liên kết đến một PHP Docker Good Defaults.
‫Bạn có thể kiểm tra điều đó trên GitHub mà tôi đã trình bày trong ví dụ này chi tiết hơn một chút.
‫Tiếp theo, chúng ta có một ví dụ về Postgres để trong Dockerfile, tôi có thể sử dụng một URL khác.
‫Ở đây chúng tôi có một ứng dụng Postgres mà trong lệnh kiểm tra sức khỏe, tôi đang sử dụng lệnh pg.
‫Giờ đây, với các ứng dụng khác nhau, có các công cụ khác nhau. Với Postgres, nó đi kèm với một công cụ tích hợp,
‫đó là một thử nghiệm rất đơn giản về kết nối với máy chủ Postgres.
‫Nó không xác thực rằng bạn có dữ liệu tốt hay cơ sở dữ liệu của bạn được gắn kết đúng cách. Nó chỉ đơn giản là nói, 'Máy chủ cơ sở dữ liệu
‫này có cho phép kết nối không? Có hay không? 'Đó là một điều
‫gọn gàng mà bạn có thể làm được.
‫Đây là những gì nó sẽ trông như thế nào trong một tệp composer / stack.
‫Rất tương đồng.
‫Bạn sẽ nhận thấy rằng khoảng thời gian bắt đầu ở đó yêu cầu một phiên bản khác.
‫Kể từ khi lệnh kiểm tra sức khỏe xuất hiện trong 1. 12, nó thực sự được hỗ trợ trong 2. 1 của tệp Soạn
‫này.
‫Tuy nhiên, nếu bạn đang sử dụng giai đoạn bắt đầu, điều đó có nghĩa là bạn phải cập nhật tệp Soạn
‫của mình lên phiên bản 3. 4 để hỗ trợ điều đó. Bởi vì khoảng thời gian bắt đầu xuất
‫hiện hơn một năm sau khi lệnh kiểm tra sức khỏe thực hiện.
‫Hãy bắt đầu với một số lệnh chạy đơn giản.
‫Những gì chúng tôi sẽ làm ở đây là chúng tôi sẽ khởi động một máy chủ cơ sở dữ liệu Postgres mà không có kiểm tra
‫sức khỏe bởi vì theo mặc định, nó không đi kèm.
‫Sau đó, chúng ta sẽ chạy lại nó bằng lệnh kiểm tra sức
‫khỏe thủ công sẽ thêm vào dòng lệnh và chúng ta sẽ thấy sự khác biệt.
‫Ở đây, chúng tôi sẽ gọi cái đầu tiên là p1. Chúng tôi sẽ chạy nó tách khỏi hình ảnh Postgres
‫chính thức.
‫Nếu tôi làm một hộp chứa docker ls, bạn sẽ thấy rằng không có gì chỉ ra một cuộc kiểm tra sức khỏe ở đây.
‫Nếu chúng ta thực hiện lại lệnh đó và gọi nó là p2 lần này, chúng ta sẽ thêm một lệnh sức khỏe.
‫Lần này, chúng ta sẽ sử dụng pg đã có, mà chúng ta đã nói trước đó, để kiểm tra xem
‫các kết nối có sẵn trên máy chủ Postgres này hay không. Chúng tôi sẽ nói với nó rằng người dùng chúng
‫tôi cần là người dùng postgres. Chúng tôi thực sự không cần phải cung cấp mật khẩu cho nó. Nó sẽ không
‫cố gắng đăng nhập. Nó chỉ sẽ cố gắng xác nhận. Chúng tôi sẽ sử dụng hình ảnh Postgres.
‫Bây giờ nếu chúng ta làm một công cụ chứa docker ls và tôi thu nhỏ một chút, bạn sẽ thấy nó nói, 'Thời gian hoạt động lên 4 giây đang
‫bắt đầu. 'Bây giờ chúng
‫tôi nhận được tính năng bổ sung này trong trạng thái lệnh ls của chúng tôi. Nó sẽ ở trạng thái bắt đầu trong 30 giây
‫mặc định cho đến
‫khi nó chạy lệnh kiểm tra sức khỏe lần đầu tiên.
‫Bây giờ chúng tôi đã đợi hơn 30 giây, bạn sẽ thấy rằng nó đã chuyển sang trạng thái khỏe mạnh.
‫Nếu chúng tôi thực hiện kiểm tra bộ chứa docker trên p2 đó, chúng tôi sẽ thấy ở phía trên cùng rằng chúng tôi có tùy chọn
‫trạng thái sức khỏe mới này. Trong trường hợp này, tôi chỉ có thể chạy nó hai lần.
‫Bạn có thể thấy đầu ra ở đó, rằng nó cho thấy nó đang chấp nhận các kết nối.
‫Được rồi. Hãy thực hiện một số dịch vụ tạo lệnh cho cùng một cơ sở dữ liệu đó, trong cùng một bài kiểm tra sức khỏe thử nghiệm.
‫Những gì chúng ta sẽ thấy ở đây khi chúng ta làm điều này là có ba trạng thái khác nhau mà một dịch vụ sẽ trải
‫qua khi khởi động.
‫Nó đang chuẩn bị, thường có nghĩa là nó đang tải xuống hình ảnh. Nó đang bắt đầu, có nghĩa là nó đang thực thi
‫vùng chứa và đưa nó lên. Sau đó, nó đang chạy.
‫Không có lệnh kiểm tra sức khỏe, việc khởi động và chạy rất nhanh chóng. Chúng gần như ngay lập tức.
‫Chúng ta sẽ thấy điều đó ở đây với dịch vụ docker tạo tên postgres p1.
‫Sau khi hoàn tất quá trình chuẩn bị bằng cách tải xuống hình ảnh, bạn sẽ thấy rằng hình ảnh sẽ hoạt động ngay lập tức từ
‫khi bắt đầu đến khi chạy, vì không có kiểm tra sức khỏe. Nó không có việc gì khác để làm ngoài việc khởi động vùng chứa
‫và nói, 'Đúng. Hệ nhị phân đang chạy. 'Nhưng nếu chúng
‫ta thực hiện cùng một lệnh đó, dịch vụ docker sẽ tạo và gọi nó là p2 như trước, và cung cấp cho nó lệnh tình trạng
‫tương tự.
‫Chúng tôi bắt đầu dịch vụ này bằng lệnh kiểm tra sức khỏe được tích hợp sẵn.
‫Những gì chúng ta sẽ thấy là nó sẽ đi từ chuẩn bị đến bắt đầu và nó sẽ ở trạng thái bắt đầu
‫trong 30 giây mặc định cho đến khi kiểm tra sức khỏe đầu tiên chạy.
‫Đây hiện là dịch vụ Docker mong đợi một trạng thái khỏe mạnh trước khi nó coi dịch vụ
‫này đang hoạt động hoàn toàn. Sau khi kết thúc 30 giây, nó sẽ chuyển sang trạng thái đang chạy. Sau đó, chúng tôi nhận được xác minh nhỏ cuối cùng
‫ở đó, chỉ để đảm bảo rằng nó được coi là ổn định và sau đó chúng tôi hoàn tất.
‫Ngoài ra, bạn có thể thấy rằng với các dịch vụ, cũng như các bản cập nhật dịch vụ,
‫chúng tôi sẽ nhận được phần thưởng bổ sung về khái niệm sức khỏe nếu chúng tôi sử dụng các lệnh này bất cứ khi nào có thể.