Нещодавно ми зібрали WordPress руками, по-дорослому - Apache з PHP-FPM, MariaDB з окремим юзером, Redis object cache. Корисно, бо розумієш, що з чого складається. Але щодня так ніхто не робить: у проді той самий стек живе в контейнерах. Коли знаєш, що всередині, docker compose перестає бути магією - це просто зручна упаковка тих самих чотирьох речей. Зберемо її.
Що потрібно зробити?#
Підняти той самий стек - WordPress, база, кеш - але одним compose.yml: три сервіси (wordpress, mariadb, redis), дані в іменованих volume, база з healthcheck, Redis як object cache. Плюс wp-cli окремим one-off сервісом, щоб ставити плагіни й робити install, не лізучи в контейнер руками.
З чим працюю?#
| |
Цього разу - Ubuntu 26.04 (щоб показати, що стек від дистрибутива не залежить: Docker є Docker). Передумова одна: Docker уже стоїть. Якщо ще ні - як поставити його по-людськи з офіційного репо, я показував окремо: Docker на свіжому Debian (на Ubuntu - те саме, лише шлях репозиторію linux/ubuntu). Усе роблю від root.
Далі ті самі кроки з запису, тільки вже можна копіювати.
Крок 1. Каталог і секрети#
Створюємо каталог проєкту й кладемо паролі бази в .env - окремо від compose.yml, щоб не світити їх у головному файлі:
| |
| |
.env docker compose підхоплює сам і підставляє в ${DB_PASSWORD}. Додай його в .gitignore - паролям не місце в репозиторії.Крок 2. compose.yml#
Увесь стек - в одному файлі. Розберемо його нижче, а поки - цілком:
| |
Що тут важливо, по порядку:
dbз healthcheck, аwordpressчекає наcondition: service_healthy. Без цього WordPress стартує швидше за базу і падає з «Error establishing a database connection». Healthcheck - це те, що в ручному варіанті робив порядок команд, а тут робить сам compose.- Іменовані volume
db_dataіwp_data- дані переживаютьdown/upі перестворення контейнерів. Без них перший жеdownз’їв би і базу, і сайт. - Redis object cache вмикається не змінними контейнера, а константами в
wp-config.php- їх даєWORDPRESS_CONFIG_EXTRA. - Якорь
x-wp-env(&wp-env/*wp-env) - щоб ті самі налаштування бачив іwordpress, іwpcli. Інакшеwp-cliне знав би проWP_REDIS_HOSTі стукав би в127.0.0.1замість сервісуredis. wpcli- окремий сервіс у профіліcli: зdocker compose upвін не стартує (нема сенсу тримати його живим), його запускають разово черезdocker compose run --rm wpcli ....user: "33:33"- щоб писати у volume під тим самимwww-data, що й офіційний образ (в образіwordpress:cliсвій uid, і без цього плагіни не встановляться через права).HOME: /tmp- щоб wp-cli було куди класти кеш.
Крок 3. Піднімаємо#
| |
up -d підтягне образи (якщо їх ще нема), створить мережу, volume і три контейнери. Завдяки healthcheck compose дочекається, поки база стане healthy, і лише тоді підніме WordPress. У ps маєш побачити три сервіси - db (healthy), redis, wordpress з проброшеним портом 8080.
Крок 4. Встановлюємо WordPress через wp-cli#
Образ піднявся, але сайт ще не встановлений - це зробимо one-off запуском wpcli. Звернень до контейнера руками нема, усе через docker compose run:
| |
Крок 5. Вмикаємо Redis object cache#
Ставимо плагін redis-cache, активуємо його і вмикаємо dropin - знову через wpcli:
| |
WP_REDIS_HOST ми вже віддали через compose.yml (сервіс redis), тож плагін одразу знає, куди під’єднуватись.
Перевірка#
| |
| |
Connected + Drop-in: Valid - кеш працює. Зверни увагу: Client: Predis, а не PhpRedis, як у ручному варіанті. Офіційний образ wordpress:cli не має розширення phpredis, тому плагін бере чистий PHP-клієнт Predis - у бандлі. Для кешу це не критично, усе працює; просто корисно знати, чому цифри різняться. А сам сайт уже віддає 200:
| |
| |
Apache чи все-таки щось легше?#
Маленька чесність наостанок: офіційний образ wordpress:*-apache віддає PHP як модуль Apache (mod_php), а не через PHP-FPM, як ми робили руками. Для одноразового стенду чи невеликого сайту це цілком нормально - образ готовий, працює з коробки. Але якщо хочеться саме FPM (а ще легше - nginx спереду) - це вже окрема розмова про вебсервер. База, Redis і сам WordPress при цьому не змінюються - міняється лише фронт.
Той самий стек, що й руками - Apache, PHP, MariaDB, Redis - тільки описаний одним
compose.ymlі піднятий однією командою. Руками ти розумієш, що всередині; у compose - керуєш цим як одним цілим. Одне доповнює інше.



