Docker на Windows 11: швидкий Nginx + PHP вебсервер на диску D:
Це швидкий спосіб підняти локальний вебсервер для тестування на Windows 11: код лежить на диску D:, керування виконується з PowerShell, а весь стек Nginx і PHP описаний у Docker Compose. Проєкт можна зупинити, перенести або відтворити на іншому комп’ютері однією командою.
Що саме зберемо
- Nginx приймає запити на
http://localhost:8080; - PHP-FPM 8.3 виконує PHP-код;
- файли сайту з
D:\docker-web\siteпідключені до контейнерів через bind mount; compose.yamlі конфіги можна зберігати у Git та клонувати на інший ПК.
Важливе уточнення: Docker Desktop на Windows зазвичай використовує WSL 2 як бекенд Linux-контейнерів. У цій статті «класичний Windows-варіант» означає, що робота йде з PowerShell, а проєкт зберігається на D:, а не всередині файлової системи Linux-дистрибутива WSL. Обидва підходи можуть співіснувати на одному ПК.
1. Docker Desktop і перевірка
Встановіть Docker Desktop, оберіть Linux containers та дочекайтеся статусу Engine running. У PowerShell перевірте:
docker version
docker compose version2. Структура на диску D:
New-Item -ItemType Directory -Force D:\docker-web\site
New-Item -ItemType Directory -Force D:\docker-web\nginx
New-Item -ItemType Directory -Force D:\docker-web\php
Set-Location D:\docker-webУ результаті будуть файли:
D:\docker-web\
├── compose.yaml
├── nginx\default.conf
├── php\Dockerfile
└── site\index.php3. Контейнери в compose.yaml
Створіть D:\docker-web\compose.yaml:
services:
nginx:
image: nginx:1.27-alpine
ports:
- "8080:80"
volumes:
- ./site:/var/www/html:ro
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
- php
restart: unless-stopped
php:
build: ./php
volumes:
- ./site:/var/www/html
restart: unless-stoppedУ записі 8080:80 перше число – порт Windows-хоста, друге – порт усередині Nginx. Тому браузер відкриває localhost:8080, а контейнер слухає 80. Між собою сервіси бачать один одного за назвою, тому фіксовані IP контейнерів не потрібні.
4. Конфігурація Nginx
У D:\docker-web\nginx\default.conf:
server {
listen 80;
server_name _;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass php:9000;
}
}5. PHP-образ
У D:\docker-web\php\Dockerfile:
FROM php:8.3-fpm-alpine
WORKDIR /var/www/html
RUN docker-php-ext-install opcache
CMD ["php-fpm"]Якщо буде потрібне розширення, наприклад pdo_mysql, його додають до Dockerfile. Windows при цьому залишається чистою.
6. Тестова PHP-сторінка
Створіть D:\docker-web\site\index.php:
<?php
declare(strict_types=1);
$now = (new DateTimeImmutable('now'))->format('Y-m-d H:i:s');
?>
<!doctype html>
<html lang="uk">
<head><meta charset="utf-8"><title>Docker PHP test</title></head>
<body>
<h1>Nginx + PHP працюють</h1>
<p>Час контейнера: <?= htmlspecialchars($now, ENT_QUOTES, 'UTF-8') ?></p>
<p>PHP версія: <?= PHP_VERSION ?></p>
</body>
</html>7. Запуск і перевірка
Set-Location D:\docker-web
docker compose up --build -d
docker compose ps
Start-Process http://localhost:8080Сторінка має показати, що Nginx і PHP працюють. Перевірка без браузера:
Invoke-WebRequest http://localhost:8080 | Select-Object -ExpandProperty StatusCode
docker compose logs -f nginx phpЗміни в site видно одразу – перезбирання не потрібне. Після зміни Nginx-конфіга достатньо docker compose restart nginx.
Клонування та чисте завершення
git clone https://example.com/your-account/docker-web.git D:\docker-web
Set-Location D:\docker-web
docker compose up --build -d
# зупинити стек
docker compose downУ Git зберігайте compose.yaml, Dockerfile, Nginx-конфіг і код. Не комітьте справжні .env, паролі, ключі та дампи бази. Для змінних використовуйте .env.example.
Це локальний стенд для розробки, не готовий інтернет-сервер. Для публічного запуску потрібні HTTPS, домен, резервні копії, контроль доступу та регулярні оновлення.