Виртуализация, контейнеры

Классическим подохом к решению задачи разделения ресурсов на 1 вычислительном узле является виртуализация. Т.е. мы устанавливаем на основной, железный, компьютер систему управления виртуальными машинами, а конкретное ПО ставим уже внутрь отдельных виртуальных машин.

Плюсы виртуальных машин:

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

Отрицательные стороны виртуальных машин:

  • Процедура виртуализации требует дополнительных вычислительных ресурсов. Т.е. ваше приложение в виртуальной машине будет рабоать немного медленее, чем в основной ОС.
  • Часть физических ресурсов трудно перераспределять между виртуальными машинами.
    • Оперативная память - виртуальная машина СРАЗУ занимает ВЕСЬ выделенный объём оперативной памяти. Можно сказать, что виртуальные машины форсируют внутреннюю фрагментацию оперативной памяти: вы не можете передать неиспользуемую память между виртуальными машинами.
    • Дисковое пространство - виртуальная машина занимает чуть больше места, чем максимально использованное когда-либо.
    • Процессор - виртуальная машина может использовать МЕНЬШЕ максимально выделенного ей процессорного времени. Т.е. тут мы можем добиться приемлемого уровня плоности использования между виртуальными машинами.

Ключевая задача при использовании виртуализации - повышение плотности использования ресурсов. Т.е. чтобы ресурсы использовались максимально эффективно и не простаивали.

Предположим, что нам необходимо и достаточно запускать ТОЛЬКО приложения, которые написаны под 1 конкретную операционную систему. В этом случае мы можем создать псевдо виртуальные окружения, которые будут использовать общее ядро ОС, но все остальные ресурсы у них будут разделены.

Движение по созданию легковестных окружений на базе 1 ядра ОС началось в середине 2000х годоКлючевая задача при использовании виртуализации - повышение плотности использования ресурсов. Т.е. чтобы ресурсы использовались максимально эффективно и не простаивали.

Предположим, что нам необходимо и достаточно запускать ТОЛЬКО приложения, которые написаны под 1 конкретную операционную систему. В этом случае мы можем создать псевдо виртуальные окружения, которые будут использовать общее ядро ОС, но все остальные ресурсы у них будут разделены.

Движение по созданию легковестных окружений на базе 1 ядра ОС началось в середине 2000х годов. В ядре Linux была разработана концепция пространств имён, namespaces. В рамках данной концепции для каждого физического ресурса можно создать своё собтственное пространство имён, в котором уже запускать процессы. В этом случае процесс

  • Сможет работать с ресурсами, которые входят в данное пространство имён.
  • Не сможет работать с другими ресурсами.
  • Процесс работает напрямую с ядром ОС.

Для поддержания изоляции процессов друг от друга и определения им рамок по использованию ресрусов в ядре Linux реализован механизм control groups, cgroups.

Это низкоуровневые решения, которые применяются для создания уже более сложных инструментов, включая:

  • Linux Containers, LXC.
  • Docker.

Отличие между этими системами:

  • Время жизни контейнера: LXC-контейнер живёт долго, Docker-контейнер жив пока работает приложение, запущенное в нём, т.е. он может в любой момент времени умереть.
  • Файловая система контейнера: LXC-контейнер сохраняет свои данные при выключении, Docker-контейнер уничтожает все изменения внутри файловой системы.

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

Технические подскасты на русском языке

  • DevZen
  • Разбор Полётов
  • Иногда Radio-T
  • Подлодка
  • Как делают игры
  • И много-много других.

Попытка рассказать что такое Docker

На удивление у Docker хорошая документация на docs.docker.com.

  • Установка Docker на Debian: https://docs.docker.com/install/linux/docker-ce/ubuntu *

Проверка работоспособности

Удостоверьтесь, что вы можете запускать Docker-контейнеры:

  • docker
  • docker run hello-world
  • docker run -it ubuntu /bin/bash

Для специальных людей

Вам необходимо обеспечить доступ к UNIX-сокету для взаимодействия с Docker-службой, которая запущена на вашем компьютере. Файл располагается по адресу: /var/run/docker.sock.

Смотрим его права:

ls -l /var/run/docker.sock

Видим, что пользователи группы docker моут взаимодействовать с данным файлом. Значит надо добавить текущего пользователя в группу docker:

sudo gpasswd -a user docker

Создание собственных контейнеров

w3m https://docs.docker.com/get-started/part2/

  1. Создайте приложение, которое можно поместить в контейнер.
  2. Продумайте процедуру развёртывания данного приложения. В частности обеспечьте информацию о ключевых зависимостях.
  3. Сформируйте Dockerfile, который будет помещать приложение и его зависимости в контейнер.
  4. Запустите команду docker build для создания контейнера из сформированного Dockerfile.

Задачи

  1. Повторите эксперимент по созданию контейнера с Python-приложением.
  2. Создайте контейнер с Ruby-приложением ruby-app.