Поиск по сайту:

Как установить Wordpress и PhpMyAdmin с Docker Compose на Ubuntu 14.04


Введение

Docker Compose упрощает работу с процессами оркестровки контейнеров Docker (такими как запуск, завершение работы и настройка внутриконтейнерных связей и томов).

В этой статье представлен реальный пример использования Docker Compose для установки приложения, в данном случае WordPress с дополнительным PHPMyAdmin. WordPress обычно работает на стеке LAMP, что означает Linux, Apache, MySQL/MariaDB и PHP. Официальный образ WordPress Docker включает для нас Apache и PHP, поэтому нам нужно беспокоиться только о MariaDB.

Предпосылки

Чтобы следовать этой статье, вам понадобится следующее:

  • Дроплет Ubuntu 14.04
  • Пользователь без полномочий root с правами sudo (начальная настройка сервера с Ubuntu 14.04 объясняет, как это настроить).
  • Docker и Docker Compose, установленные в соответствии с инструкциями в разделе Установка и использование Docker Compose в Ubuntu 14.04

Шаг 1 — Установка WordPress

Мы будем использовать официальные образы Docker от MariaDB. Если вам интересно, есть много дополнительной информации об этих образах и параметрах их конфигурации на соответствующих страницах GitHub и Docker Hub.

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

mkdir ~/wordpress && cd $_

Затем создайте ~/wordpress/docker-compose.yml в своем любимом текстовом редакторе (nano легко, если у вас нет предпочтений):

  1. nano ~/wordpress/docker-compose.yml

и вставьте следующее:

wordpress:
  image: wordpress

Это просто говорит Docker Compose запустить новый контейнер с именем wordpress и загрузить образ wordpress из Docker Hub.

Мы можем поднять изображение так:

  1. docker-compose up

Вы увидите, как Docker загружает и извлекает образ WordPress из Docker Hub, и через некоторое время вы получите сообщения об ошибках, подобные приведенным ниже:

Output
wordpress_1 | error: missing WORDPRESS_DB_HOST and MYSQL_PORT_3306_TCP environment variables wordpress_1 | Did you forget to --link some_mysql_container:mysql or set an external db wordpress_1 | with -e WORDPRESS_DB_HOST=hostname:port? dockercompose_wordpress_1 exited with code 1

Это WordPress жалуется, что не может найти базу данных. Давайте добавим образ MariaDB в микс и свяжем его, чтобы исправить это.

Шаг 2 — Установка MariaDB

Чтобы добавить образ MariaDB в группу, снова откройте docker-compose.yml в текстовом редакторе:

nano ~/wordpress/docker-compose.yml

Измените docker-compose.yml, чтобы он соответствовал приведенному ниже (будьте осторожны с отступами, файлы YAML чувствительны к пробелам)

wordpress:
  image: wordpress
  links:
    - wordpress_db:mysql
wordpress_db:
  image: mariadb

Здесь мы определили новый контейнер с именем wordpress_db и сказали ему использовать образ mariadb из Docker Hub. Мы также сказали нашему контейнеру wordpress связать наш контейнер wordpress_db с контейнером wordpress и назвать его mysql (внутри контейнер wordpress, имя хоста mysql будет переадресовано в наш контейнер wordpress_db).

Если вы снова запустите docker-compose up, вы увидите, что он загружает образ MariaDB, и вы также увидите, что это еще не все:

Output
wordpress_db_1 | error: database is uninitialized and MYSQL_ROOT_PASSWORD not set wordpress_db_1 | Did you forget to add -e MYSQL_ROOT_PASSWORD=... ? wordpress_1 | error: missing required WORDPRESS_DB_PASSWORD environment variable wordpress_1 | Did you forget to -e WORDPRESS_DB_PASSWORD=... ? wordpress_1 | wordpress_1 | (Also of interest might be WORDPRESS_DB_USER and WORDPRESS_DB_NAME.) wordpress_wordpress_db_1 exited with code 1 wordpress_wordpress_1 exited with code 1 Gracefully stopping... (press Ctrl+C again to force)

WordPress по-прежнему жалуется на то, что не может найти базу данных, и теперь у нас есть новая жалоба от MariaDB, в которой говорится, что пароль root не установлен.

