Развёртывание приложений WordPress в Docker на Ubuntu
Ubuntu | Комментировать запись
WordPress уже давно является одним из самых популярных веб-приложений. Система управления контентом WordPress постоянно развивается в течение многих лет, благодаря чему с её помощью можно создать почти бесконечное количество уникальных сайтов (или даже веб-приложений).
Данное руководство поможет упаковать и поместить в контейнеры Docker несколько приложений WordPress, а также подобрать самый простой и надёжный способ развертывания нескольких сайтов WordPress на одном хосте.
Что такое Docker?
Docker – это система контейнеризации, которая предлагает множество производительных инструментов, построенных на основе некоторых функций ядра Linux. Цель системы – помочь разработчикам и системным администраторам выполнить портирование приложений (со всеми подготовленными зависимостями) и сделать их доступными на разных системах и машинах.
Для этого Docker создаёт для приложения надёжное окружение на основе LXC (Linux Containers). Такие образы контейнеров можно построить вручную при помощи ряда команд; также можно автоматизировать этот процесс с помощью Dockerfiles.
Что такое WordPress?
Система управления контентом WordPress изначально разрабатывалась как общедоступная и простая в установке блог-платформа. Со временем платформа WordPress стала чрезвычайно популярной, что привело к созданию сторонних плагинов и расширений. Таким образом блог-платформа превратилась в CMS. WordPress позволяет быстро создать и развернуть практически любой сайт или приложение.
WordPress – открытая платформа, основанная на PHP. На сегодняшний день язык программирования PHP является одним из самых популярных языков для создания сайтов и веб-приложений.
Сайты WordPress используют реляционную БД MySQL для хранения данных.
Установка Docker в Ubuntu
Обновите пакеты сервера:
sudo apt-get update
sudo apt-get -y upgrade
Включите поддержку Aufs:
sudo apt-get install linux-image-extra-`uname -r`
Добавьте ключ репозитория Docker в apt-key для проверки:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
Добавьте репозиторий Docker:
sudo sh -c "echo deb http://get.docker.io/ubuntu docker main\
> /etc/apt/sources.list.d/docker.list"
Обновите репозитории:
sudo apt-get update
Загрузите и установите Docker:
sudo apt-get install lxc-docker git
Настройка переадресации трафика UFW
Стандартный брандмауэр Ubuntu UFW по умолчанию блокирует весь переадресованный трафик, который необходим для работы docker.
Отредактируйте конфигурационный файл брандмауэра:
sudo nano /etc/default/ufw
Найдите в файле строку DEFAULT_FORWARD_POLICY:
DEFAULT_FORWARD_POLICY="DROP"
И замените стандартное значение:
DEFAULT_FORWARD_POLICY="ACCEPT"
Нажмите CTRL+X и Y, чтобы закрыть и сохранить файл.
Перезапустите UFW:
sudo ufw reload
Настройка удалённых подключений
Чтобы иметь возможность работать с демоном Docker удалённо, нужно разблокировать стандартный порт Docker, 4243.
sudo ufw allow 4243/tcp
Использование Docker
Интерфейс командной строки
После установки демон Docker запустится в фоновом режиме и будет готов к приему команд, отправленных клиентом Docker. Однако в некоторых ситуациях приходится запускать Docker вручную.
Чтобы запустить демон Docker:
sudo docker -d &
Для клиента:
sudo docker [option] [command] [arguments]
Примечание: Docker требует прав sudo, поскольку он использует порты и сокеты, принадлежащие root.
Клиентские команды
Чтобы получить полный список клиентских команд Docker, вызовите клиент:
docker
На экране появится список доступных команд (эти команды актуальны для версии 0.8.0):
Commands:
attach Attach to a running container
build Build a container from a Dockerfile
commit Create a new image from a container's changes
cp Copy files/folders from the containers filesystem to the host path
diff Inspect changes on a container's filesystem
events Get real time events from the server
export Stream the contents of a container as a tar archive
history Show the history of an image
images List images
import Create a new filesystem image from the contents of a tarball
info Display system-wide information
insert Insert a file in an image
inspect Return low-level information on a container
kill Kill a running container
load Load an image from a tar archive
login Register or Login to the docker registry server
logs Fetch the logs of a container
port Lookup the public-facing port which is NAT-ed to PRIVATE_PORT
ps List containers
pull Pull an image or a repository from the docker registry server
push Push an image or a repository to the docker registry server
restart Restart a running container
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save an image to a tar archive
search Search for an image in the docker index
start Start a stopped container
stop Stop a running container
tag Tag an image into a repository
top Lookup the running processes of a container
version Show the docker version information
wait Block until a container stops, then print its exit code
Использование Dockerfiles
Что такое Dockerfiles?
Dockerfiles – это скрипты, состоящие из объявленных последовательно команд, которые нужно выполнить в указанном порядке, чтобы автоматически создать образ Docker.
Эти файлы всегда начинаются с определения базового образа при помощи параметра FROM. После этого начинается процесс сборки; каждое последующее действие формирует окончательный образ с комментариями (коммитами).
Dockerfiles используются при помощи команды build:
# Build an image using the Dockerfile at current location
# Tag the final image with [name] (e.g. *wordpress_img*)
# Example: sudo docker build -t [name] .
sudo docker build -t wordpress_img .
Команды Dockerfiles
Dockerfiles отвечают на следующие команды:
- ADD: копирует файл с хоста в контейнер.
- CMD: задаёт команды по умолчанию, которые нужно выполнить, или передает параметру ENTRYPOINT.
- ENTRYPOINT: устанавливает стандартную точку входа приложения внутри контейнера.
- ENV: задаёт переменные окружения (например, ключ-значение).
- EXPOSE: открывает порт.
- FROM: задаёт базовый образ.
- MAINTAINER: указывает имя автора/владельца данного Dockerfile.
- RUN: запускает команду и сохраняет комментарий для образа.
- USER: указывает пользователя, который должен запускать контейнер.
- VOLUME: монтирует каталог с хоста в контейнер.
- WORKDIR: указывает каталог, в котором должны запускаться директивы CMD.
Создание контейнера WordPress
Извлечение образа
В данном руководстве используется образ WordPress «из коробки» по имени tutum/wordpress. Чтобы создать контейнеры при помощи этого образа, нужно сначала загрузить сам образ.
docker pull tutum/wordpress
Данная команда загружает базовые образы и все слои.
После загрузки образа достаточно запустить всего одну команду, чтобы создать контейнеры WordPress.
Создание общедоступного контейнера WordPress
Запустите следующую команду, чтобы создать контейнер, доступный в сети по указанному порту (например, 80).
# Usage: docker run -p [Port Number]:80 tutum/wordpress
# Example:
docker run -p 80:80 tutum/wordpress
Полученные контейнеры WordPress будут принимать внешние соединения на стандартный HTTP-порт 80.
Создание локальных контейнеров WordPress
Иногда контейнеры должны быть доступны только локально (например, если вы хотите настроить балансировку нагрузки или дополнительный обратный прокси-сервер).
Чтобы создать локальные контейнеры WordPress:
# Allocate a port dynamically:
# Usage: docker run -p 127.0.0.1::80 tutum/wordpress
# Example:
docker run -p 127.0.0.1::80 tutum/wordpress
После запуска этой команды Docker создаст локальные контейнеры, предоставит вам их ID, а затем назначит порт. Чтобы задать порт самостоятельно, используйте команду port:
# Usage: docker port [container ID] [private port number]
# Example:
docker port 9af15d73fdf8a997 80
# 127.0.0.1:49156
В таком случае контейнер будет доступен только с локального хоста на порте 49156. Полный адрес контейнера можно использовать для перенаправления соединений с обратного прокси-сервера.
Чтобы указать порт, просто поместите его между IP-адресом и внутренним портом веб-сервера (например, 80).
# Usage: docker run -p 127.0.0.1:[local port]:80 tutum/wordpress
# Example:
docker run -p 127.0.0.1:8081:80 tutum/wordpress
В таком случае контейнер WordPress будет доступен локально на порте 8081.
Примечание: Чтобы запустить контейнер в фоновом режиме, добавьте флаг -d в команду run:
docker run -d ..
В противном случае вы будете подключены к контейнеру.
Чтобы покинуть контейнер, нужно использовать комбинацию клавиш CTRL+P и сразу нажать CTRL+Q.
При помощи команды docker ps можно получить список запущенных контейнеров и найти необходимый ID.
Примечание: С помощью аргумента -name [name] можно закрепить за контейнером имя, которое используется вместо ID.
docker run -d -name new_container_1 ..
Ограничение использования памяти
Для того чтобы ограничить объем памяти, который может использовать процесс контейнера docker, используйте флаг -m [memory amount].
К примеру, чтобы установить лимит памяти в 256 MB:
# Example: docker run -name [name] -m [Memory (int)][memory unit (b, k, m or g)] -d (to run not to attach) -p (to set access and expose ports) [image ID]
docker run -m 64m -d -p 8082:80 tutum/wordpress
Чтобы проверить лимит памяти контейнера, используйте команду inspect:
# Example: docker inspect [container ID] | grep Memory
docker inspect 9a7562a361122706 | grep Memory
Чтобы получить всю необходимую информацию, касающуюся определённого контейнера, введите:
sudo docker inspect [container ID]
Также следует помнить о том, что ядро Linux должно поддерживать ограничения swap, в противном случае установить лимит памяти не получится.
Примечание: Более подробную информацию о docker можно найти в документации.
Tags: Docker, Dockerfiles, UFW, WordPress