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