Skip to content
mrVanich
Назад до нотаток

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 version

2. Структура на диску 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.php

3. Контейнери в 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, домен, резервні копії, контроль доступу та регулярні оновлення.

Джерела