Создание Docker-контейнера для memcached
Ubuntu | Комментировать запись
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: Docker, Memcached