Создание Docker-контейнера для memcached

Memcached может значительно увеличить производительность стека развертывания приложения. Memcached не требует дополнительных ресурсов, и, кроме того, помогает использовать текущий их объем более эффективно.

Этот мануал в первую очередь предназначен для тех, кто хочет запустить несколько веб-приложений. Он поможет вам создать docker-образ, который можно использовать для быстрого развертывания изолированных контейнеров memcached. Эти контейнеры, работающие в индивидуальных средах, смогут взаимодействовать с приложениями и ускорят их загрузку.

Краткий обзор Docker

Проект docker предлагает инструменты, разработанные на основе некоторых функций ядра Linux. Цель docker состоит в том, чтобы помочь разработчикам и системным администраторам портировать приложения (со всеми их зависимостями) и заставить их работать кроссплатформенно на разных машинах.

Для этого Docker использует безопасные изолированные среды на основе LXC (Linux Containers), который называются контейнерами. Эти контейнеры создаются из docker-образов. Образы можно создать вручную или автоматически через Dockerfiles.

Читайте также: Установка и использование Docker

Краткий обзор memcached

Memcached – это распределенное хранилище данных с открытым исходным кодом. Оно было разработано для хранения определенных типов данных в ОЗУ (вместо традиционных дисков с более низкой скоростью) для очень быстрого извлечения данных приложениями. Это позволяет сократить время, затрачиваемое на обработку запросов, путем уменьшения количества запросов (по сравнению с традиционными СУБД, например, MySQL).

Внедряя хорошо спланированный и оптимизированный механизм кэширования, вы помогаете приложению обрабатывать большее количество запросов и выполнять больше процедур.

Memcached часто используется в среде производства. Это один из самых популярных инструментов для повышения производительности, который не требует обязательного внедрения дополнительного оборудования (например, большего количества серверов или ресурсов).

Memcached сохраняет ключи и совпадающие с ними значения (размером до 1 МБ) в ассоциативный массив (т. е. в хэш-таблицу), который можно масштабировать и распределять на большом количестве виртуальных серверов.

Установка Docker в Ubuntu

Читайте также: Установка и использование Docker в Ubuntu 16.04

Сначала нужно установить Docker (в данном руководстве используется версия 0.7.1).

Обновите индекс пакетов:

sudo aptitude    update
sudo aptitude -y upgrade

Убедитесь, что поддержка aufs включена:

sudo aptitude install linux-image-extra-`uname -r`

Добавьте ключ репозитория docker в apt, чтобы проверить подлинность пакета:

sudo sh -c "wget -qO- https://get.docker.io/gpg | apt-key add -"

Добавьте репозиторий docker в список источников:

sudo sh -c "echo deb http://get.docker.io/ubuntu docker main\
> /etc/apt/sources.list.d/docker.list"

Обновите индекс пакетов:

sudo aptitude    update

Загрузите и установите docker:

sudo aptitude install lxc-docker

По умолчанию брандмауэр UFW (Uncomplicated Firewall) блокирует весь пересылаемый трафик, который необходим docker.

Читайте также: Основы UFW: общие правила и команды фаервола

Включите переадресацию в UFW. Откройте конфигурационный файл брандмауэра:

sudo nano /etc/default/ufw

Найдите в нем строку:

DEFAULT_FORWARD_POLICY="DROP"

Измените ее значение:

DEFAULT_FORWARD_POLICY="ACCEPT"

Нажмите CTRL+X и Y, чтобы сохранить и закрыть файл.

Перезапустите UFW:

sudo ufw reload

Базовые команды Docker

Запуск демона Docker и использование интерфейса командной строки

После установки демон docker должен работать в фоновом режиме, он уже готов обрабатывать команды, отправленные из командной строки. Если вам нужно вручную запустить docker, используйте команду:

. sudo docker -d &

Командная строка docker принимает следующий синтаксис:

sudo docker [опция] [команда] [агрумент]

Примечание: Для работы с docker у пользователя должен быть доступ к sudo.

