Представь что контейнер это виртуальная машина (это не так, но для примера) Когда ты обращаешься к localhost ты обращаешься к своей машине, а не к контейнеру. Внутри контейнера localhost этот контейнер в котором ты находишься
Надо не гадать и не в чаты писать, а документацию читать. Проброска портов это базовые знания при работе с докером о которых написано в любом нормальном туториале
Я читал доку, и как я понял, то при команде docker run он смотрит на EXPOSE, если он стоит то он берет этот порт. Но как оказалось я не правильно все понял
компоуз не поможет если человек не знает какие конфиги туда писать. Тот факт что он пробует с php dev server и не усложняет себе жизнь с nginx + php-fpm уже достойно похвал с точки зрения построения процесса обучения.