Похоже, что просто связать два контейнера недостаточно. Давайте продолжим и установим переменную MYSQL_ROOT_PASSWORD, чтобы мы действительно могли запустить эту штуку.

Еще раз отредактируйте файл Docker Compose:

  1. nano ~/wordpress/docker-compose.yml

Добавьте эти две строки в конец раздела wordpress_db, но не забудьте изменить examplepass на более безопасный пароль!

wordpress_db:
...
  environment:
    MYSQL_ROOT_PASSWORD: examplepass
...

Это установит переменную среды внутри контейнера wordpress_db с именем MYSQL_ROOT_PASSWORD с желаемым паролем. Образ MariaDB Docker настроен на проверку этой переменной среды при запуске и позаботится о настройке БД с учетной записью root с паролем, определенным как MYSQL_ROOT_PASSWORD.

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

wordpress:
...
  ports:
    - 8080:80
...

Первый номер порта — это номер порта на хосте, а второй номер порта — это порт внутри контейнера. Таким образом, эта конфигурация перенаправляет запросы на порт 8080 хоста на порт 80 веб-сервера по умолчанию внутри контейнера.

Примечание. Если вы хотите, чтобы Wordpress работал на порту 80 веб-сервера по умолчанию на хосте, измените предыдущую строку на 80:80, чтобы запросы к порту 80 на хосте перенаправлялись на порт 80 внутри контейнер Wordpress.

Ваш полный файл docker-compose.yml теперь должен выглядеть так:

wordpress:
  image: wordpress
  links:
    - wordpress_db:mysql
  ports:
    - 8080:80
wordpress_db:
  image: mariadb
  environment:
    MYSQL_ROOT_PASSWORD: examplepass

С этой конфигурацией мы действительно можем запустить WordPress. На этот раз давайте запустим его с параметром -d, который скажет docker-compose запускать контейнеры в фоновом режиме, чтобы вы могли продолжать использовать свой терминал:

  1. docker-compose up -d

Вы увидите, как на вашем экране пролетит целая куча текста. Как только он успокоится, откройте веб-браузер и перейдите к IP-адресу.

Вы должны увидеть новую страницу установки WordPress и сможете завершить установку и вести блог как обычно.

Поскольку оба эти образа являются официальными образами Docker и следуют всем передовым методам Docker, каждый из этих образов имеет заранее определенные постоянные тома для вас — это означает, что если вы перезапустите контейнер, ваши сообщения в блоге останутся там. Вы можете узнать больше о работе с томами Docker в учебнике по томам данных Docker.

Шаг 3 — Добавление контейнера PhpMyAdmin

Отлично, это было относительно безболезненно. Попробуем немного пофантазировать.

До сих пор мы использовали только официальные образы, и команда Docker прилагает все усилия, чтобы обеспечить их точность. Вы могли заметить, что нам не нужно было задавать контейнеру WordPress какие-либо переменные среды для его настройки. Как только мы подключили его к правильно настроенному контейнеру MariaDB, все заработало.

Это связано с тем, что внутри контейнера WordPress Docker есть скрипт, который фактически получает переменную MYSQL_ROOT_PASSWORD из нашего контейнера wordpress_db и использует ее для подключения к WordPress.

Давайте немного отойдем от официальной области изображений и воспользуемся изображением PhpMyAdmin, предоставленным сообществом. Продолжайте и отредактируйте docker-compose.yml еще раз:

  1. nano docker-compose.yml

Вставьте следующее в конец файла:

phpmyadmin:
  image: corbinu/docker-phpmyadmin
  links:
    - wordpress_db:mysql
  ports:
    - 8181:80
  environment:
    MYSQL_USERNAME: root
    MYSQL_ROOT_PASSWORD: examplepass

Обязательно замените examplepass точно таким же корневым паролем из контейнера wordpress_db, который вы установили ранее.

Это захватывает docker-phpmyadmin от члена сообщества corbinu, связывает его с нашим контейнером wordpress_db с именем mysql (что означает из контейнера phpmyadmin ссылки на имя хоста mysql будут перенаправлены в наш контейнер wordpress_db), выставляет свой порт 80 на порт 8181 хоста system и, наконец, устанавливает пару переменных среды с нашим именем пользователя и паролем MariaDB. Это изображение не извлекает автоматически переменную среды MYSQL_ROOT_PASSWORD из среды контейнера wordpress_db, как это делает изображение wordpress. На самом деле нам нужно скопировать строку MYSQL_ROOT_PASSWORD: examplepass из контейнера wordpress_db и установить имя пользователя root.

