Переосмысляем виртуализацию java приложений при использовании Docker. Часть 1

Заметка является переводом статьи: статья

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

При виртуальном развертывании приложений пришлось отказаться от монолитной архитектуры, которая была популярна ранее. Легковесные, service-oriented приложения стали новым стандартом. Мы научились проектировать софт в виде взаимосвязанных сервисов, делая каждый компонент как можно более приближенным к требованиям stateless – не хранящим состояния. Концепция и реализация масштабируемой инфраструктуры изменилась; упор теперь делался не на вертикальную масштабируемость на одном мощном сервере. Теперь разработчики и архитекторы стали думать категориями горизонтальной масштабируемости: как сделать приложение таким, чтоб его можно было развернуть на большом числе серверов сравнительно небольшой вычислительной мощности.

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


docker-fig01

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

Докер, с другой стороны, предоставляет Docker engine — демон, который работает в хостовой ОС. Docker engine транслирует вызовы из контейнера в вызовы хостовой ОС. Образ докер (Docker image), который является слепком для создания контейнера, содержит голый слой OC и только нужные для запуска приложения бинарники и библиотеки.

Эти отличия могут показаться едва уловимыми, но на практике они принципиальны.

Процесс виртуализации

Когда мы работаем в гостевой ОС, нам доступны только те ресурсы (CPU, RAM), которые ей выделены. Когда мы работаем в докере, мы можем располагать ресурсами хост машины. Я вижу скорее сходство докера с платформой виртуализации на уровне процессов, а не с платформой виртуализации на уровне машины. Важно упомянуть, что ваше приложение запускается как самодостаточный и изолированный процесс на хост машине. Docker достигает изоляции благодаря эффективному использованию таких особенностей ОС Linux, как cgroup и пространства имен, которые гарантируют независимую работу каждого процесса.

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

Микросервисы в Docker

Если кратко: микросервисы — это подход проектирования архитектуры, который обеспечивает модульность. Сложные монолитные приложения разбиваются на небольшие независимые процессы. Каждый процесс выполняет специфичное задание и общается с остальными на API, который не зависит от языка программирования.
Микросервисы являются мелко-модульными расцепленными единицами, отвечающими за одну задачу или набор связанных задач. Например, вы управляете профилем пользователя и корзиной покупок. Вместо назначения одной службы, которая отвечает за многие задачи, вы можете сделать выбор в пользу двух отдельных служб — своя для работы с пользователями и еще одна для корзин покупок. На практике построение микросервисов означает написание web приложений, чаще всего с применением RESTful, и группированием их по функциональности. Мы будем использовать язык java, упакуем проект в WAR и развернем на Tomcat внутри контейнера Docker.

Настраиваем докер

Перед погружением в докер займемся настройкой рабочего места. Если вы работаете в linux, то это замечательно: вы можете просто установить докер и запустить. Если у вас Windows или Mac, то докер будет доступен через инструмент Docker Toolbox, который устанавливает виртуальную машину (используется Oracle’s Virtual Box), которая в свою очередь запускает линукс с демоном докер. После этого можно использовать клиент для выполнения команд посредством их отправки для обработки демоном. Учитывайте, что вы не сможете управлять виртуальной машиной, вы только сможете установить инструмент и выполнять команду docker.

Начните со скачивания Docker выполнив инструкции в соответствии с типом вашей ОС: Mac Windows Linux/

Я работаю на Маке, поэтому загружал маковскую версию Docker Toolbox и запускал файл установки. После завершения установки я запустил Docker Quickstart Terminal, который запустил образ Virtual Box и предоставил командную оболочку. Для пользователей Windows установка будет почти такой же, но для уверенности смотрите инструкции.

Dockerhub: репозиторий образов

Перед использованием докера уделите внимание DockerHub — официальному репозиторию образов. Тут вы найдете тысячи образов, как официальных, так и созданных независимыми разработчиками. Вы найдете образы ОС : CentOS, Ubuntu, и Fedora и образы приложений java, Tomcat, Jetty и пр. Вы также найдете почти все популярные приложения, включая MySQL, MongoDB, Neo4j, Redis, Couchbase, Cassandra, Memcached, Postgres, Nginx, Node.js, WordPress, Joomla, PHP, Perl, Ruby, и др. Перед тем как создавать образ, убедитесь что его еще нет в DockerHub!

