Сегодня почти половина из 1 миллиона самых популярных сайтов в интернете используют CMS (систему управления контентом) WordPress. WordPress обладает множеством функций и очень прост в использовании даже для пользователей, не имеющих технического образования, что делает его популярным решением для CMS.
Однако настройка веб-сайта с помощью WordPress на VPS-сервере или облачном сервере может оказаться довольно сложной задачей как для пользователей, не имеющих технического образования, так и для технических специалистов. В этой статье мы узнаем, как это сделать.
Docker — это программное обеспечение, которое может упаковывать ваше приложение, его зависимости, системные инструменты, системные библиотеки и настройки в единый комплексный виртуальный контейнер. Этот объединённый пакет, содержащий всё необходимое для запуска вашего приложения, называется образом контейнера Docker. Этот образ представляет собой автономный исполняемый программный пакет, который надёжно работает на любом сервере — Linux, Windows, macOS, в общедоступном или частном облаке. Кроме того, эти образы можно использовать для запуска приложения как изолированного процесса в пользовательском пространстве.
Структура проекта
В этой статье мы узнаем, как развернуть WordPress с помощью NGINX, PHP-FPM и MariaDB с помощью Docker Compose на компьютере с Ubuntu. На изображении ниже показано развёртывание с несколькими контейнерами, которое мы собираемся создать.
Установка WordPress в Docker
Этапы развертывания кратко описаны ниже.
- Создайте файл docker-compose.yml, который позволит нам создать развёртывание с несколькими контейнерами.
- Добавьте конфигурацию MariaDB в docker-compose.yml.
- Настройте хост-компьютер для обработки файлов базы данных.
- Добавьте конфигурацию WordPress в docker-compose.yml.
- Добавьте раздел конфигурации в файл nginx.conf.
- Добавьте конфигурацию NGINX в docker-compose.yml.
- Создайте контейнеры и запустите сервисы.
Создание файла docker-compose.yml
mkdir wordpress
cd wordpress
Создание конфигурации MariaDB
Создайте файл docker-compose.yml и добавьте в него приведенную ниже конфигурацию. Конфигурация для базы данных MariaDB указана под названием службы mysql.
nano docker-compose.yml
Скопируем в файл текст:
version: '3'
services:
mysql:
image: mariadb
volumes:
- /data/mysql:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: mysql_root_pass
MYSQL_DATABASE: db_name
MYSQL_USER: user_name
MYSQL_PASSWORD: user_pass
restart: always
В приведенном ниже разделе путь к хост-машине монтируется /data/mysql
в путь к контейнеру /var/lib/mysql
.
volumes:
- /data/mysql:/var/lib/mysql
Это позволяет хранить все наши файлы БД на хост-компьютере, а не в контейнере. Нам нужно подготовить этот каталог для использования нашим контейнером.
В контейнере MariaDB каталог /var/lib/mysql
принадлежит пользователю mysql
. Идентификатор пользователя в контейнере — 999
. В Ubuntu — на хост-компьютере — он другой. Приведенные ниже команды удаляют любого существующего пользователя с именем mysql
и создают нового пользователя с идентификатором 999
.
$ sudo userdel mysql
$ sudo useradd -u 999 mysql
Теперь установите владельца каталога/data/mysql
на хост-компьютере.
$ sudo mkdir -p /data/mysql
$ sudo chown -R mysql:mysql /data/mysql
Добавление конфигурации WordPress
Добавьте конфигурацию WordPress в файл docker-compose.yml в качестве сервиса с именем wordpress
nano docker-compose.yml
version: '3'
services:
mysql:
image: mariadb
volumes:
- /data/mysql:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: mysql_root_pass
MYSQL_DATABASE: db_name
MYSQL_USER: user_name
MYSQL_PASSWORD: user_pass
restart: always
wordpress:
image: wordpress:php7.3-fpm-alpine
volumes:
- /data/html:/var/www/html
depends_on:
- mysql
environment:
WORDPRESS_DB_HOST: mysql
MYSQL_ROOT_PASSWORD: mysql_root_pass
WORDPRESS_DB_NAME: db_name
WORDPRESS_DB_USER: user_name
WORDPRESS_DB_PASSWORD: user_pass
WORDPRESS_TABLE_PREFIX: wp_
links:
- mysql
restart: always
Убедитесь,что переменные среды WordPress: MYSQL_ROOT_PASSWORD, WORDPRESS_DB_NAME,WORDPRESS_DB_USER и WORDPRESS_DB_PASSWORD точно совпадают с переменными среды MariaDB: MYSQL_ROOT_PASSWORD, MYSQL_DATABASE, MYSQL_USER и MYSQL_PASSWORD соответственно. В случае несоответствия приложение WordPress не сможет подключиться к базе данных.
В следующем разделе указано, что служба wordpress зависит от службы mysql. Это означает, что службы запускаются и останавливаются в порядке зависимости.
depends_on:
- mysql
Приведённый ниже раздел позволяет сервису wordpress взаимодействовать со службой mysql.
links:
- mysql
В приведенном ниже разделе путь к хост-машине монтируется /data/html
в путь к контейнеру /var/www/html
.
volumes:
- /data/html:/var/www/html
Это позволяет хранить все файлы нашего приложения WordPress на хост-компьютере, а не в контейнере. Нам нужно подготовить этот каталог для использования нашим контейнером.
В контейнере WordPress каталог /var/www/html
принадлежит пользователю www-data
. Идентификатор пользователя в контейнере — 82
. В Ubuntu — на хост-машине — он другой. Приведенные ниже команды удаляют любого существующего пользователя с именем www-data
и создают нового пользователя с идентификатором 82
.
$ sudo userdel www-data
$ sudo useradd -u 82 www-data
Теперь установите владельца каталога/data/html
на хост-компьютере.
$ sudo mkdir -p /data/html
$ sudo chown -R www-data:www-data /data/html
Добавьте следующие строки в раздел server в nginx.conf, чтобы все PHP-запросы отправлялись в службу PHP-FPM.
# pass the PHP scripts to FastCGI server listening on wordpress:9000
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass wordpress:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
Добавление конфигурации NGINX
Добавьте конфигурацию NGINX в файл docker-composer.yml в качестве сервиса с именем nginx.
nano docker-compose.yml
version: '3'
services:
mysql:
image: mariadb
volumes:
- /data/mysql:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: mysql_root_pass
MYSQL_DATABASE: db_name
MYSQL_USER: user_name
MYSQL_PASSWORD: user_pass
restart: always
wordpress:
image: wordpress:php7.3-fpm-alpine
volumes:
- /data/html:/var/www/html
depends_on:
- mysql
environment:
WORDPRESS_DB_HOST: mysql
MYSQL_ROOT_PASSWORD: mysql_root_pass
WORDPRESS_DB_NAME: db_name
WORDPRESS_DB_USER: user_name
WORDPRESS_DB_PASSWORD: user_pass
WORDPRESS_TABLE_PREFIX: wp_
links:
- mysql
restart: always
nginx:
image: nginx:alpine
volumes:
- nginx:/etc/nginx/conf.d
- /data/html:/var/www/html
ports:
- 8080:80
links:
- wordpress
Убедитесь,что путь к хосту, указанный в конфигурации nginx, — /data/html
— совпадает с путем к хосту, указанным в конфигурации WordPress.
Приведённый ниже раздел позволяет сервису wordpress взаимодействовать со службой mysql.
В приведенном ниже разделе порт 8080 хост-машины сопоставляется с портом 80 контейнера. Обратите внимание, что ни один другой контейнер не имеет открытого порта для хост-машины. Это повышает безопасность нашего развертывания.
ports:
- 8080:80
Нам также нужно предоставить файл конфигурации для сервера Nginx. Создайте каталог с именем nginx
и поместите приведенный ниже текст в файл с именем nginx.conf
в этом каталоге.
mkdir nginx
cd nginx
nano nginx.conf
server {
listen 80;
listen [::]:80;
access_log off;
root /var/www/html;
index index.php;
server_name example.com;
server_tokens off;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ /index.php?$args;
}
# pass the PHP scripts to FastCGI server listening on wordpress:9000
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass wordpress:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
}
Запуск WordPress в Docker
Теперь создайте контейнеры и запустите службы с помощью приведенной ниже команды.
$ sudo docker-compose up -d
После завершения установки откройте в браузере URL http://localhost:8080. Вы должны увидеть страницу начальной настройки WordPress.
В нашей установке это единственные каталоги, содержащие пользовательские данные. И оба этих каталога находятся на хост-компьютере. Таким образом, вы можете легко создать резервную копию всех пользовательских данных, просто создав архив каталога /data
по приведенной ниже инструкции:
$ sudo tar -jcvf data.tar.bz2 /data
Как обновить WordPress в Docker?
Другой вопрос заключается в том, как обновить до последней версии образы Docker nginx или WordPress в нашем развёртывании. Поскольку все пользовательские данные находятся за пределами контейнеров, мы можем легко удалить контейнеры и создать их заново, чтобы обновить нашу установку.
$ sudo docker-compose down --rmi all
$ sudo docker-compose up -d
Источник: WordPress Deployment with NGINX, PHP-FPM and MariaDB using Docker Compose