Докеризация и развёртывание приложений WordPress на сервере Ubuntu

Published by Leave your thoughts

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: , , ,

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>