Những lợi thế của dockerizing nginx và php trong các container khác nhau là gì?


18

Tôi mới bắt đầu làm việc với Docker và Kubernetes và tôi đã xem rất nhiều ngăn xếp, trong đó một số người xây dựng nginx + php trong một hình ảnh duy nhất và một số xây dựng một hình ảnh với nginx và một hình ảnh khác với php (gắn cùng một đường dẫn và bao quanh cả hai container trong cùng một triển khai trong Kubernetes).

Điều gì sẽ là lợi thế của việc xây dựng hai hình ảnh docker thay vì cài đặt cả nginx + php trong cùng một?

Câu trả lời:


19

PHP với nginx thường được thực hiện bằng cách sử dụng php-fpm, đây là một tiến trình riêng biệt.

Giữ ý tưởng cốt lõi về docker của một quy trình (xem phần cuối của câu trả lời để biết thêm chi tiết về điểm này) cho mỗi container, điều này có ý nghĩa để có quy trình nginx và quy trình php-fpm trong các container riêng biệt.

Khi giao tiếp giữa nginx và php-fpm phát sinh thông qua fastcgi, bộ chứa php-fpm cũng có thể nằm trên một máy chủ riêng biệt và điều này cho phép sử dụng một cụm các thùng chứa php-fpm phía sau nginx.

Sau bức tường bình luận ở đây có thêm một chút nền tảng, tài liệu về docker có đoạn về ý tưởng rằng một container chỉ nên có một mối quan tâm .

Ý tưởng chính của một thùng chứa linux ( lxc ) là để chạy một tiến trình trong một không gian tên bị cô lập ở cấp độ cpu và bộ nhớ, docker thêm vào trên một sự cô lập ở cấp độ hệ thống tập tin.
Ưu điểm là sự thỏa hiệp của một quy trình trong không gian tên này sẽ không cho phép đọc bộ nhớ của các quy trình khác và do đó sẽ ngăn chặn sự thỏa hiệp khác trên máy chủ.

Trong khi nói về nginx và php-fpm, chúng hoạt động theo cặp nhưng mỗi người có một mối quan tâm riêng, nginx sẽ thực hiện phần HTTP, định tuyến, xác thực tiêu đề, v.v. và php-fpm sẽ thực hiện giải thích mã và trả lại phần html cho nginx . Mặc dù thông thường có cả hai cùng nhau phục vụ một ứng dụng duy nhất không bắt buộc.

Tùy thuộc vào ngữ cảnh, có thể có một thùng chứa bao gồm cả ngăn xếp cho một ứng dụng, trên một máy trạm dành cho nhà phát triển có thể dễ dàng hơn. Nhưng lý tưởng cho việc sử dụng sản xuất, cố gắng giữ ít tương tác bên trong container hơn, việc tách các quy trình trong cùng một container với giám sát viên mang đến một phần vấn đề về quy trình zombie và xử lý nhật ký (ví dụ câu chuyện ở đây chỉ nhằm mục đích minh họa).

Vì vậy, cuối cùng tôi sẽ trích dẫn trang docker với một số điểm nhấn:

Trong khi một quy trình trên mỗi container thì thường là một quy tắc tốt, nhưng đó không phải là quy tắc khó và nhanh. Sử dụng phán đoán tốt nhất của bạn để giữ cho container càng sạch sẽ và mô-đun càng tốt .

Không có "quy tắc viên đạn bạc" áp dụng cho mọi thứ, đó luôn là sự cân bằng giữa sự phức tạp trong container và sự phức tạp trong việc tự sắp xếp các container.


3
Ý tưởng cốt lõi thực sự là "Mỗi container chỉ nên có một mối quan tâm" và "không nhất thiết phải đúng là chỉ có một quy trình hệ điều hành cho mỗi container". docs.docker.com/engine/userguide/eng-image/ từ
user2640621

Tôi thừa nhận đó là một lối tắt để tấn công ý tưởng, nginx không phải là một quá trình nguyên khối đơn lẻ cũng không phải là php-fpm, nhưng thay thế quá trình bằng mối quan tâm trong câu trả lời của tôi và nó vẫn ổn khi định tuyến, php-fpm thực hiện giải thích
Tensibai

