WordPress CMS (Content Management System) — это широко используемая платформа с открытым исходным кодом, которая позволяет пользователям создавать, управлять и публиковать цифровой контент, в основном для веб-сайтов и блогов. Выпущенная в 2003 году, WordPress стала самой популярной в мире CMS, на которой работает более 40 % всех сайтов в Интернете. Она предлагает удобный интерфейс, позволяющий людям, практически не имеющим опыта работы с кодами, создавать и поддерживать веб-сайты профессионального качества. WordPress обладает широкими возможностями настройки, тысячи тем и плагинов расширяют его функциональность, удовлетворяя самые разнообразные потребности — от простых блогов до сложных сайтов электронной коммерции. Сильная поддержка сообщества, регулярные обновления и обширная документация делают его надежным и универсальным выбором как для новичков, так и для опытных разработчиков.
Docker — это платформа с открытым исходным кодом, предназначенная для автоматизации развертывания, масштабирования и управления приложениями в рамках легких переносимых контейнеров. Появившись в 2013 году, Docker произвел революцию в разработке программного обеспечения, обеспечив согласованную среду для запуска приложений независимо от того, где они развернуты — на локальной машине разработчика, в локальных центрах обработки данных или в облаке. Контейнеры объединяют приложение со всеми его зависимостями, библиотеками и конфигурационными файлами, обеспечивая согласованную производительность в различных средах. Контейнеризация упрощает рабочий процесс разработки, улучшает совместную работу и повышает эффективность, позволяя разработчикам создавать, совместно использовать и запускать приложения без проблем. Экосистема Docker включает в себя инструменты и сервисы для оркестровки контейнеров, такие как Docker Swarm и Kubernetes, которые облегчают управление крупномасштабными развертываниями контейнеров, что делает эту технологию краеугольным камнем в современной практике DevOps.
В этом руководстве вы узнаете, как установить WordPress с помощью Docker/Docker Compose. Используя Docker, процесс установки предпочтительного стека становится намного проще. Вы можете использовать одну и ту же конфигурацию для быстрой установки WordPress на нескольких серверах. Мы также установим инструмент phpMyAdmin для управления базами данных и прокси-сервер Nginx для обслуживания сайта через SSL.
Предварительные условия
- Сервер Linux с пользователем, не являющимся пользователем root и имеющим привилегии sudo. В нашем учебнике мы используем сервер под управлением Ubuntu 24.04.
- Полностью определенное доменное имя (FQDN), указывающее на ваш сервер. Для наших целей мы будем использовать
example.comв качестве доменного имени для сайта WordPress иphpmyadmin.example.comдля сайта phpMyAdmin. - Убедитесь, что все обновлено.
$ sudo apt update
- Установите основные пакеты утилит. Некоторые из них могут быть уже установлены.
$ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y
Шаг 1 — Настройка брандмауэра
Первым шагом будет настройка брандмауэра. По умолчанию Ubuntu поставляется с ufw (Uncomplicated Firewall).
Проверьте, запущен ли брандмауэр.
$ sudo ufw status
Вы должны получить следующий результат.
Status: inactive
Разрешите порт SSH, чтобы брандмауэр не разорвал текущее соединение при его включении.
$ sudo ufw allow OpenSSH
Разрешите также порты HTTP и HTTPS.
$ sudo ufw allow http $ sudo ufw allow https
Включите брандмауэр
$ sudo ufw enable Command may disrupt existing ssh connections. Proceed with operation (y|n)? y Firewall is active and enabled on system startup
Еще раз проверьте состояние брандмауэра.
$ sudo ufw status
Вы должны увидеть аналогичный результат.
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 80/tcp ALLOW Anywhere 443 ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) 80/tcp (v6) ALLOW Anywhere (v6) 443 (v6) ALLOW Anywhere (v6)
Шаг 2 — Установите Docker и Docker Compose
Ubuntu 22.04 поставляется со старой версией Docker. Чтобы установить последнюю версию, сначала импортируйте ключ Docker GPG.
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
Создайте файл репозитория Docker.
$ echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Обновите список системных репозиториев.
$ sudo apt update
Установите последнюю версию Docker.
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
Убедитесь, что он запущен.
$ sudo systemctl status docker
? docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2024-07-19 17:11:19 UTC; 3s ago
TriggeredBy: ? docker.socket
Docs: https://docs.docker.com
Main PID: 1163 (dockerd)
Tasks: 7
Memory: 21.9M
CPU: 221ms
CGroup: /system.slice/docker.service
??2803 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
По умолчанию Docker требует привилегий root. Если вы хотите избежать использования sudo каждый раз, когда вы запускаете docker , добавляйте свое имя пользователя в docker группу.
$ sudo usermod -aG docker $(whoami)
Чтобы включить это изменение, вам нужно выйти из сервера и снова войти в него под тем же пользователем или использовать следующую команду.
$ su - ${USER}
Убедитесь, что ваш пользователь добавлен в группу Docker.
$ groups navjot wheel docker
Шаг 3 — Создание файла Docker Compose для WordPress
Я буду выполнять всю установку Docker WordPress в /opt. Вы можете выбрать другое расположение, например /var или /home, в зависимости от ваших потребностей.
cd /opt
Создайте каталог для конфигурации WordPress.
$ mkdir wordpress
Перейдите в директорию.
$ cd wordpress
Создайте и откройте для редактирования файл Docker compose.
$ nano docker-compose.yml
Вставьте в него следующий код.
services:
wp:
image: wordpress:latest
container_name: wordpress-app
restart: unless-stopped
expose:
- 8080
volumes:
- ./config/php.conf.ini:/usr/local/etc/php/conf.d/conf.ini
- ./wp-app:/var/www/html
#- ./plugin-name/trunk/:/var/www/html/wp-content/plugins/plugin-name # Plugin development
#- ./theme-name/trunk/:/var/www/html/wp-content/themes/theme-name # Theme development
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: "${DB_NAME}"
WORDPRESS_DB_USER: "${DB_USER_NAME}"
WORDPRESS_DB_PASSWORD: "${DB_USER_PASSWORD}"
VIRTUAL_HOST: example.com
LETSENCRYPT_HOST: example.com
depends_on:
- db
links:
- db
wpcli:
image: wordpress:cli
container_name: wpcli_app
volumes:
- ./config/php.conf.ini:/usr/local/etc/php/conf.d/conf.ini
- ./wp-app:/var/www/html
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: "${DB_NAME}"
WORDPRESS_DB_USER: "${DB_USER_NAME}"
WORDPRESS_DB_PASSWORD: "${DB_USER_PASSWORD}"
depends_on:
- db
- wp
pma:
image: phpmyadmin/phpmyadmin
container_name: pma
restart: unless-stopped
environment:
# https://docs.phpmyadmin.net/en/latest/setup.html#docker-environment-variables
PMA_HOST: db
PMA_PORT: 3306
MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASSWORD}"
UPLOAD_LIMIT: 50M
VIRTUAL_HOST: phpmyadmin.example.com
LETSENCRYPT_HOST: phpmyadmin.example.com
expose:
- 8081
links:
- db:db
db:
image: mysql:latest
container_name: wordpressdb
restart: unless-stopped
command: [
'--default_authentication_plugin=mysql_native_password',
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci'
]
volumes:
- ./wp-data:/docker-entrypoint-initdb.d
- db_data:/var/lib/mysql
environment:
MYSQL_DATABASE: "${DB_NAME}"
MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASSWORD}"
MYSQL_USER: "${DB_USER_NAME}"
MYSQL_PASSWORD: "${DB_USER_PASSWORD}"
volumes:
db_data:
Сохраните файл, нажав кнопку Ctrl + X и ввести Y при появлении запроса.
Есть два образа WordPress, которые мы извлекаем. Один — для сайта, другой — для инструмента WP-CLI. Оба образа зависят от докер-образа MySQL 8.0. Здесь мы задаем переменные окружения для учетных данных базы данных. Мы создали два тома для обоих контейнеров, один из которых указывает на общедоступные файлы сайта WordPress, а второй — на пользовательское расположение PHP.ini. Мы также задали переменные окружения для домена виртуального хоста Nginx и домена Let’s encrypt SSL для сайта WordPress.
Вы можете добавить больше переменных окружения и добавить пользовательские wp-config.php данные в файл Docker. О дополнительных переменных окружения вы можете узнать из раздела Страница WordPress DockerHub.
Следующее изображение предназначено для phpMyAdmin, который зависит от того же образа MySQL и подключается к нему с помощью пароля root. Ограничение на загрузку составляет 50 МБ. Вы можете изменить его в соответствии с вашими требованиями и размером вашей базы данных. Как и в случае с сайтом WordPress, мы определили домен виртуального хоста Nginx и доменное имя Let’s encrypt SSL для сайта phpMyAdmin.
Последнее изображение предназначено для базы данных MySQL. Мы передали ей несколько команд для установки метода аутентификации по умолчанию и набора символов. Мы также создали пару томов для хранения данных и настроили переменные окружения для учетных данных базы данных.
Следующим шагом будет создание файла окружения для переменных, используемых в файле compose. Создайте и откройте для редактирования файл окружения.
$ sudo nano .env
Вставьте в него следующий код.
DB_NAME=wordpress DB_USER_NAME=username DB_USER_PASSWORD=userpassword DB_ROOT_PASSWORD=password
Вы можете сохранить файл, нажав Ctrl + X и ввести Y , когда появится запрос. Замените переменные на выбранные вами имя пользователя и пароль.
Вы можете настроить конфигурацию PHP с помощью пользовательского файла php.ini.
Создайте папку для конфигурации PHP.
$ mkdir config
Создайте и откройте папку php.conf.ini файл для редактирования.
$ nano config/php.conf.ini
Вставьте в него следующий код. Отрегулируйте значения в соответствии с вашими требованиями. Лимит загрузки для контейнера PhpMyadmin не зависит от значений, которые вы используете в этом файле.
file_uploads = On memory_limit = 500M upload_max_filesize = 30M post_max_size = 30M max_execution_time = 600
Сохраните файл, нажав кнопку Ctrl + X и ввести Y при появлении запроса.
Шаг 4 — Обновление Docker Compose для Nginx
Создайте каталог для конфигурации Nginx.
$ mkdir nginx
Создайте каталог для виртуальных хостов внутри этого каталога.
$ mkdir nginx/vhost
Создайте и откройте каталог nginx/vhost/wordpress.example.com для редактирования.
$ nano nginx/vhost/wordpress.example.com
Вставьте в него следующий код.
server_tokens off; client_max_body_size 30m;
Сохраните файл, нажав кнопку Ctrl + X и ввести Y при появлении запроса.
Сделайте то же самое для nginx/vhost/phpmyadmin.example.com файла.
$ nano nginx/vhost/phpmyadmin.example.com
Вставьте в него следующий код.
server_tokens off; client_max_body_size 50m;
Сохраните файл, нажав кнопку Ctrl + X и ввести Y при появлении запроса.
Снова откройте файл docker compose.
$ nano docker-compose.yml
Вставьте следующий код перед строкой volumes: db_data: строкой.
nginx:
container_name: nginx
image: nginxproxy/nginx-proxy
restart: unless-stopped
ports:
- 80:80
- 443:443
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- ./nginx/html:/usr/share/nginx/html
- ./nginx/certs:/etc/nginx/certs
- ./nginx/vhost:/etc/nginx/vhost.d
logging:
options:
max-size: "10m"
max-file: "3"
Сохраните файл, нажав кнопку Ctrl + X и ввести Y при появлении запроса.
В приведенном выше коде мы извлекаем Docker-образ прокси-сервера Nginx и открываем порты 80 и 443 для хост-контейнера, который будет использоваться для подключения к внешнему миру. Мы также создали тома для HTML-страницы Nginx, каталог, где будут храниться все SSL-сертификаты, и каталог для виртуальных хостов, который мы использовали выше для добавления дополнительных настроек Nginx. Мы настроили размер загружаемых файлов для сайтов WordPress и phpMyAdmin. Доменное имя сайта выбирается из переменных окружения, которые мы задали в предыдущем шаге.
Шаг 5 — Обновление Docker Compose для SSL
Откройте файл docker compose для редактирования.
$ nano docker-compose.yml
Вставьте следующий код перед строкой volumes: db_data: строкой.
acme-companion:
container_name: acme-companion
image: nginxproxy/acme-companion
restart: unless-stopped
volumes_from:
- nginx
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./nginx/acme:/etc/acme.sh
environment:
DEFAULT_EMAIL: [email protected]
Сохраните файл, нажав кнопку Ctrl + X и ввести Y при появлении запроса.
Здесь, мы извлекаем Docker-образ Acme companion, который работает с прокси-сервером Nginx. Он извлекает тома из контейнера Nginx. Мы также определяем том для в файле acme.sh инструмент, в котором хранятся все настройки Let’s Encrypt SSL. Наконец,, мы определяем переменную окружения для регистрации SSL-сертификата в Let’s Encrypt.
Шаг 6 — Запуск и установка WordPress
Теперь, когда все наши конфигурационные файлы готовы, пришло время запустить контейнеры.
$ docker compose up -d
Подождите пару минут и проверьте состояние контейнеров.
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c1e8a9b5169d nginxproxy/acme-companion "/bin/bash /app/entr…" 14 seconds ago Up 7 seconds acme-companion 8a37c78ff790 wordpress:latest "docker-entrypoint.s…" 14 seconds ago Up 7 seconds 80/tcp, 8080/tcp wordpress-app 4f9c777c97c2 phpmyadmin/phpmyadmin "/docker-entrypoint.…" 14 seconds ago Up 7 seconds 80/tcp, 8081/tcp pma 1b1dede46b07 nginxproxy/nginx-proxy "/app/docker-entrypo…" 14 seconds ago Up 11 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp nginx b9cf64a2f4a3 mysql:latest "docker-entrypoint.s…" 14 seconds ago Up 11 seconds 3306/tcp, 33060/tcp wordpressdb
Откройте URL-адрес https://example.com , чтобы запустить программу установки WordPress.

