Как да разберете, че ви трябва 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. Всеки слой е слой само за четене и е представен от една команда, модифицираща файловата система, записана в 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
