> For the complete documentation index, see [llms.txt](https://book.konstantinsecurity.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://book.konstantinsecurity.com/readme/web-dev/docker-compose-wp-nginx-php-mariadb.md).

# Docker Compose wp nginx php mariadb

<https://admin812.ru/razvertyvanie-wordpress-s-nginx-php-fpm-i-mariadb-s-pomoshhyu-docker-compose.html>

Docker – это программное обеспечение, которое может упаковать ваше приложение, его зависимости, системные инструменты, системные библиотеки и настройки в единый виртуальный контейнер. Этот комбинированный пакет, содержащий все необходимое для запуска вашего приложения, называется образом контейнера Docker . Этот образ представляет собой автономный исполняемый программный пакет, который надежно работает на любом сервере – Linux, Windows, macOS, публичное облако или частное облако. Также эти образы можно использовать для запуска приложения как изолированного процесса в пространстве пользователя.

Рассмотрим как развернуть WordPress с Nginx, PHP-FPM и MariaDB и PhpMyAdmin с помощью Docker Compose на компьютере с Ubuntu.

### 1. Подготовка хост-машины

```
sudo apt update && sudo apt-get upgrade
sudo apt-get install -y docker.io
```

Добавим докер в автоматический запуск при загрузке ОС:

```
systemctl start docker
systemctl enable docker
```

Docker-Compose доступен в репозитории, но его версии немного отстают от последней. Поэтому скачаем актуальную версию с GitHub

```
sudo wget -O  /usr/local/bin/docker-compose https://github.com/docker/compose/releases/download/1.26.0/docker-compose-Linux-x86_64
```

```
sudo chmod +x /usr/local/bin/docker-compose
```

После завершения процесса проверьте установленную версию docker-compose:

```
 docker-compose version
```

![](/files/qrVYD8v3zm8HrOTBJd9r)

В целях безопасности, мы не будем работать через root, а добавим существующего пользователя в группу docker и перезагрузим службу:

```
usermod -a -G docker $USER
systemctl restart docker
```

Создадим каталоги в которых будут хранится данные.

```
mkdir -p wordpress-compose
cd wordpress-compose/
touch docker-compose.yml
mkdir -p nginx/
mkdir -p logs/
mkdir -p logs/nginx
mkdir -p data/
mkdir -p data/html
mkdir -p data/mysql
```

docker-compose.yml — это конфигурационный файл, в котором мы описываем какие контейнеры запускать, их настройки и связи между контейнерами.

— nginx/: каталог используемый для дополнительной конфигурации nginx, как виртуального хоста и т. д.

— logs/: каталог логов для nginx, mariadb и php.

— data/: каталог с файлами wordpress и файлы базы данных.

Далее в директории wordpress-compose/nginx создайте новый файл с конфигурацией nginx.

```
nano ~/wordpress-compose/nginx/nginx.conf
```

Вставьте следующее содержимое:

```
server {
  listen 80;
  server_name site1.ru;

  root /var/www/html;
  index index.php;

  access_log /var/log/nginx/site-access.log;
  error_log /var/log/nginx/site-error.log;

  location / {
    try_files $uri $uri/ /index.php?$args;
  }

  location ~ \.php$ {
    try_files $uri =404;
    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 PATH_INFO $fastcgi_path_info;
    }
}
```

Сохраните файл и выйдите из редактора

Мы будем использовать Nginx последней версии. Настроим сопоставление портов для порта 8080 на хосте с портом 80 в контейнере. Настроим конфигурацию виртуального хоста Nginx, файлы журнала Nginx и корневой каталог веб-сервера /var/www/html. Также укажем что контейнер Nginx связан с контейнером WordPress.

Отредактируем файл docker-compose.yml:

```
nano docker-compose.yml
```

```
nginx:
    image: nginx:latest
    volumes:
      - ./nginx:/etc/nginx/conf.d
      - ./data/html:/var/www/html
    ports:
      - 8080:80
    links:
      - wordpress
```

Если вы копируете текст с сайта и вставляете в конфигурационный файл, убедитесь что форматирование не съехало и не появилось новых символов и пробелов, потому что из-за этого нарушается структура файла, что приводит к ошибкам.

Далее определим сервер MySQL, мы используем образ MariaDB последней версии. Назначим root пароль MySQL, имя базы данных, пользователя базы и его пароль. Для этого, вставьте в конфигурационный docker-compose.yml текст:

```
  mysql:
    image: mariadb
    volumes:
      - ./data/mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 4m3SxCpaQb*6LB#
      MYSQL_DATABASE: db_wordpress
      MYSQL_USER: user_wp
      MYSQL_PASSWORD: 9UqfqeE9#hn2@t^
    restart: always
```

Теперь мы будем настраивать WordPress с помощью образа WordPress с PHP-FPM 7.4. Подключаем том Docker для директории /var/www/html в каталоге хоста WordPress, настроим базу данных, определив переменную среду WordPress, и свяжем WordPress с MySQL. Данные по настройке базы данных должны соответствовать предыдущей секции. Вставьте в конфигурационный docker-compose.yml текст:

```
  wordpress:
    image: wordpress:php7.4-fpm-alpine
    volumes:
      - ./data/html:/var/www/html
    depends_on:
      - mysql
    environment:
      WORDPRESS_DB_HOST: mysql
      MYSQL_ROOT_PASSWORD: 4m3SxCpaQb*6LB#
      WORDPRESS_DB_NAME: db_wordpress
      WORDPRESS_DB_USER: user_wp
      WORDPRESS_DB_PASSWORD: 9UqfqeE9#hn2@t^
      WORDPRESS_TABLE_PREFIX: wp_
    links:
      - mysql
    restart: always
```

Для управления СУБД прикручиваем phpmyadmin и на порт 8081:

```
pma:
  image: phpmyadmin/phpmyadmin
  restart: always
  links:
    - mysql:mysql
  ports:
    - 8081:80
  environment:
  PMA_HOST=mysql
  MYSQL_USERNAME=root
  MYSQL_ROOT_PASSWORD: 4m3SxCpaQb*6LB#
```

После добавления составных частей в docker-compose.yml — файла, сохраните его и выйдите из редактора. Конфигурация docker-compose готова. У Вас должен получиться файл с таким содержимым:

```
version: '3'
services:
  mysql:
    image: mariadb
    volumes:
      - ./data/mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 4m3SxCpaQb*6LB#
      MYSQL_DATABASE: db_wordpress
      MYSQL_USER: user_wp
      MYSQL_PASSWORD: 9UqfqeE9#hn2@t^
    restart: always
  wordpress:
    image: wordpress:php7.4-fpm-alpine
    volumes:
      - ./data/html:/var/www/html
    depends_on:
      - mysql
    environment:
      WORDPRESS_DB_HOST: mysql
      MYSQL_ROOT_PASSWORD: 4m3SxCpaQb*6LB#
      WORDPRESS_DB_NAME: db_wordpress
      WORDPRESS_DB_USER: user_wp
      WORDPRESS_DB_PASSWORD: 9UqfqeE9#hn2@t^
      WORDPRESS_TABLE_PREFIX: wp_
    links:
      - mysql
    restart: always
  nginx:
    image: nginx:latest
    volumes:
      - ./nginx:/etc/nginx/conf.d
      - ./data/html:/var/www/html
    ports:
      - 8080:80
    links:
      - wordpress

  pma:
    image: phpmyadmin/phpmyadmin
    restart: always
    links:
      - mysql:mysql
    ports:
      - 8081:80
    environment:
      MYSQL_ROOT_PASSWORD: 4m3SxCpaQb*6LB#
```

### 5. Запуск docker-compose

Начнем создание новых контейнеров с docker-compose. Перейдите в каталог WordPress и запустите новые контейнеры на основании созданного нами файла.

```
cd ~/wordpress-compose/
docker-compose up -d
```

![](/files/fGCiq8uQPcwjNdTP16vl)

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

```
docker-compose ps
```

![](/files/HNuiXcrcAd37DWbOpQzQ)

Если вы хотите увидеть вывод журнала из контейнера, вы можете использовать команды ниже:

```
docker-compose logs nginx
docker-compose logs mysql
docker-compose logs wordpress
```

### 6. Установка CMS WordPress

Теперь откройте веб-браузер и введите URL-адрес сервера или IP-адрес.

```
http://server_IP:8080/
```

Вы должны увидеть страницу установки WordPress. Выберите свой язык и нажмите ‘продолжить’.

![](/files/kD1eyEdnEExtucNWYDoS)

Если у Вас не открылась страница установки, посмотрите логи nginx, а также файл hosts на компьютере с которого вы пытаете открыть сайт.

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

![](/files/fszWmkzpvVc39iehzvGF)

Также по адресу <http://server\\_IP:8081/> доступен phpMyAdmin

![](/files/Uds2zsUE46P5jDN0Uhsp)

WordPress установлен с помощью docker-compose.

### 7. Доступ в контейнеры docker

Чтобы убедиться, что все контейнеры доступны и проверить их состояние введите команду:

```
docker-compose ps
```

У нас уже 4 контейнера, теперь мы можем попытаться войти в каждый. Войдите в первый контейнер nginx с помощью команды docker-compose.

```
docker-compose exec nginx bash
```

nginx – имя файла в Docker-Compose yml

bash – выполнение команды в оболочке bash.

Теперь проверим наши настройки виртуального хоста на WordPress.

```
cat /etc/nginx/conf.d/nginx.conf
```

Файл доступен в контейнере.

![](/files/EzhNmRBUykHOz4hTyxAi)

Далее попробуйте войти в контейнер MySQL, а затем в оболочку MySQL с помощью нашего пароля на файле.

```
docker-compose exec mysql bash
mysql -u root -p
```

Посмотреть список баз данных:

```
show databases;
```

Вы увидите нашу базу данных WordPress.

![](/files/KWIiU5ViDLE3Wz4HSCBA)

В контейнере WordPress вы увидите все файлы CMS WordPress.

```
docker-compose exec wordpress bash
ls -lah
```

![](/files/UFNNToZbhbDPYS6D6oLd)
