Docker

Член од
26 јануари 2009
Мислења
8.659
Поени од реакции
11.148

Што е Docker?

Пред да се постави ова прашање, побитно е да се праша што означува терминот контејнеризација на апликации?

Контејнеризацијa е метод на виртуелизација на ниво на оперативен систем кој се користи за да се извршуваат и деплоираат апликации без употреба/подигнување на виртуелна машина.
Повеќе изолирани апликации или сервиси може да работат на еден хост и да имаат пристап до кернелот на еден ист оперативен систем.

Докер е платформа за девелопери и систем админи со цел да развиваат, деплоираат и рануваат апликации со помош на контејнери. Контејнерите не се баш нови и датираат некаде од 70 тите години на минатиот век, со воведувањето на chroot system call. Првите посериозни чекори кои што ја придвижуваат линукс контејнеризацијата напред е воведувањето на controll groups или cgroups во 2006 та. Тие овозможуваат процесите во оперативниот систем да бидат групирани и секоја група на процеси да си добие свој удел во меморија, CPU, disc I/O.
Подоцна и воведувањето на Kernel namespaces придонесува за определување на рут привилегии за одредена група на корисници над група на процеси внатре во контејнерот, но не и надвор од него.

Docker vs VM и дали Docker и виртуелните машини се во суштина иста ствар?

Иако контејнерите доста потсетуваат на виртуелни машини и практично ја имаат истата функција тоа се две сосема различни работи.

dockervsvm.jpg
Еден контејнер работи нативно на линукс и го дели кернелот на оперативниот систем со останатите контејнери. Додека виртуелната машина подигнува цел оперативен систем кој со помош на hypervisor (пример Virtualbox) комуницира со ресурсите на оперативниот систем на хостот.

Што е контејнер?

Контејнерите се само процеси кои што се активни во линукс оперативен систем, имаат ограничен пристап кои ресурси можат да ги користат и се активни се додека контејнерот е активен, кога контејнерот ќе биде сопрен или целосно отстранет истите процеси стануваат неактивни. Пример сме ранувале контејнер врз база на nginx image кој исто така се вика nginx, на команда docker top nginx ќе ни го даде контејнерот како процес со соодветен pid. Истово ова може да се провери и на хостот ако се излистаат сите активни процеси.

Што се случува кога ќе стартуваме/рануваме контејнер?

1. Ќе го побара image от локално во image кеш от, ако го најде ќе го изгради контејнерот над тој image.
2. Доколку не го најде ќе го побара на online image repository Docker Hub
3. Ако не сме специфицирале верзија на image от ќе ја симне најновата верзија и ќе ја сними во кешот
4. Врз база на тој image ќе креира нов layer кој го нарекуваме контејнер. За да се сфати овој дел ќе направам паралела со класи и објекти од ООП. Контејнерот е runtime инстанца на image от ко што објектот е инстанца од една класа.
5. И се доделува виртуелна ip адреса на приватна мрежа/bridge внатре во докер енџинот
6. Бриџот прави само forward на сообраќајот од одреден порт од firewall от на хост от (под дифолт е 80) до порт 80 на контејнерот
7. Дури потоа следи процесот на креирање на контеjнерот врз база на командите кои што се специфицирани во посебен фајл наречен Dockerfile

Кои се бенефитите на Докер контејнерите во однос на виртуелните машини?
  • Flexible: Even the most complex applications can be containerized.
  • Lightweight: Containers leverage and share the host kernel.
  • Interchangeable: You can deploy updates and upgrades on-the-fly.
  • Portable: You can build locally, deploy to the cloud, and run anywhere.
  • Scalable: You can increase and automatically distribute container replicas.
  • Stackable: You can stack services vertically and on-the-fly.
И едни од најголемите предности се брзината и ефикасноста, како и заштедата на ресурси во однос на виртуелните машини

Docker контејнерите се непроменливи и stateless. Така на пример ако ранувате контејнер, го килнете и го рестартирате повторно, тој контејнер нема да содржи било какви информации од моментот пред да биде рестартиран. Како последица на тоа тие промовираат конзистентност и предвидливост. За разлика од контејнерите, виртуелните машини имаат фајл системи во кои складираат податоци од различни сесии. Единствениот начин да се промени тоа кај контејнерот е да се смени image от од кој тој се инстанцира.
Доколку сакаме да зачуваме податоци додека траел ранот на еден контејнер, на пример податоци кои би можеле да се чуваат во база, тоа би можело да се постигне со volumes кои се лоцирани надвор од докер контејнерот и продолжуваат да живеат и понатаму после стопирањето па и отстранувањето на контејнерот.

Докер контејнерите се одлична инфраструктура и подлога за развивање на микросервис апликации. Јас ко девелопер веќе година дена сум у контакт со оваа технологија и го користам пред се да сетирам локална околина иако можностите во продукција заедно со Kubernetes му се уште поголеми. Па споделте ваши искуства...
 
Последно уредено:
Член од
26 јануари 2009
Мислења
8.659
Поени од реакции
11.148
Docker Compose && Dockerfile

Во повеќето случаи една апликација користи одреден вендор, дали се работи за кешинг сервис, дали се работи за сервер, дали се работи за база на податоци или верзија на програмски јазик (уште понатаму можеме да одиме и со креирање на микросервис апликации). Најчесто овие сервиси треба да комуницираат меѓу себе и се зависни меѓу себе. Тука на сцена стапува docker-compose.yaml фајлот со чија помош можеме со само една команда да стартуваме апликација која што се состои од повеќе контејнери. Workflow то е следново:

1. Со деталите околу билдањето на еден контејнер се занимава Dockerfile. Тие детали ги дефинираме во Dockerfile или посеопфатно ја дефинираме околината на нашиот сервис така што може да биде репродуциран било каде.
2. Дефинирањето на сервисите од кои се состои нашата апликација се врши во docker-compose.yaml фајлот на тој начин што тие може да се стартуваат заедно.
3. Само изврши ја командата docker-compose up и сите контејнери од твојата апликација започнуваат да работат.
 

smihajlo

Superposition, Relentless
Член од
11 август 2010
Мислења
3.174
Поени од реакции
3.742
Во скоро време почнав да чепкам по малку. Иако предностите се очигледни почетната комплексност може да биде напорна.
 
На врв Bottom