Опубликован: 18.04.2021 | Доступ: свободный | Студентов: 875 / 418 | Длительность: 04:36:00
Лекция 4:

Виртуализация, основные понятия и инструменты

< Лекция 3 || Лекция 4 || Лекция 5 >

Основные понятия

Виртуализация - процесс эмулирующий некоторые ресурсы вычислительной системы с целью разделения и/или изоляции ресурсов.

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

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

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

Хост машина - вычислительная система на которой запущен гипервизор.

Гипервизор - программное обеспечение позволяющее одновременный запуск нескольких виртуальных машин и осуществляющая их мониторинг и управление. К примеру VMWare, Xen, Hyper-V, KVM.

Виртуальная машина - экземпляр гостевой вычислительной системы чьи аппаратные или программные ресурсы эмулируются гипервизором.

Гостевая операционная система - операционная система запущенная на виртуальной машине или в виртуальной среде и не знающая о наличии хост машины.

Облачный провайдер услуг виртуализации - компания предоставляющая услуги по виртуализации некоторых аппаратных ресурсов или отдельных систем/программного обеспечения. К примеру AWS, Microsoft Azure, GCP, Linode, Scaleway.

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

Общая структура в общем случае выглядит следующим образом, по парадигме IaaS у облачного провайдера берутся в аренду виртуальные сервера, на которых разворачивается программное обеспечение позволяющее выполнять программную (контейнерную) виртуализацию. Которая, в свою очередь используется для распространения клиентского программного обеспечения. Управление множеством контейнеров осуществляется при помощи программного обеспечения называемого оркестратором.

Основным программные обеспечением для выполнения контейнерной виртуализации является Docker, который, в свою очередь, подчиняется стандартам Open Container Initiative (OCI).

OCI - проект Linux Foundation, который призван стандартизировать способы виртуализации на уровне операционной системы, с фокусом на Linux контейнеры. В текущий момент имеется стандартизация о среде выполнения и формате образов контейнеров.

Docker работает на основе механизма ядра Linux называемого namespaces, которая позволяет изолировать ресурсы выделяемые процессу, тем самым давая возможность создавать виртуальные пространства со своими собственными ID процессов, имена хостов, ID пользователя, доступ к файловым системам и сетям. Вторым используемым механизмом в основе работы докера является функционал ядра Linux называемый cgroups или контрольные группы, который, в свою очередь, обеспечивает управление выделяемыми ресурсами виртуальных процессов.

Основные понятия Docker

docker-cli - клиент для работы из командной строки.

docker-engine - серверная часть, которая запускает и управляет контейнерами.

Dockerfile - файл описывающий docker образ.

Docker образ (image) - собранный шаблон, по которому может быть создан контейнер.

Docker контейнер - экземпляр виртуализируемого пространства, который создан из образа.

Docker registry (хранилище) - стандартизированное хранилище собранных Docker образов.

Docker volumes - механизм описывающий хранение данных при работе с Docker контейнерами.

Docker network (сеть) - механизм позволяющий управлять сетевыми ресурсами и объединять сетевые пространства контейнеров.

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

Пример работы с Docker

1. Сборка docker образа.

Для сборки Docker образа требуется только Dockerfile который описывает будущий образ.

К примеру есть файл со следующим содержанием:

FROM alpine:3.12.2
RUN echo 'Hello, World!' > example.txt
CMD ["cat", "example.txt"]

Директивы:

FROM - указывает из какого базового образа будет собран результирующий образ.

RUN - выполняет консольную команду

Данный Dockerfile описывает простейший образ, который будет содержать файл example.txt с текстом "Hello, World!" и выводить его при запуске контейнера.

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

docker build -t example:v0.0.1 .

В результате сборки получится образ с названием example:v0.0.1. Первая часть, перед двоеточием является названием образа, а вторая после - опциональным тегом.

Для просмотра локально хранящихся образов можно использовать команду docker images.

2. Запуск контейнера

Для запуска контейнера из предварительно собранного образа используется команда docker run в формате docker run имя_образа с возможными дополнительными опциями.

Запустим контейнер из образа собранного в предыдущем примере:

docker run --rm example:v0.0.1

После запуска мы должны получить в консоль строку "Hello, World!"

Флаг --rm указывает на то что контейнер будет удалён после выполнения. Данная опция полезна при отладке сборки.

3. Подключение к существующим контейнерам.

Для примера запустим контейнер с nginx:

docker run --name nginx -d -p 80:80 nginx

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

Флаг -p в свою очередь указывает на проброс портов контейнера к хост машине.

Флаг -d указывает что терминал консоли не будет подключен к контейнеру.

Для того чтобы подключиться к контейнеру nginx и провести любые действия внутри него следует выполнить следующую команду:

docker exec -it nginx имякоманды

Обычно, для разовых действий команда передается непосредственно за определением подключения, к примеру

docker exec -it nginx pwd

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

docker exec -it nginx bash

4. Для диагностики и исследования существующих контейнеров можно использовать подкоманду inspect, которая работает в следующем формате:

docker inspect имяконтейнера

В качестве вывода вы получите информацию в JSON формате с полным состоянием контейнера на момент выполнения команды

5. Пример работы с docker-compose

По умолчанию файл должен быть назван docker-compose.yml или docker-compose.yaml

version: "3.9"
services:
  web:
	image: "nginx"
  redis:
	image: "redis:alpine"

Файл состоит из двух главных обязательных блоков: version - которая указывает на версию интерпретатора файла docker-compose, и services - в котором описаны контейнеры которые будут запущены.

В данном случае это веб-сервер nginx и in-mem кэш сервер redis.

6. Настройка docker-engine производится путём редактирования файла daemon.json, который либо находится в панели управления настроек docker (в случае с windows и mac os), или в случае nix подобных операционных систем в папке /etc/docker/.

Как следует из названия файл представляет собой json файл с описанием желаемых подключенных конфигураций. К примеру, если вы заходите включить функционал находящийся в стадии тестирования, вы должны указать параметр experimental:

{
  "experimental": true
}

Выводы

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

< Лекция 3 || Лекция 4 || Лекция 5 >
Рустам Тагаев
Рустам Тагаев

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