WordPress в Docker на Ubuntu в 2026 году: установка с Compose и MariaDB

По документации 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. Это удобный стенд и вполне рабочий вариант для боевого сайта, если не забыть про бэкапы и обновления.

Источники и ссылки


Комментарии загружаются…