Общая папка сайта в Docker
Общая папка сайта должна называться одинаково
в обоих контейнерах,
иначе веб-сервер ищет файл не там,
где его видит интерпретатор.
Nginx строит путь из root
и имени запроса,
а FPM открывает файл
по SCRIPT_FILENAME -
оба значения должны указывать
на один и тот же каталог внутри копий.
Связка снова состоит
из web на nginx
и app на php:8.5-fpm.
Порт 8080:80
остаётся у веб-сервера,
FPM снаружи не слушает.
Строка root
в конфиге nginx
и правая часть тома
у сервиса PHP
- одна строка /var/www/html.
Слева в томе для обоих сервисов
лежит папка проекта на диске,
справа всегда /var/www/html.
Менять только путь у nginx
на /usr/share/nginx/html,
оставив FPM на /var/www/html,
нельзя:
запрос дойдёт до интерпретатора
с путём, которого нет в его контейнере.
В default.conf
root
совпадает с томом:
server {
listen 80;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass app:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
Файл compose.yaml:
services:
web:
image: nginx
ports:
- "8080:80"
volumes:
- ./site:/var/www/html
- ./default.conf:/etc/nginx/conf.d/default.conf
app:
image: php:8.5-fpm
volumes:
- ./site:/var/www/html
Сценарий site/index.php
печатает hello:
<?php
echo 'hello';
После подъёма в фоне
страница по localhost:8080
снова показывает hello,
потому что оба контейнера
видят один файл по одному пути.
Запуск проекта:
docker compose up -d
Опишите сервисы gate и php с общим каталогом ./www и ответом same, не разводя разные пути внутри контейнеров.
Убедитесь, что текст на localhost:8080 совпадает с содержимым index.php на диске.