Как установить 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 легко, если у вас нет предпочтений):
- nano ~/wordpress/docker-compose.yml
и вставьте следующее:
wordpress:
image: wordpress
Это просто говорит Docker Compose запустить новый контейнер с именем wordpress
и загрузить образ wordpress
из Docker Hub.
Мы можем поднять изображение так:
- docker-compose up
Вы увидите, как Docker загружает и извлекает образ WordPress из Docker Hub, и через некоторое время вы получите сообщения об ошибках, подобные приведенным ниже:
Outputwordpress_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, и вы также увидите, что это еще не все:
Outputwordpress_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:
- 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
запускать контейнеры в фоновом режиме, чтобы вы могли продолжать использовать свой терминал:
- 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
еще раз:
- 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
Теперь снова запустите группу приложений:
- 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 с помощью следующей команды:
- docker-compose stop
Попробуйте снова загрузить сайт WordPress. Вы увидите, что сайт не работает. Снова запустите контейнеры Docker:
- 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
:
- docker-compose stop
Удалите существующий контейнер, чтобы мы могли сопоставить том с файловой системой хоста:
- docker-compose rm wordpress
Запустите WordPress снова:
- docker-compose -d
После того, как приглашение вернется, WordPress должен снова работать — на этот раз с использованием файловой системы хоста для хранения корня документа.
Если вы посмотрите в свой каталог ~/wordpress
, вы увидите, что в нем теперь есть каталог wp_html
:
- ls ~/wordpress
Все исходные файлы WordPress находятся внутри него. Вносимые вами изменения будут приняты контейнером WordPress в режиме реального времени.
Этот опыт был немного более плавным, чем обычно: контейнер WordPress Docker настроен на проверку того, пуст ли /var/www/html
или нет, когда он запускается, и копирует туда файлы соответствующим образом. Обычно вам придется сделать этот шаг самостоятельно.
Заключение
У вас должен быть запущен и запущен полный WordPress. Вы сможете использовать один и тот же метод для развертывания самых разных систем, используя образы, доступные в Docker Hub. Обязательно выясните, какие тома являются постоянными, а какие — нет для каждого контейнера, который вы используете.
Удачного докеринга!