Выберите язык и нажмите кнопку Продолжить , чтобы перейти на следующую страницу.
Заполните данные о сайте, выберите имя пользователя, пароль и адрес электронной почты и нажмите кнопку Установить WordPress , чтобы начать установку.

Вы попадете на страницу успешной установки. Нажмите на кнопку Войти , чтобы перейти на страницу входа в систему.

Введите свои данные для входа и нажмите кнопку Войти , чтобы открыть приборную панель WordPress.

Вы можете начать использовать WordPress прямо сейчас.
Шаг 7 — Доступ к PhpMyAdmin
Вы можете получить доступ к phpMyAdmin по URL https://phpmyadmin.example.com.

Введите root в качестве имени пользователя и пароль root и нажмите кнопку Войти , чтобы открыть приборную панель.

Вы можете начать использовать phpMyAdmin прямо сейчас.
Шаг 8 — Доступ к WP-CLI
Вы можете получить доступ к WP-CLI с помощью следующей команды.
$ docker compose run --rm wpcli cli version
Вы получите следующий результат.
[+] Running 2/0 ? Container wordpressdb Running 0.0s ? Container wordpress-app Running 0.0s WP-CLI 2.7.1
Чтобы не набирать каждый раз такую длинную команду, мы можем воспользоваться функцией псевдонимов в Linux.
$ alias wp="docker compose -f ~/wordpress/docker-compose.yml run --rm wpcli"
Теперь вы можете набрать следующую команду из любого места вашего контейнера.
$ wp cli version
Псевдонимы в Linux являются временными. Чтобы сделать псевдоним постоянным, вам нужно отредактировать файл ~/.bashrc файл. Откройте его для редактирования.
$ nano ~/.bashrc
Вставьте следующую строку в конец файла.
# Custom aliases alias wp="docker compose -f ~/wordpress/docker-compose.yml run --rm wpcli"
Сохраните файл, нажав кнопку Ctrl + X и ввести Y при появлении запроса.
Выберите источник файла, чтобы перезагрузить конфигурацию.
$ source ~/.bashrc
Вы можете начать использовать WP-CLI.
Шаг 9 — Резервное копирование WordPress
Существует несколько способов резервного копирования WordPress. Самый простой способ — использовать плагин. Для этого существует несколько плагинов. Вы также можете использовать phpMyAdmin для создания резервной копии.
Вы также можете использовать командную строку для создания резервной копии базы данных WordPress. Перейдите в директорию WordPress.
$ cd ~/wordpress
Используйте следующую команду для резервного копирования базы данных WordPress. Вам будет предложено ввести пароль корня MySQL.
$ docker compose exec db sh -c "exec mysqldump wordpress -uroot -p" | sudo tee wp-data/data_`date +%d-%m-%Y"_"%H_%M_%S`.sql >/dev/null Enter password: password
Приведенная выше команда создаст резервную копию SQL в файле ~/wordpress/wp-data каталоге.
Проверьте содержимое каталога.
$ ls -al wp-data total 908 drwxr-xr-x 2 root root 4096 Jan 11 10:15 ./ drwxrwxr-x 6 navjot navjot 4096 Jan 11 10:05 ../ -rw-r--r-- 1 root root 919814 Jan 11 10:14 data_11-01-2023_10_14_40.sql
Вы можете увидеть базу данных, сохраненную в каталоге. Вы можете восстановить эту базу данных с помощью инструмента phpMyAdmin или с помощью следующей команды.
$ docker compose exec db sh -c "exec mysql -uroot -p"
You can create a cron job to back up the database regularly.
Create the backup script in the /etc/cron.daily directory and open it for editing.
$ sudo nano /etc/cron.daily/wpbackup.sh
Вставьте в нее следующий код.
#!/bin/bash docker compose exec db sh -c "exec mysqldump wordpress -uroot -p" | tee wp-data/data_`date +%d-%m-%Y"_"%H_%M_%S`.sql >/dev/null
Сохраните файл, нажав кнопку Ctrl + X и ввести Y при появлении запроса.
Сделайте скрипт исполняемым.
$ sudo chmod +x /etc/cron.daily/wpbackup.sh
Теперь резервное копирование вашей базы данных будет выполняться ежедневно.
Шаг 10 — Обновление WordPress
Самый простой способ обновить WordPress — воспользоваться встроенным средством обновления. Вы также можете обновить его с помощью Docker. Первым шагом будет создание резервной копии базы данных WordPress с помощью команды из шага 9.
Затем перейдите в директорию.
$ cd ~/wordpress
Остановите контейнеры.
$ docker compose down --remove-orphans
Вытащите последние образы контейнеров.
$ docker compose pull
Внесите любые изменения в docker-compose.yml , если хотите.
Перезапустите контейнеры WordPress.
$ docker compose up -d