3
Câu trả lời thường là một dịch vụ một cổng trên mỗi container, không thực sự là một quá trình. Mặt khác, nếu bạn có nhiều quy trình đang chạy trong một container, bạn cần xem xét một số quy trình init, quản lý dịch vụ, khởi động lại, ghi nhật ký độc lập, phụ thuộc gói độc lập, nó sẽ phức tạp hơn một chút. Và đôi khi ánh xạ 1: 1 biến thành ánh xạ 1: n khi chia tỷ lệ.
Jiri Klouda

@Jiri chơi người ủng hộ của quỷ: vì vậy một apache trước một ứng dụng đường ray bằng cách sử dụng DB postgres nên đi trong cùng một container? Rốt cuộc, đó chỉ là một dịch vụ theo quan điểm bên ngoài.
Tensibai

1
Câu trả lời @JiriKlouda được sửa đổi, tôi hy vọng nó đủ chi tiết để truyền đạt tất cả các điểm nêu ra trong các nhận xét.
Tensibai

4

Trên thực tế, một điểm còn thiếu ở đây là khả năng mở rộng theo chiều ngang. Có một bài viết từ Jamie Alquiza từ lâu đã đề cập đến điều này:

http://archive.is/pDzz0

Nói tóm lại, bạn mở rộng quy mô php-fpm theo chiều ngang để đạt hiệu suất cao hơn. Chia tỷ lệ Nginx + php-fpm với nhau không mang lại cho bạn bất kỳ lợi ích nào. Tôi khuyến khích bạn thực hiện một số thử nghiệm căng thẳng (ví dụ: Tsung, Gatling, v.v.; Xin vui lòng không làm Apache ab, đó là một món đồ chơi rất cũ) để xác minh những gì bài báo đã nêu. Cá nhân tôi có một số kinh nghiệm trong thế giới thực đã chứng minh bài báo nói chung là đúng.

Nhưng có hai nhược điểm (có thể không phải với Kubernetes) đối với máy / máy ảo kim loại trần:

  1. Làm cách nào để định cấu hình Nginx tự động khám phá các thay đổi của bộ chứa php-fpm? Đây là phần dễ dàng.
  2. Làm thế nào để chúng tôi chia sẻ cùng một hệ thống khối lượng / tập tin sau khi nhân rộng? Các thùng chứa Nginx và php-fpm nên đọc chính xác cùng một nội dung để đạt được sự thống nhất. Điều này để lại cho bạn phần câu đố ít nhất (và phần thú vị nhất) để làm việc.

EDITED: Bây giờ đã gần một nửa năm 2019. Mô hình cũ, php-fpm + nginx trong cùng một nhóm, có cách sử dụng khác nhau. Nếu bạn quen thuộc với lưới dịch vụ, thì nginx (hay còn gọi là Nginmesh) sẽ đóng vai trò là một bên để xử lý lưu lượng truy cập theo hướng đông tây. Lưu lượng truy cập giới hạn đông tây chủ yếu được sử dụng để xác thực giữa các dịch vụ hoặc các chức năng ưa thích khác, trong khi php-fpm thuần túy không thể làm điều đó cùng.


3

Không có lợi ích có ý nghĩa nào vượt trội hơn việc phải quản lý hai container. Miễn là bạn có mối quan hệ 1: 1 giữa các quy trình và chúng phục vụ một mục đích duy nhất, hãy đặt chúng vào cùng một thùng chứa.


Bạn có nghĩa là hình ảnh khác nhau trên cùng một container?
CarlosAS

Làm thế nào bạn sẽ bắt đầu nginx và php-fpm trong cùng một container? Vui lòng thêm một ví dụ.
030

1
@ 030 ở đây một ví dụ
CarlosAS

2
@carlos Ví dụ rất hợp lệ cho mục đích phát triển, tôi sẽ chặn loại này để sử dụng sản xuất (chạy giám sát trong một container có thể biến thành một khẩu súng ngắn khá dễ dàng)
Tensibai

Tôi không đồng ý với câu trả lời đó, với lý do này, một máy chủ apache có bảo mật mod nói chuyện với một con mèo con đang nói chuyện với một máy chủ postgresql chỉ lưu trữ một ứng dụng trong một container.
Tenibai

-1

Ưu điểm là: bạn có thể chạy nhiều bộ chứa php-fpm ở back-end, chúng tôi gọi nó là cụm PHP, thông qua số lượng cổng. Ví dụ cổng 9000, 9001, 9002 .. vân vân

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.