В качестве упражнения попробуйте запуск образа CentOS. Введите команду:

docker run -it centos

Команда docker — это главное средство общения с демоном докера. Директива run дает докеру указание скачать и запустить образ (при условии, что его еще нет). Директива pull является альтернативным средством скачать образ. Возможно использование двух аргументов: i запускает образ в интерактивном режиме, t запускает TTY оболочку. Помните, что неофициальные образы имеют названия username/image-name, в то же время официальные образы запускаются без имени пользователя. Именно поэтому надо указать просто «centos» для запуска образа. Вы можете указать версию образа :version-number, например centos:7. Для каждого образа задана версия latest, используемая по умолчанию. Для CentOS на данный момент это 7.

После выполнения $ docker run -it centos вы должны увидеть скачивание образа, которое завершится примерно так:

$ docker run -it centos
[root@dcd69de89aad /]#

Мы запустили контейнер в интерактивном режиме, поэтому получили shell для root-a. Для выхода из сеанса наберите exit.

Вы можете просмотреть список список скачанных образов:

$ docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
java                        8                   5282faca75e8        4 weeks ago         817.6 MB
tomcat                      latest              71093fb71661        8 weeks ago         347.7 MB
centos                      latest              7322fbe74aa5        11 weeks ago        172.2 MB

Как вы видите, используется 8-я версия Tomcat.

Запускаем Tomcat в Docker

Команда запуска немного сложнее команды для CentOS:

$ docker run -d -p 8080:8080 tomcat

параметр -d указывает, что Tomcat запущен как демон. Мы выставляем порт 8080 контейнера как порт 8080 хост машины (на которой в случае Mac запущена виртуальная машина Virtual Box). Вывод команды должен быть примерно таким:

$ docker run -d -p 8080:8080 tomcat
bdbedc47836028b9d1fee3d4a96eee4d89838d7b6b0b4298d9e5a7d117292003

Длинная строка с шестнадцатеричными цифрами является ID контейнера, она еще пригодится. Список процессов можно вывести командой:

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
bdbedc478360        tomcat              "catalina.sh run"   3 seconds ago       Up 3 seconds        0.0.0.0:8080->8080/tcp   focused_morse

Как видим, команда вывел только 12 символов из длинного ID. Всю длинную строку печатать муторно, поэтому докер позволяет указать такое количество символов, которое достаточно для однозначной идентификации контейнера. Например, если вы можете ввести «bdb» и на данном этапе этого будет достаточно. Для того, чтоб понять, стартанул ли Томкат, нужно выполнить команду tail для файла catalina.out. В мире докер есть альтернатива — docker logs:

$ docker logs -f bdb
09-Sep-2015 02:15:21.611 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version:        Apache Tomcat/8.0.24
...
09-Sep-2015 02:15:25.137 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 3188 ms

параметр -f позволяет отслеживать, что происходит. Для выхода жмем Ctrl-C.

Тестируем и изучаем

Для тестирования Томката нужно узнать IP адрес вашей виртуальной машины. При запуске Docker Quickstart Terminal вы могли видеть такую строку:

docker is configured to use the default machine with IP 192.168.99.100

Как вариант, вы можете посмотреть значение переменной окружения DOCKER_HOST:

DOCKER_HOST=tcp://192.168.99.100:2376

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

http://192.168.99.100:8080

Вы увидите стартовую страницу Томката.

Перед остановкой контейнера вы можете изучить на нем работу команд:

docker stats CONTAINER ID показывает CPU, memory, and network I/O для каждого образа
docker inspect CONTAINER ID показывает конфигурацию образа
docker info показывает данные хоста Docker

Для остановки контейнера с Томкатом выполните:

$ docker stop bdb

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

$ docker ps -a
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS                       PORTS               NAMES
bdbedc478360        tomcat                  "catalina.sh run"        26 minutes ago      Exited (143) 5 seconds ago                       focused_morse

Продолжение: часть 2

You can leave a response, or trackback from your own site.

Leave a Reply