Виртуальная машина (VM) vs контейнер

разница между виртуальной машиной и контейнером

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

 В одной из статей по докер мы пытались запустить Spring Boot Java приложение в докере. Теперь, я хочу немного рассказать о более низком уровне как можно проще.

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

Даже гугл, амазон и другие клауд провайдеры делают отдельные сервисы для поддержки контейнеров.

Я считаю что начинающим девелоперам желательно знать данные технологии и понимать в чем заключаются главные различия между ними.

Что такое контейнеры и виртуальные машины? 

Контейнеры и виртуальные машины используют для того, чтобы создать изолированное окружение для выполнения кода. Мы знаем что сервер — это просто компьютер с необходимым программным обеспечением. Это достаточно недешевое оборудование. По моему запросу “купить сервер” мне выдало наличие машин с ценовым диапазоном от 500 долларов. Сервер должен иметь постоянное питание и бесперебойный Интернет, для того, чтобы обслуживать входящие на него запросы. Контейнеры и виртуальные машины позволяют запустить сразу несколько операционных систем на одном физическом сервере, которые абсолютно не связаны друг с другом. Эти системы делят общие ресурсы, но они не пересекаются и работают как будто находятся на разных компьютерах. Таким образом за счет использования виртуальных машин или контейнеров можно сэкономить значительные средства на оборудовании.

Разница между контейнером и виртуальной машиной.

Виртуальная машина (VM)

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

Гипервизор — это программное обеспечение, которое работает напрямую с железом. Именно поверх гипервизора запускаются виртуальные машины. Гипервизор “берет” все ресурсы (оперативка, процессор, память) и делит их между виртуалками. Причем, сколько кому ресурсов нужно выделить решает уже человек, который настраивает VM.

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

Итак, что мы имеем в итоге по виртуалке? У нас есть компьютер. На компьютер установили операционную систему. Потом установили гипервизор. И уже поверх гипервизора установили виртуальные машины.

Как видите, за отдельные среды исполнения кода нужно платить дополнительными ресурсами. Как не крути, а гипервизор и VM тоже нуждаются в ресурсах компьютера, чтобы обеспечивать работу. Ладно еще если на виртуалках Вы потом запускаете большие энтерпрайз приложения, которые обеспечивают значительный объем работы. Сейчас пошел тренд на микросервисы. И поэтому большие приложения разбиваются на более мелкие для удобства и гибкости разработки.

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

Контейнер

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

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

Именно поэтому контейнеры легковесней виртуальных машин и занимают меньше места. 

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

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

Почему же докер стал таким популярным в наше время:

  • Докер легко использовать как девелоперам так и девопсам. Приложение завернутое в контейнер будет работать как локально так и на других машинах.
  • Докер контейнеры очень легковесны и быстры. Создание контейнеров происходит намного быстрее чем виртуальной среды. Так как контейнеру не нужно подымать операционную систему и проходить весь процесс инициализации, который проходит виртуальная машина.
  • С помощью контейнеров очень легко масштабировать приложения. Так как контейнеры легковесны — отдельные приложения можно положить в отдельную среду. Например база в одном контейнере, приложение в другом, а клиент в третьем. А дальше, с каждым контейнером можно работать уже индивидуально. Если базе нужно больше ресурсов — можно просто дать больше ресурсом только контейнеру с базой. Таким образом не затрагивая другие части приложения.

Это не все преимущества докера и контейнеров. Я перечислил только самые значимые и видимые.

Есть еще и докер хаб — такой себе сайт где есть самые востребованные готовые контейнеры с базами, инструментами и другими вещами которые нужны большинству программ.

Если есть преимущества — будут и недостатки.

Контейнерами нужно управлять. И чем их больше — тем сложнее с ними управиться. Именно поэтому инструменты вроде Kubernetes имеют еще большую популярность чем Docker. Еще выделяют проблему с безопасностью контейнеров. Здесь дело даже не столько в самих инструментах, а в том что при настройке множества сред, разработчики запросто могут упустить важный нюанс связаный с безопасностью. Ведь если раньше нужно было настроить несколько виртуальных машин, то теперь мы имеем дело с десятками контейнеров разного назначения.

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

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

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

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: