VM или Docker?

Как да разберете, че ви е нужен Docker, а не VM? Трябва да определите какво точно искате да изолирате. Ако се нуждаете от изолирана система с гарантирано разпределени ресурси и виртуално хардуерно устройство, тогава изборът трябва да падне на VM. Ако е необходимо да изолирате работещи приложения като отделни процеси на системата, ще ви е необходим Docker.

Какво точно е различието между Docker контейнери и VM?

Виртуална машина (VM) е виртуален компютър с всички виртуални устройства и виртуален твърд диск, на който се инсталира нова независима ОС заедно с виртуални драйвери на устройства, управление на паметта и други компоненти. Тоест, получаваме абстракция на физическото оборудване, което позволява стартирането на множество виртуални компютри на един и същ компютър.
Инсталираната VM може да заема различно място на диска на компютъра:

  • фиксирано място на твърдия диск, което позволява по-бърз достъп до виртуалния твърд диск и избягване на фрагментация на файла;
  • динамично разпределение на паметта. При инсталиране на допълнителни приложения паметта ще се разпределя динамично за тях, докато не достигне максималния пределен обем, зададен ѝ.

Колкото повече на виртуални машини на сървъра, толкова повече място те заемат, а също така изискват постоянна поддержка на околната среда, необходима за работата на вашето приложение.

Docker е софтуер за създаване на приложения на базата на контейнери. Контейнерите и виртуални машини имат сходни предимства, но работят по различен начин. Контейнерите заемат по-малко място, тъй като повторно използват повече общи ресурси на хост системата в сравнение с VM, тъй като в отличие от VM, осигурява виртуализация на ниво ОС, а не на хардуерно ниво. Този подход осигурява по-малък обем на заетата памет, бързо разгръщане и по-лесно мащабиране.

Контейнерът предоставя по-ефективен механизъм за инкапсулация на приложения, осигурявайки необходимите интерфейси на хост-системата. Тази способност позволява на контейнерите да разделят ядрото на системата, където всеки контейнер работи като отделен процес на основната ОС, притежаваща свой собствен набор от области на паметта (собствено виртуално адресно пространство). Тъй като виртуалното адресно пространство на всеки контейнер е самостоятелно, данните, принадлежащи на различни области на паметта, не могат да бъдат променяни.
Нативната ОС за Docker е Linux (Docker може да се използва и на Windows, и на MacOS), като използва основните му предимства, които му позволяват да организира разделение на ядрото. Стартирането на Docker-контейнери на Windows ще се осъществи в рамките на виртуална машина с ОС Linux, тъй като контейнерите споделят ОС хост-системата и основната им ОС е Linux.

Контейнер — как работи това?

Контейнерът — е абстракция на ниво приложение, обединяваща кода и зависимостите. Контейнерите винаги се създават от образи, добавяйки достъпен за запис горен слой и инициализирайки различни параметри. Понеже контейнерът има собствен слой за запис и всички промени се запазват в този слой, няколко контейнера могат да споделят достъп до един и същ основен образ.

Всеки контейнер може да се конфигурира чрез файл в проекта docker-compose, включен в основното решение — docker-compose.yml. Там могат да се зададат различни параметри като име на контейнера, портове, идентификатори, лимити на ресурсите, зависимости между другите контейнери. Ако в настройките не бъде зададено име на контейнера, Docker всеки път ще създава нов контейнер, присвоявайки му име на случаен принцип.

Когато контейнерът се стартира от образ, Docker монтира файловата система за четене и запис върху всички слоеве под нея. Именно тук ще се изпълняват всички процеси, които искаме нашият Docker контейнер да изпълнява.

Когато Docker за първи път стартира контейнер, начален слой за четене и запис е празен. Когато настъпят промени, те се прилагат към този слой; например, ако искате да промените файл, този файл ще бъде копиран от слоя само за четене по-долу в слоя за четене и запис.
Версия на файла, достъпна само за четене, все още ще съществува, но сега е скрита под копие. За съхранение на данни, независимо от жизнения цикъл на контейнера, се използват томове. Томовете се инициализират при създаване на контейнера.

Как изображеният файл е свързан с контейнера?

Образ — основен елемент за всеки контейнер. Образът се създава от Dockerfile, добавен към проекта и представлява набор от файлови системи (слоеве), натрупани един върху друг и обединени, достъпни само за четене; максималният брой слоеве е 127.

В основата на всеки образ стои базов образ, който се указва с командата FROM — входна точка при формирането на образа в Dockerfile. Всеки слой е readonly-слой и е представен с една команда, модифицираща файловата система, описана в Dockerfile.
За комбинирането на тези слоеве в един образ Docker използва Advanced multi layered Union file system (AuFS, изградена на базата на UnionFS), позволявайки различни файлове и директории от различни файлови слоеве да се наслагват прозрачно, създавайки свързана файловата система.

Слоевете съдържат метаданни, позволяващи запазване на свързана информация за всеки слой по време на изпълнение и изграждане. Всеки слой съдържа линк към следващия слой; ако слой няма линк, значи е най-горният слой в образа.

Dockerfile може да съдържа следните команди:

  • FROM — входна точка при формирането на образа;
  • MAINTAINER — име на собственика на образа;
  • RUN — извършва команда по време на изграждането на образа;
  • ADD — копира файл от хоста в новия образ; ако се укаже URL на файл, Docker ще го изтегли в зададената директория;
  • ENV — променливи на средата;
  • CMD — стартира създаването на нов контейнер на базата на образа;
  • ENTRYPOINT — команда, която се изпълнява при стартиране на контейнера.
  • WORKDIR — работна директория за изпълнение на командата CMD.
  • USER — задава UID за контейнера, създаден на базата на образа.
  • VOLUME — монтира директория от хоста в контейнера.
  • EXPOSE — набор от портове, които се слушат в контейнера.

Как работи UnionFS?

UnionFS — служебна стекова файлова система (ФС) за Linux и FreeBSD. Тази ФС реализира механизъм за копиране при запис (Copy-On-Write, COW). Работната единица на UnionFS е слой, като всеки слой трябва да се счита за отделна пълноценна файлова система с иерархия от директории от самия корен. UnionFS създава обединено монтиране за други файлови системи и позволява прозрачно за потребителя да обединява файлове и директории от различни файлови системи (наречени клонове) в една свързана файлова система.

Съдържанието на каталози с еднакви пътища ще се визуализира заедно в един обединен каталог (в едно пространство на имената) на получената файлова система.

UnionFS обединява слоеве, ръководейки се от следните принципи:

  • един от слоевете става слой с най-висок приоритет, вторият и последващите – слоеве с по-нисък приоритет;
  • потребителят получава достъп до обектите на слоевете "отгоре надолу", т.е. ако исканият обект се намира в "горния" слой, той се връща, независимо от наличието на обект с такова име в "долния" слой; в противен случай се връща обектът от "долния" слой; ако искан обект не съществува нито там, нито там, се връща грешка "Няма такъв файл или каталог";
  • работният слой е "горният", т.е. всички действия на потребителя по изменяне на данни се отразяват само на слоя с най-висок приоритет, без да влияят на съдържанието на слоевете с по-нисък приоритет.

Docker е най-разпространената технология за използване на контейнери в работата на приложението. Той се е утвърдил като стандарт в тази област, базирайки се на cgroups и пространства на имената, които осигурява ядрото на Linux.

Docker ни позволява бързо да разгръщаме приложения и да оптимизираме максимално използването на файлова система чрез разделяне на ядрото на ОС между всички контейнери, работейки като отделни процеси на ОС.

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster