Які переваги докерізації nginx та php в різних контейнерах?


18

Я щойно почав працювати з Docker і Kubernetes, і я спостерігав багато стеків, в яких деякі люди будують nginx + php в одному зображенні, а деякі створюють зображення з nginx, а інше - з php (монтуючи той самий шлях і додаючи обидва контейнери в одному розгортанні в Kubernetes).

Які б були переваги побудови двох образів докера, а не встановлення обох nginx + php в одному?

Відповіді:


19

PHP з nginx зазвичай робиться за допомогою php-fpm, що є окремим процесом.

Зберігання основної ідеї докера одного процесу (див. Кінець відповіді для отримання більш детальної інформації про цю точку) на контейнер, це має сенс мати процес nginx та php-fpm в окремих контейнерах.

Оскільки зв'язок між nginx і php-fpm виникає через fastcgi, контейнер php-fpm також може знаходитися на відокремленому хості, і це дозволяє використовувати кластер контейнерів php-fpm за nginx.

Після того, як стіна коментарів ось трохи більше, в документації докера є абзац про ідею, що контейнер повинен мати лише одну проблему .

Основна ідея контейнера Linux ( lxc ) полягає у запуску процесу в ізольованому просторі імен на рівні процесора та пам'яті, докер додає поверх цього ізоляцію на рівні файлової системи.
Перевага полягає в тому, що компроміс процесу в цьому просторі імен не дозволить читати пам'ять інших процесів і як такий повинен запобігати іншим компромісам на хості.

Під час розмови про nginx та php-fpm вони працюють у парі, але кожен має свою стурбованість, nginx виконає частину HTTP, маршрутизацію, перевірку заголовків тощо, а php-fpm зробить інтерпретацію коду та поверне частину html до nginx . Хоча зазвичай обидва разом обслуговують одну заявку, що не є обов'язковим.

Залежно від контексту може бути простіше мати контейнер, що включає весь стек для програми, на робочій станції розробника для зразка. Але в ідеалі для виробничого використання намагайтеся утримувати меншу кількість взаємодії всередині контейнера, оскільки розділені процеси в одному контейнері з наглядом приносять свою частку проблеми з точки зору процесу зомбі та обробки журналу (приклад тут наведений лише для ілюстрації).

Тож нарешті я процитую докерську сторінку з деяким акцентом:

Хоча «один процес на контейнер» часто є правильним принципом, це не важке і швидке правило. Використовуйте найкраще рішення, щоб зберігати контейнери максимально чистими та модульними .

Не існує жодного "правила срібної кулі", яке стосується всього, це завжди баланс між складністю всередині контейнера і складністю, яка складається з самих контейнерів.


3
Основна ідея насправді "Кожен контейнер повинен мати лише одне питання", і "це не обов'язково правда, що на контейнер повинен бути лише один процес операційної системи". docs.docker.com/engine/userguide/eng-image/…
користувач2640621

Я визнаю, що це ярлик для ідеї, що nginx не є єдиним монолітним процесом, не є php-fpm, але замінить процес занепокоєнням у моїй відповіді, і все одно добре nginx робить маршрутизацію, php-fpm робить інтерпретацію
Tensibai

3
Відповідь, як правило, одна послуга - один порт на контейнер, а не один процес. З іншого боку, якщо у контейнері є кілька запущених процесів, вам потрібно врахувати деякі процеси init, управління сервісом, перезавантаження, незалежний журнал, незалежні залежності від пакетів, це стає дещо складніше. І іноді 1: 1 відображення перетворюється на 1: n відображення при масштабуванні.
Jiri Klouda

@Jiri грає захисника диявола: значить, апаш перед додатком рейок, що використовує DB-код постгресу, повинен переходити в один контейнер? Це лише одна послуга із зовнішньої точки зору.
Тенсібай

1
@JiriKlouda відповідь виправлена, я сподіваюся, що вона досить детальна, щоб передати всі питання, викладені в коментарях.
Тенсібай

4

Власне, однією з пропусків тут є горизонтальна масштабованість. Є стаття Джеймі Алкіза, яка давно стосується цього:

http://archive.is/pDzz0

Коротше кажучи, ви масштабуєте ваш php-fpm горизонтально для досягнення більшої продуктивності. Масштабування Nginx + php-fpm разом не приносить вам користі. Я рекомендую вам зробити кілька стрес-тестів (наприклад, Tsung, Gatling тощо); будь-ласка, не робіть Apache ab, це дуже стара іграшка), щоб перевірити, про що йдеться в статті. Я особисто маю кілька реальних світових досвіду, довели, що стаття взагалі правдива.

Але є два недоліки (можливо, не для Kubernetes) для машин з голими металами / VM:

  1. Як налаштувати Nginx динамічно виявляти зміни контейнерів php-fpm? Це легка частина.
  2. Як ми маємо спільний об'єм / файлові системи після масштабування? Контейнери Nginx та php-fpm повинні читати точно однаковий вміст, щоб досягти послідовності. Це залишає вам найменшу частину головоломки (і найсмішнішу частину) над якою працювати.

ВЕДЕНО: Зараз це майже половина року 2019. Стара модель, php-fpm + nginx в одному стручку, має інше використання. Якщо ви знайомі з сервісною сіткою, то nginx (або те, що так називають Nginmesh) служить боковою машиною для обробки трафіку, пов'язаного зі сходом на захід. Трафік, пов'язаний зі сходом на захід, в основному використовується для аутентифікації серед служб або інших фантазійних функцій, тоді як чистий php-fpm не може цього зробити.


3

Немає суттєвої переваги, яка переважає над необхідністю керування двома контейнерами. Поки ви маєте відношення між процесами 1: 1 і вони служать єдиній цілі, покладіть їх в один контейнер.


Ви маєте на увазі різні зображення в одному контейнері?
CarlosAS

Як запустити nginx та php-fpm в одному контейнері? Будь ласка, додайте приклад.
030

1
@ 030 ось приклад
CarlosAS

2
@carlos Дуже справедливий приклад для цілей розробників, я б заблокував такі речі для використання у виробництві (запуск нагляду в контейнері може легко перетворитись у піхоту)
Tensibai

Я не згоден з цією відповіддю. З цим міркуванням сервер apache з модною безпекою розмовляє з tomcat, розмовляючи з сервером postgresql, на якому розміщений лише один додаток, повинен вміщуватися в одному контейнері.
Тенсібай

-1

Перевага полягає в тому, що ви можете запускати кілька контейнерів php-fpm в бек-енді, ми називаємо це кластером PHP, через кількість портів. Приклад портів 9000, 9001, 9002 .. і так далі

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.