Как установить 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 WordPress и MariaDB. Если вам интересно, дополнительную информацию об этих образах и параметрах их конфигурации можно найти на соответствующих страницах GitHub и Docker Hub.
Давайте начнем с создания папки, в которой будут храниться наши данные, и создания минимального файла docker-compose.yml
для запуска нашего контейнера WordPress:
1 |
mkdir ~/wordpress && cd $_ |
Затем создайте ~/wordpress/docker-compose.yml
с помощью вашего любимого текстового редактора (nano — это просто, если у вас нет предпочтений):
1 |
<ol><li data-prefix="$"> <span class="token function">нано</span> ~/wordpress/docker-compose.yml</li></ol> |
и вставьте следующее:
1 |
wordpress: image: wordpress |
Это просто говорит Docker Compose запустить новый контейнер под названием wordpress
и загрузить образ wordpress
из Docker Hub.
Мы можем вывести изображение следующим образом:
1 |
<ol><li data-prefix="$"> <span class="token function">докер-составить</span></li></ol> |
Вы увидите, как Docker загружает и извлекает образ WordPress из Docker Hub, и через некоторое время вы получите сообщения об ошибках, подобные приведенному ниже:
1 |
<div class="secondary-code-label" title="Выход"> Выход</div> WordPress_1 | ошибка: отсутствуют переменные среды WORDPRESS_DB_HOST и MYSQL_PORT_3306_TCP wordpress_1 | Вы забыли указать --link some_mysql_container:mysql или установить внешнюю базу данных wordpress_1 | с -e WORDPRESS_DB_HOST=имя хоста:порт? dockercompose_wordpress_1 завершился с кодом 1 |
Это WordPress жалуется, что не может найти базу данных. Давайте добавим в смесь образ MariaDB и свяжем его, чтобы это исправить.
Шаг 2 — Установка MariaDB
Чтобы добавить образ MariaDB в группу, повторно откройте docker-compose.yml
в текстовом редакторе:
1 |
nano ~/wordpress/docker-compose.yml |
Измените docker-compose.yml
так, чтобы он соответствовал приведенному ниже (будьте осторожны с отступами, файлы YAML чувствительны к пробелам)
1 |
wordpress: image: wordpress</code> :</mark><mark> - wordpress_db:mysql</mark><mark> wordpress_db:</mark><mark> изображение: Мариадб</mark> |
Здесь мы определили новый контейнер под названием wordpress_db
и указали ему использовать образ mariadb
из Docker Hub. Мы также сказали нашему контейнеру wordpress
связать наш контейнер wordpress_db
с контейнером wordpress
и назвать его mysql
(внутри контейнера wordpress
имя хоста mysql
будет перенаправлено в наш контейнер wordpress_db
).
Если вы снова запустите docker-compose up
, вы увидите, что он загружает образ MariaDB, и вы также увидите, что мы еще не совсем закончили:
1 |
<div class="secondary-code-label" title="Выход"> Выход</div> wordpress_db_1 | ошибка: база данных не инициализирована и MYSQL_ROOT_PASSWORD не установлен wordpress_db_1 | Вы забыли добавить -e MYSQL_ROOT_PASSWORD=... ? WordPress_1 | ошибка: отсутствует необходимая переменная среды WORDPRESS_DB_PASSWORD wordpress_1 | Вы забыли -e WORDPRESS_DB_PASSWORD=... ? WordPress_1 | WordPress_1 | (Также интерес могут представлять WORDPRESS_DB_USER и WORDPRESS_DB_NAME.) wordpress_wordpress_db_1 завершен с кодом 1 wordpress_wordpress_1 завершен с кодом 1 Грациозная остановка... (нажмите Ctrl+C еще раз, чтобы принудительно) |
WordPress все еще жалуется на невозможность найти базу данных, и теперь у нас есть новая жалоба от MariaDB, в которой говорится, что пароль root не установлен.
Похоже, что просто связать два контейнера недостаточно. Давайте продолжим и установим переменную MYSQL_ROOT_PASSWORD
, чтобы мы могли действительно запустить эту штуку.
Еще раз отредактируйте файл Docker Compose:
1 |
<ol><li data-prefix="$"> <span class="token function">нано</span> ~/wordpress/docker-compose.yml</li></ol> |
Добавьте эти две строки в конец раздела wordpress_db
, но make sure to change examplepass
to a more secure password!
1 |
wordpress_db: ...</code> среда:</mark><mark> MYSQL_ROOT_PASSWORD: примерный пароль</mark> ... |
Это установит переменную среды внутри контейнера wordpress_db
под названием MYSQL_ROOT_PASSWORD
с желаемым паролем. Образ MariaDB Docker настроен на проверку этой переменной среды при запуске и позаботится о настройке БД с учетной записью root с паролем, определенным как MYSQL_ROOT_PASSWORD
.
Пока мы этим занимаемся, давайте также настроим переадресацию порта, чтобы мы могли подключиться к нашей установке WordPress после ее фактической загрузки. В разделе wordpress
добавьте эти две строки:
1 |
wordpress: ...</code> порты:</mark><mark> - 8080:80</mark> ... |
Первый номер порта — это номер порта на хосте, а второй номер порта — это порт внутри контейнера. Итак, эта конфигурация перенаправляет запросы на порт 8080 хоста на порт 80 веб-сервера по умолчанию внутри контейнера.
Note: Если вы хотите, чтобы WordPress запускался на порту 80 веб-сервера по умолчанию на хосте, измените предыдущую строку на 80:80
, чтобы запросы к порту 80 на хосте перенаправлялись на порт 80 внутри контейнера WordPress.
Ваш полный файл docker-compose.yml
теперь должен выглядеть так:
1 |
wordpress: image: wordpress links: - wordpress_db:mysql ports: - 8080:80 wordpress_db: image: mariadb environment: MYSQL_ROOT_PASSWORD:</code> examplepass</mark> |
С этой конфигурацией мы действительно можем запустить WordPress. На этот раз давайте запустим его с опцией -d
, которая укажет docker-compose
запускать контейнеры в фоновом режиме, чтобы вы могли продолжать использовать свой терминал:
1 |
<ol><li data-prefix="$"> <span class="token function">докер-составить</span> <span class="token parameter variable">-d</span></li></ol> |
Вы увидите целую кучу текста, пролетающего мимо вашего экрана. Как только он успокоится, откройте веб-браузер и найдите IP-адрес вашего устройства DigitalOcean на порту 8080 (например, если IP-адрес вашего сервера 123.456.789.123 вам следует набрать http://123.456.789.123:8080 в свой браузер.)
Вы должны увидеть новую страницу установки WordPress и сможете завершить установку и вести блог как обычно.
Поскольку оба эти образа являются официальными образами Docker и соответствуют всем лучшим практикам Docker, каждый из этих образов имеет для вас заранее определенные постоянные тома — это означает, что если вы перезапустите контейнер, ваши сообщения в блоге все равно останутся там. Подробнее о работе с томами Docker можно узнать в руководстве по томам данных Docker.
Шаг 3 — Добавление контейнера PhpMyAdmin
Отлично, это было относительно безболезненно. Давайте попробуем немного пофантазировать.
До сих пор мы использовали только официальные изображения, за точность которых команда Docker прилагает все усилия. Возможно, вы заметили, что нам не нужно было предоставлять контейнеру WordPress какие-либо переменные среды для его настройки. Как только мы связали его с правильно настроенным контейнером MariaDB, все заработало.
Это связано с тем, что внутри контейнера WordPress Docker есть скрипт, который фактически получает переменную MYSQL_ROOT_PASSWORD
из нашего контейнера wordpress_db
и использует ее для подключения к WordPress.
Давайте немного выйдем за рамки официальных изображений и воспользуемся изображением PhpMyAdmin, предоставленным сообществом. Продолжайте и отредактируйте docker-compose.yml
еще раз:
1 |
<ol><li data-prefix="$"> <span class="token function">нано</span> docker-compose.yml</li></ol> |
Вставьте следующее в конец файла:
1 |
phpmyadmin: image: corbinu/docker-phpmyadmin links: - wordpress_db:mysql ports: - 8181:80 environment: MYSQL_USERNAME: root MYSQL_ROOT_PASSWORD:</code> examplepass</mark> |
Обязательно замените примерпасс с тем же корневым паролем из контейнера wordpress_db
, который вы установили ранее.
Это захватывает docker-phpmyadmin
членом сообщества corbinu
, связывает его с нашим контейнером wordpress_db
с именем mysql
(это означает, что внутри контейнера phpmyadmin
ссылки на имя хоста mysql
будут перенаправлены в наш контейнер wordpress_db
), открывает его порт 80 на порту 8181 хост-систему и, наконец, устанавливает пару переменных среды с нашим именем пользователя и паролем MariaDB. Этот образ не извлекает автоматически переменную среды MYSQL_ROOT_PASSWORD
из среды контейнера wordpress_db
, как это делает образ wordpress
. На самом деле нам нужно скопировать строку MYSQL_ROOT_PASSWORD: examplepass
из контейнера wordpress_db
и установить имя пользователя root
.
Полный файл docker-compose.yml
теперь должен выглядеть так:
1 |
wordpress: image: wordpress links: - wordpress_db:mysql ports: - 8080:80 wordpress_db: image: mariadb environment: MYSQL_ROOT_PASSWORD: examplepass</code> phpmyadmin:</mark><mark> изображение: корбину/docker-phpmyadmin</mark><mark> ссылки:</mark><mark> - wordpress_db:mysql</mark><mark> порты:</mark><mark> - 8181:80</mark><mark> среда:</mark><mark> MYSQL_USERNAME: корень</mark><mark> MYSQL_ROOT_PASSWORD: примерный пароль</mark> |
Теперь снова запустите группу приложений:
1 |
<ol><li data-prefix="$"> <span class="token function">докер-составить</span> <span class="token parameter variable">-d</span></li></ol> |
Вы увидите установку PhpMyAdmin. После завершения снова посетите IP-адрес вашего сервера (на этот раз используя порт 8181, например http://123.456.789.123:8181 ). Вас встретит экран входа в PhpMyAdmin.
Войдите в систему, используя имя пользователя root
и пароль, которые вы установили в файле YAML, и вы сможете просматривать свою базу данных. Вы заметите, что на сервере есть база данных wordpress
, которая содержит все данные из вашей установки WordPress.
Таким образом вы можете добавить столько контейнеров, сколько захотите, и связать их любым удобным для вас способом. Как видите, этот подход довольно мощный — вместо того, чтобы заниматься конфигурацией и предварительными условиями для каждого отдельного компонента и устанавливать их все на одном сервере, вы можете соединять части вместе, как блоки Lego, и добавлять компоненты по частям. Используя такие инструменты, как Docker Swarm, вы даже можете прозрачно запускать эти контейнеры на нескольких серверах! Однако это немного выходит за рамки данного руководства. Если вам интересно, Docker предоставляет некоторую документацию по этому вопросу.
Шаг 4 — Создание сайта WordPress
Поскольку все файлы вашего нового сайта WordPress хранятся внутри контейнера Docker, что происходит с вашими файлами, когда вы останавливаете контейнер и запускаете его снова?
По умолчанию корень документа для контейнера WordPress является постоянным. Это связано с тем, что образ WordPress из Docker Hub настроен таким образом. Если вы внесете изменения в свой сайт WordPress, остановите группу приложений и запустите ее снова, на вашем сайте все равно останутся внесенные вами изменения.
Давай попробуем.
Перейдите в свой WordPress из веб-браузера (например, http://123.456.789.123:8080 ). Отредактируйте Hello World! сообщение, которое уже существует. Затем остановите все контейнеры Docker с помощью следующей команды:
1 |
<ol><li data-prefix="$"> остановка <span class="token function">docker-compose</span></li></ol> |
Попробуйте загрузить сайт WordPress еще раз. Вы увидите, что сайт не работает. Снова запустите контейнеры Docker:
1 |
<ol><li data-prefix="$"> <span class="token function">докер-составить</span> <span class="token parameter variable">-d</span></li></ol> |
Снова загрузите сайт WordPress. Вы должны увидеть свой блог и изменения, которые вы внесли ранее. Это показывает, что внесенные вами изменения сохраняются, даже когда контейнеры остановлены.
Шаг 5. Сохранение корня документа в файловой системе хоста (необязательно)
Корень документа WordPress можно хранить в файловой системе хоста, используя том данных Docker для обмена файлами между хостом и контейнером.
Note: Дополнительные сведения о работе с томами данных Docker см. в руководстве по томам данных Docker.
Давайте попробуем. Откройте файл docker-compose.yml
еще раз:
1 |
nano ~/wordpress/docker-compose.yml |
в разделе wordpress:
добавьте следующие строки:
1 |
wordpress: ...</code> тома:</mark><mark> - ~/wordpress/wp_html:/var/www/html</mark> ... |
Остановите текущий сеанс docker-compose
:
1 |
<ol><li data-prefix="$"> остановка <span class="token function">docker-compose</span></li></ol> |
Удалите существующий контейнер, чтобы мы могли сопоставить том с файловой системой хоста:
1 |
<ol><li data-prefix="$"> <span class="token function">Docker-Compose</span> <span class="token function">RM</span> Wordpress</li></ol> |
Запустите WordPress снова:
1 |
<ol><li data-prefix="$"> <span class="token function">докер-компоновать</span> <span class="token parameter variable">-d</span></li></ol> |
Как только появится приглашение, WordPress должен снова запуститься и работать — на этот раз с использованием файловой системы хоста для хранения корня документа.
Если вы заглянете в свой каталог ~/wordpress
, то увидите, что теперь в нем есть каталог wp_html
:
1 |
<ol><li data-prefix="$"> <span class="token function">лс</span> ~/wordpress</li></ol> |
Внутри него находятся все исходные файлы WordPress. Внесенные вами изменения будут подхвачены контейнером WordPress в режиме реального времени.
Этот опыт был немного более плавным, чем обычно — контейнер WordPress Docker настроен на проверку того, является ли /var/www/html
пустым или нет при запуске, и копирует туда файлы соответствующим образом. Обычно вам придется сделать этот шаг самостоятельно.
Заключение
У вас должна быть развернута и запущена полная версия WordPress. Вы сможете использовать один и тот же метод для развертывания самых разных систем, используя образы, доступные в Docker Hub. Обязательно выясните, какие тома являются постоянными, а какие нет, для каждого создаваемого вами контейнера.
Удачного Докеринга!