Полный файл docker-compose.yml теперь должен выглядеть так:

wordpress:
  image: wordpress
  links:
    - wordpress_db:mysql
  ports:
    - 8080:80
wordpress_db:
  image: mariadb
  environment:
    MYSQL_ROOT_PASSWORD: examplepass
phpmyadmin:
  image: corbinu/docker-phpmyadmin
  links:
    - wordpress_db:mysql
  ports:
    - 8181:80
  environment:
    MYSQL_USERNAME: root
    MYSQL_ROOT_PASSWORD: examplepass

Теперь снова запустите группу приложений:

  1. docker-compose up -d

Вы увидите, что PhpMyAdmin устанавливается. После завершения снова посетите IP-адрес вашего сервера (на этот раз используя порт 8181, например, http://123.456.789.123:8181). Вас встретит экран входа в PhpMyAdmin.

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

Таким образом, вы можете добавить столько контейнеров, сколько захотите, и соединить их как угодно. Как видите, подход довольно мощный — вместо того, чтобы иметь дело с конфигурацией и предварительными условиями для каждого отдельного компонента и устанавливать их все на одном сервере, вы можете соединять части вместе, как блоки Lego, и добавлять компоненты по частям. Используя такие инструменты, как документация по нему, если вы заинтересованы.

Шаг 4 — Создание сайта WordPress

Поскольку все файлы вашего нового сайта WordPress хранятся внутри вашего контейнера Docker, что происходит с вашими файлами, когда вы останавливаете контейнер и запускаете его снова?

По умолчанию корень документа для контейнера WordPress является постоянным. Это связано с тем, что образ WordPress из Docker Hub настроен таким образом. Если вы внесете изменения в свой сайт WordPress, остановите группу приложений и запустите ее снова, на вашем веб-сайте останутся внесенные вами изменения.

Давай попробуем.

Перейдите на свой WordPress из веб-браузера (например, http://123.456.789.123:8080). Отредактируйте привет, мир! пост, который уже существует. Затем остановите все контейнеры Docker с помощью следующей команды:

  1. docker-compose stop

Попробуйте снова загрузить сайт WordPress. Вы увидите, что сайт не работает. Снова запустите контейнеры Docker:

  1. docker-compose up -d

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

Шаг 5 — Сохранение корня документа в файловой системе хоста (необязательно)

Корень документа для WordPress можно хранить в файловой системе хоста, используя том данных Docker для обмена файлами между хостом и контейнером.

Примечание. Дополнительные сведения о работе с томами данных Docker см. в руководстве по томам данных Docker.

Давайте попробуем. Откройте файл docker-compose.yml еще раз:

nano ~/wordpress/docker-compose.yml

в разделе wordpress: добавьте следующие строки:

wordpress:
...
  volumes:
    - ~/wordpress/wp_html:/var/www/html
    ...

Остановите текущую сессию docker-compose:

  1. docker-compose stop

Удалите существующий контейнер, чтобы мы могли сопоставить том с файловой системой хоста:

  1. docker-compose rm wordpress

Запустите WordPress снова:

  1. docker-compose -d

После того, как приглашение вернется, WordPress должен снова работать — на этот раз с использованием файловой системы хоста для хранения корня документа.

Если вы посмотрите в свой каталог ~/wordpress, вы увидите, что в нем теперь есть каталог wp_html:

  1. ls ~/wordpress

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

Этот опыт был немного более плавным, чем обычно: контейнер WordPress Docker настроен на проверку того, пуст ли /var/www/html или нет, когда он запускается, и копирует туда файлы соответствующим образом. Обычно вам придется сделать этот шаг самостоятельно.

Заключение

У вас должен быть запущен и запущен полный WordPress. Вы сможете использовать один и тот же метод для развертывания самых разных систем, используя образы, доступные в Docker Hub. Обязательно выясните, какие тома являются постоянными, а какие — нет для каждого контейнера, который вы используете.

Удачного докеринга!