Как установить WordPress с помощью Docker Compose

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

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

Страница входа в систему WordPress

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

Приборная панель WordPress

Вы можете начать использовать WordPress прямо сейчас.

Шаг 7 – Доступ к PhpMyAdmin

Вы можете получить доступ к phpMyAdmin по URL https://phpmyadmin.example.com.

Страница входа в phpMyAdmin

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

Панель управления phpMyAdmin

Вы можете начать использовать 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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *