По документации Docker на октябрь 2026 года Docker Engine официально ставится на Ubuntu 26.04, 24.04 и 22.04, а официальный образ WordPress на Docker Hub уже собран с WordPress 7.1.3. За три года с первой версии этой заметки поменялось почти всё в установке: ключ больше не кладут через apt-key, Compose стал плагином docker compose, а MySQL 5.7 из старого примера давно без поддержки. Ниже актуальная схема: Docker из официального репозитория, WordPress и MariaDB в одном compose-файле.
Зачем вообще WordPress в Docker: база и PHP изолированы от системы, проект переносится папкой, второй стенд поднимается за минуту. Для продакшена отдельно нужны HTTPS, нормальные пароли и бэкапы, о них ниже.
Сначала про файрвол
Docker сам пишет правила iptables, и опубликованные порты контейнеров проходят мимо ufw и firewalld. Это первое предупреждение в инструкции Docker, и о нём часто забывают: открыли 8080:80, а сайт без HTTPS торчит в интернет, хотя ufw его «закрывает». Поэтому порт WordPress ниже привязан к 127.0.0.1, а наружу смотрит обратный прокси. Подробности в разделе Packet filtering and firewalls.
Шаг 1. Docker Engine из официального репозитория
Сначала удалите неофициальные пакеты из репозитория Ubuntu, если они стоят: они конфликтуют с пакетами Docker.
sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc docker-buildx podman-docker containerd runc | cut -f1)
Потом ключ и репозиторий. Ключ лежит в /etc/apt/keyrings, а репозиторий описан файлом docker.sources в новом формате deb822:
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
Ставим движок вместе с плагинами Buildx и Compose и проверяем:
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo systemctl status docker sudo docker run hello-world docker compose version
Отдельно качать бинарник docker-compose с GitHub, как было в старой версии заметки, больше не нужно: Compose V2 ставится пакетом docker-compose-plugin и вызывается как docker compose, через пробел. Чтобы не писать sudo перед каждой командой, пользователя добавляют в группу docker по инструкции после установки, но помните, что эта группа по правам равна root.
Шаг 2. compose.yaml с WordPress и MariaDB
По требованиям WordPress сейчас рекомендуются PHP 8.3 и выше и MariaDB 10.11+ или MySQL 8.0+. Образ wordpress:latest как раз собран на PHP 8.3 с Apache. Для базы возьмём MariaDB 11.8: это LTS-ветка с поддержкой до 2028 года.
Создайте папку проекта и файл .env с паролями, чтобы не держать их в compose-файле:
mkdir ~/wordpress && cd ~/wordpress cat > .env <<EOF DB_PASSWORD=$(openssl rand -base64 24) DB_ROOT_PASSWORD=$(openssl rand -base64 24) EOF chmod 600 .env
Теперь compose.yaml:
services:
db:
image: mariadb:11.8
restart: unless-stopped
environment:
MARIADB_DATABASE: wordpress
MARIADB_USER: wordpress
MARIADB_PASSWORD: ${DB_PASSWORD}
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
volumes:
- db:/var/lib/mysql
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 10s
timeout: 5s
retries: 5
wordpress:
image: wordpress:latest
restart: unless-stopped
depends_on:
db:
condition: service_healthy
ports:
- "127.0.0.1:8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
WORDPRESS_DB_NAME: wordpress
volumes:
- wp:/var/www/html
volumes:
db:
wp:
Что изменилось против старого примера. Строки version: '3.3' нет: по справке Compose это поле устарело, Compose всегда берёт последнюю схему и только предупреждает о нём. MySQL 5.7 заменён на MariaDB 11.8, пароли вынесены в .env, файлы сайта лежат в отдельном томе wp, а WordPress ждёт, пока база реально поднимется, через healthcheck. Порт слушает только localhost.
Официальный пример на Docker Hub устроен так же, только с mysql:8.0. Эту ветку стоит заменить: поддержка MySQL 8.0 закончилась в апреле 2026 года. Если нужен именно MySQL, берите mysql:8.4, это LTS с поддержкой до 2032 года.
Шаг 3. Запуск и первый вход
docker compose up -d docker compose ps docker compose logs -f wordpress
Когда оба контейнера в статусе running, а db ещё и healthy, откройте http://localhost:8080 на самом сервере или пробросьте порт через SSH: ssh -L 8080:127.0.0.1:8080 user@server. Дальше обычный мастер WordPress: язык, название сайта, администратор.
Наружу через обратный прокси с HTTPS
Для боевого сайта перед контейнером ставят nginx или Caddy с сертификатом Let’s Encrypt, который проксирует домен на 127.0.0.1:8080. Чтобы WordPress понимал, что запрос пришёл по HTTPS, прокси должен передавать заголовок X-Forwarded-Proto: официальный образ его учитывает.
Ещё одна особенность официального образа, о которой написано в его описании: он не умеет отправлять почту, потому что внутри нет почтового агента. Письма с форм и восстановление пароля настраивают через SMTP-плагин, а чтобы письма не уходили в спам, домену нужны SPF, DKIM и DMARC.
Полезные команды и бэкапы
docker compose pull && docker compose up -d # обновить образы docker compose down # остановить, данные остаются # docker compose down -v удалит тома db и wp вместе с базой и файлами # дамп базы docker compose exec db sh -c 'mariadb-dump -u root -p"$MARIADB_ROOT_PASSWORD" wordpress' > wordpress.sql
Бэкап такого сайта это дамп базы плюс содержимое тома wp, прежде всего wp-content. Обновление образа WordPress не обновляет уже установленные файлы ядра в томе: ядро, темы и плагины обновляются из админки, как на обычном хостинге.
В итоге WordPress в Docker на Ubuntu в 2026 году ставится так: Docker из официального репозитория с ключом в keyrings, Compose как плагин, compose.yaml без version, с MariaDB 11.8 или MySQL 8.4, паролями в .env и портом на localhost за прокси с HTTPS. Это удобный стенд и вполне рабочий вариант для боевого сайта, если не забыть про бэкапы и обновления.