Установка WordPress и PhpMyAdmin с помощью Docker Compose в Ubuntu 14.04
PHP, Ubuntu | Комментировать запись
Docker Compose упрощает процесс оркестровки контейнеров Docker (запуск, отключение, добавление томов, установку межконтейнерных связей и т.п.).
Данное руководство научит устанавливать приложения (на примере WordPress и PHPMyAdmin) с помощью Docker Compose.
Как правило, WordPress работает на стеке LAMP (который состоит из Linux, Apache, MySQL/MariaDB и PHP). Официальный Docker-образ WordPress включает в себя Apache и PHP, потому самостоятельно установить нужно только MariaDB.
Требования
- Сервер Ubuntu 14.04.
- Не-root пользователь с доступом к команде sudo.
- Предварительно установленные программы Docker и Docker Compose (инструкции по установке можно найти здесь).
1: Установка WordPress
В руководстве используются официальные образы WordPress и MariaDB.
Примечание: Дополнительную информацию можно найти на GitHub и Docker Hub.
Для начала нужно создать папку, в которой будут храниться данные.
mkdir ~/wordpress && cd $_
Теперь создайте файл docker-compose.yml, необходимый для запуска контейнера WordPress:
nano ~/wordpress/docker-compose.yml
Вставьте в файл следующий код:
wordpress:
image: wordpress
Теперь Docker Compose сможет запустить новый контейнер wordpress и загрузить образ wordpress с Docker Hub.
Чтобы запустить образ, введите:
docker-compose up
Docker загрузит образ WordPress с Docker Hub, и спустя некоторое время вы получите несколько сообщений об ошибках:
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 следующий код:
wordpress:
image: wordpress
links:
- wordpress_db:mysql
wordpress_db:
image: mariadb
Примечание: Файлы YAML чувствительны к пробелам и отступам.
Этот код определяет новый контейнер wordpress_db и использует для его создания образ mariadb с Docker Hub. Кроме того, он связывает контейнер wordpress с контейнером wordpress_db и называет его mysql (в контейнере wordpress имя хоста mysql будет пересылаться на контейнер wordpress_db).
Снова запустите команду:
docker-compose up
Она загрузит образ MariaDB. На экране появится:
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-пароль.
Отредактируйте файл Docker Compose:
nano ~/wordpress/docker-compose.yml
Добавьте в конец раздела wordpress_db следующие две строки, заменив examplepass более надёжным паролем.
wordpress_db:
...
environment:
MYSQL_ROOT_PASSWORD: examplepass
...
Это установит в контейнере wordpress_db переменную среды MYSQL_ROOT_PASSWORD, которая задаст необходимый пароль. Образ MariaDB будет проверять эту переменную при запуске и использовать заданный пароль для root-аккаунта.
Теперь нужно настроить перенаправление портов, чтобы иметь возможность подключиться к WordPress во время загрузки. Добавьте в раздел WordPress следующие две строки:
wordpress:
...
ports:
- 8080:80
...
Первый номер порта относится к хосту, а второй порт находится внутри контейнера. Таким образом, эти настройки перенаправляют запросы к порту хоста 8080 на стандартный порт веб-сервера (80) внутри контейнера.
Примечание: Если вы хотите, чтобы WordPress использовал порт веб-сервера 80 и на хосте, вместо 8080:80 укажите 80:80.
В итоге 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 up -d
Теперь все сообщения об ошибках должны исчезнуть. После этого откройте веб-браузер и перейдите по ссылке:
http:// IP_адрес_сервера:8080
например:
http://123.123.123.123:8080
На экране появится страница установки WordPress. Чтобы закончить установку, укажите все данные, запрашиваемые программой, и следуйте её дальнейшим инструкциям.
Поскольку использованные образы Docker являются официальными, каждый из этих образов предоставляет надёжные тома данных. Это означает, внесённые изменения сохранятся даже после перезапуска контейнера.
3: Добавление контейнера PhpMyAdmin
До этого в руководстве использовались только официальные образы, за точность и работоспособность которых отвечает команда Docker. Вы могли обратить внимание, что вам не пришлось задавать переменные окружения WordPress. Как только контейнер WordPress подключился к контейнеру MariaDB, всё заработало.
Это происходит потому, что официальный контейнер WordPress содержит скрипт, который считывает переменную 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 (таким образом, все ссылки на имя mysql в контейнере phpmyadmin будут переадресованы на контейнер wordpress_db). Также эти настройки свяжут порт контейнера 80 и порт хоста 8181, а затем установят несколько переменных окружения, чтобы задать имя пользователя и пароль MariaDB. Однако этот образ не может извлечь переменную MYSQL_ROOT_PASSWORD из контейнера wordpress_db, как это делает образ wordpress. Потому нужно скопировать в контейнере wordpress_db строку:
MYSQL_ROOT_PASSWORD: examplepass
а затем задать имя пользователя 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 будет установлено. Теперь можно открыть в браузере ссылку:
http:// IP_адрес_сервера:8181
например:
http://123.123.123.123:8181
На экране появится страница входа PhpMyAdmin.
Чтобы пройти аутентификацию, используйте имя root и пароль, указанный в файле YAML (в данном примере это examplepass).
Как видите, данный сервер включает в себя БД wordpress, которая содержит все данные установки WordPress.
Таким образом можно добавить любое необходимое количество контейнеров. Этот подход очень прост и продуктивен: при этом вам не нужно заниматься настройками и зависимостями каждого компонента, устанавливать их на один сервер, а в результате все компоненты собираются сами, как конструктор.
4: Создание сайта WordPress
Теперь у вас есть все компоненты, необходимые для создания сайта WordPress внутри контейнера Docker.
По умолчанию, document root сайта WordPress является перманентным каталогом (то есть, его данные постоянно сохраняются в информационной системе). Потому изменения, добавленные в этот каталог, сохранятся после перезагрузки группы контейнеров.
Чтобы убедиться в этом, откройте WordPress в браузере (http://123.123.123.123:8080) и отредактируйте запись Hello World!, которая существует по умолчанию. Потом остановите все контейнеры Docker:
docker-compose stop
Теперь попробуйте снова загрузить сайт WordPress в браузере. Поскольку контейнеры, отключены, сайт не загрузится. Запустите контейнеры Docker:
docker-compose up -d
Откройте сайт WordPress в браузере. Вы увидите, что все внесённые в запись изменения сохранились и после перезагрузки контейнеров.
5: Хранение каталога document root в файловой системе хоста (опционально)
Docker позволяет хранить каталог document root сайта WordPress в файловой системе хоста. Для этого используются тома данных, которые обеспечивают обмен файлами между хостом и контейнером.
Откройте docker-compose.yml:
nano ~/wordpress/docker-compose.yml
Добавьте в раздел wordpress: следующие строки:
wordpress:
...
volumes:
- ~/wordpress/wp_html:/var/www/html
...
Остановите текущую сессию docker-compose:
docker-compose stop
Удалите контейнер wordpress, чтобы подключить том к файловой системе хоста:
docker-compose rm wordpress
Снова запустите WordPress:
docker-compose -d
После этого WordPress снова будет работать, теперь уже сохраняя данные в файловой системе хоста.
Теперь в каталоге ~/wordpress появится новый каталог wp_html:
ls ~/wordpress
В нём хранятся все файлы WordPress. Все изменения, внесенные на сайт WordPress, будут переданы в контейнер в режиме реального времени.
Контейнер WordPress проверяет, появились ли в каталоге /var/www/html какие-либо изменения, и в случае необходимости копирует соответствующие файлы.
Заключение
Теперь на сервере Ubuntu 14.04 развёрнут полноценный сайт WordPress. Такой подход позволяет развернуть множество других приложений. При этом важно понимать, какие тома данных являются перманентными, а какие – нет.
Tags: Docker Compose, phpMyAdmin, Ubuntu 14.04, WordPress