Базовые команды docker

  • attach – подключиться к запущенному конетйнеру.
  • build – создать контейнер из файла Dockerfile.
  • commit – создать новый образ на основе изменений контейнера.
  • cp – копировать файлы/каталоги из файловой системы контейнеров на хост.
  • diff – исследовать изменения в файловой системе контейнера.
  • events – получить события с сервера в режиме реального времени.
  • export – экспортировать содержимое контейнера как tar-архив.
  • history – показать историю образа.
  • images – просмотреть список образов.
  • import – создать новый образ файловой системы из содержимого tar-архива.
  • info – запрос общесистемной информации.
  • insert – вставить файл в образ.
  • inspect – запрос низкоуровневой информации о контейнере.
  • kill – убить запущенный контейнер.
  • load – загрузить образ из tar-архива.
  • login – зарегистрироваться или войти на сервер реестра docker.
  • logs – извлечь логи контейнера.
  • port – найти открытый порт, который связан с PRIVATE_PORT.
  • ps – отобразить список контейнеров.
  • pull – загрузить образ или репозиторий из реестра docker.
  • push — загрузить образ или репозиторий в реестр docker.
  • restart – перезапустить запущенный контейнер.
  • rm – удалить один или несколько контейнеров.
  • rmi – удалить один или несколько образов.
  • run – запустить команду в новом контейнере.
  • save – сохранить образ в tar-архив.
  • search – поиск образа в индексе docker.
  • start – запустить остановленный контейнер.
  • stop – остановить запущенный контейнер.
  • tag — пометить изображение в репозитории.
  • top – поиск запущенных процессов контейнера.
  • version – вызов информации о версии docker.

Создание образа Memcached

Создайте файл Dockerfile, с помощью которого docker сможет автоматически собирать образы с предустановленным хранилищем Memcached (они будут использоваться для запуска изолированных экземпляров Memcached).

Что такое Dockerfile?

Dockerfile – это сценарии, содержащие последовательность команд, которые должны быть выполнены в указанном порядке для автоматического создания нового образа docker. Они очень помогают в развертывании.

Эти файлы всегда начинаются с определения базового образа с помощью команды FROM. С этого момента начинается процесс сборки, и каждое последующее действие формирует контейнер с помощью коммитов (сохранение состояния образа) на хосте.

# Build an image using the Dockerfile at current location
# Tag the final image with [name] (e.g. *nginx*)
# Example: sudo docker build -t [name] .
sudo docker build -t memcached_img .

Читайте также: Автоматическая сборка образов Docker с помощью Dockerfile

Основные команды Dockerfile

  • Add – копирование файла с хоста в контейнер.
  • CMD – определение команд по умолчанию, который нужно выполнить или передать в ENTRYPOINT.
  • ENTRYPOINT – точка входа в приложение по умолчанию внутри контейнера.
  • ENV – установка переменной среды (например «ключ = значение»).
  • EXPOSE – открыть порт.
  • FROM – определение базового образа.
  • MAINTAINER – определение владельца/автора данных в Dockerfile.
  • RUN – выполнение команды и коммит конечного результата в образе.
  • USER – определяет в образе пользователя, который запускает контейнер.
  • VOLUME – монтирует каталог с хоста в контейнер.
  • WORKDIR – определяет каталог для директив CMD, которые нужно выполнить.

Создание Dockerfile

Поскольку Dockerfiles представляют собой простые текстовые документы, вы можете создать такой файл с помощью любого текстового редактора и записать в него команды, которые должен выполнить docker, чтобы создать образ. Добавьте в файл команды в той последовательности, в которой они должны выполняться.

Примечание: Полный код Dockerfile вы найдете в конце данного раздела.

Создайте пустой Dockerfile:

nano Dockerfile

В нем нужно последовательно перечислить все команды и директивы. В начале каждого Dockerfile указывается базовый образ (с помощью команды FROM).

Определите цель этого Dockerfile и укажите базовый образ:

############################################################
# Dockerfile to run Memcached Containers
# Based on Ubuntu Image
############################################################
# Set the base image to use to Ubuntu
FROM ubuntu
# Set the file maintainer (your name - the file's author)
MAINTAINER Maintaner Name

После этого начального блока команд и объявлений можно перечислить инструкции по установке Memcached.

# Update the default application repository sources list
RUN apt-get update
# Install Memcached
RUN apt-get install -y memcached

Укажите порт по умолчанию, который будет открыт в контейнере:

# Port to expose (default: 11211)
EXPOSE 11211

Установите команду по умолчанию и входную точку (т. е. Демон Memcached):

