Как правильно развернуть окружение через Docker?
Всё отдельно - Nginx, php-fpm, Node.js. Каждый контейнер имеет свой публичный API, в данном случае это порт, на котором он слушает. Потом контейнеры общаются между собой, к примеру, Nginx перенаправляет запросы на php-fpm или Node.js если нужно.
Возникает вопрос, зачем такие городушки? Лично у меня при подобной связке возникли проблемы, контейнер можно прилинковать лишь однажды к другому контейнеру, это когда я делал свзяку Nginx+PHP-FPM+MariaDB в результате когда я хотел контейнер с апачем подвешать к той же Maria наступил на грабли, линковаться контейнеры не хотели, хранилище у них конечно была замаплена папка, но на новую БД которая видна через апача пришлось поднять пару новых контейнеров, отсюда памяти я скушал побольше, с учетом VPS хостинга это не экономно к ресурсам. В результате все склонилось к тому, что на DEV окружении докер был убит раз и навсегда, единственный плюс вижу в нем когда на физически одном DEV сервере сидит не один разработчик и у них разные прокеты, тогда логичней все окружение загнать в один контейнер для конкретного разраба, и не плодить зоопарк из контейнеров.