# Default Memcached run command arguments
CMD ["-u", "root", "-m", "128"]
# Set the user to run Memcached daemon
USER daemon
# Set the entrypoint to memcached binary
ENTRYPOINT memcached

В результате ваш Dockerfile будет выглядеть так:

############################################################
# Dockerfile to run Memcached Containers
# Based on Ubuntu Image
############################################################
# Set the base image to use to Ubuntu
FROM ubuntu
# Set the file maintainer (your name - the file's author)
MAINTAINER Maintaner Name
# Update the default application repository sources list
RUN apt-get update
# Install Memcached
RUN apt-get install -y memcached
# Port to expose (default: 11211)
EXPOSE 11211
# Default Memcached run command arguments
CMD ["-m", "128"]
# Set the user to run Memcached daemon
USER daemon
# Set the entrypoint to memcached binary
ENTRYPOINT memcached

Сохраните и закройте Dockerfile (CTRL+X и Y).

Создание образа Docker для контейнеров Memcached

Теперь можно создать первый образ Memcached.

Чтобы создать образ с меткой memcached_img, запустите команду:

sudo docker build -t memcached_img .

Примечание: В конце команды обязательно поставьте точку, иначе Docker не сможет найти Dockerfile.

Запуск Docker-контейнеров Memcached

Теперь можно очень просто создать любое количество совершенно изолированных и автономных экземпляров memcached на основе полученного образа. Все, что для этого нужно сделать – это создать новый контейнер с помощью команды docker run.

Создание контейнера Memcached

Чтобы создать новый контейнер, используйте следующую команду (при необходимости откорректируйте данные):

# Example: sudo docker run -name [container name] -p [port to access:port exposed] -i -t [memcached image name]
sudo docker run -name memcached_ins -d -p 45001:11211 memcached_img

Эта команда создаст контейнер по имени memcached_ins, доступный по порту 45001, на основе образа memcached_img.

Ограничение памяти контейнера Memcached

Чтобы ограничить объем памяти, которую может использовать процесс контейнера docker, просто установите флаг -m [memory amount].

Чтобы ограничить доступную память контейнера до 256 Мб, введите:

# Example: sudo 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]
sudo docker run -name memcached_ins -m 256m -d -p 45001:11211 memcached_img

Чтобы подтвердить ограничение памяти, вы можете исследовать контейнер:

# Example: docker inspect [container ID] | grep Memory
sudo docker inspect memcached_ins | grep Memory

Примечание: Приведенная выше команда выведет информацию о доступной памяти. Чтобы просмотреть всю информацию о контейнере, используйте команду:

sudo docker inspect [container ID]

Тестирование контейнера Memcached

Существует несколько способов проверить работу нового контейнера. К примеру, можно использовать для этого простое приложение для Python CLI. Также можно просто подключиться к приложению с помощью кэширующих аддонов, фреймворков или библиотек.

Убедитесь, что у вас есть все необходимые библиотеки для Python и Memcached:

sudo apt-get update && sudo apt-get -y upgrade
sudo apt-get install -y python-pip
pip install python-memcached

Создайте простой сценарий Python:

nano cache.py

Добавьте в него следующий код:

# Import python-memcache and sys for arguments
import memcache
import sys
# Set address to access the Memcached instance
addr = 'localhost'
# Get number of arguments
# Expected format: python cache.py [memcached port] [key] [value]
len_argv = len(sys.argv)
# At least the port number and a key must be supplied
if len_argv < 3:
sys.exit("Not enough arguments.")
# Port is supplied and a key is supplied - let's connect!
port  = sys.argv[1]
cache = memcache.Client(["{0}:{1}".format(addr, port)])
# Get the key
key   = str(sys.argv[2])
# If a value is also supplied, set the key-value pair
if len_argv == 4:
value = str(sys.argv[3])
cache.set(key, value)
print "Value for {0} set!".format(key)
# If a value is not supplied, return the value for the key
else:
value = cache.get(key)
print "Value for {0} is {1}.".format(key, value)

Сохраните и закройте файл.

Этот сценарий поможет проверить работу docker-контейнера memcached на хосте.

# Example: python cache.py [port] [key] [value]
python cache.py 45001 my_test_key test_value
# Return: Value for my_test_key set
# See if the key is set:
python cache.py 45001 my_test_key
# Return: Value for my_test_key is test_value.

Читайте также: Документация docker

Tags: ,