Глава 1. Docker не е виртуална машина – това е съвсем различен начин на мислене
Автор: Федя Серафиев • Работно заглавие: Docker и Docker Compose – професионално ръководство от практиката
Въведение
Когато за пръв път започнах да работя с Docker, направих същата грешка, която правят почти всички — опитвах се да го възприемам като виртуална машина.
Инсталирах контейнер, влизах вътре с bash, променях файлове, инсталирах пакети, редактирах конфигурации и след няколко дни вече не знаех какво точно съм променил.
След първия docker rm разбрах, че всичко е изчезнало. Тогава осъзнах най-важното правило:
Контейнерът никога не е мястото, където трябва да живее конфигурацията или информацията.
От този момент нататък започнах да използвам Docker по начина, по който е проектиран. Разликата е огромна. Днес почти всичките ми услуги работят в Docker. Не говоря за един-два контейнера — говоря за десетки услуги, които работят непрекъснато:
След време осъзнах още нещо: Docker не е просто технология — той променя начина, по който мислиш за сървърите.
Как изглежда традиционният подход
Преди Docker повечето Linux сървъри изглеждаха приблизително така:
Всичко работи директно върху операционната система. На пръв поглед няма проблем, докато не се появи следното:
- WordPress изисква PHP 8.3.
- Следващият сайт работи само с PHP 8.1.
- Третият използва друга версия на MariaDB.
- Четвъртият има собствен Nginx, а петият изисква различни библиотеки.
Започва истински хаос. Една актуализация спокойно може да повреди няколко работещи сайта.
Docker решава проблема по различен начин
Docker не се опитва да направи още една виртуална машина. Той изолира приложението. Вместо една голяма операционна система с десетки инсталирани услуги получаваме множество малки самостоятелни среди:
Всеки контейнер има собствена файлова система, собствени библиотеки, процеси, конфигурация и дори собствена мрежа. Няма значение какво използва съседният контейнер.
Най-голямото предимство
За мен най-голямото предимство не е скоростта или по-ниската консумация на памет. Истинското предимство е предсказуемостта.
Ако един контейнер работи днес, той ще работи по абсолютно същия начин и след шест месеца. Няма значение дали го стартирам на домашния си сървър, във виртуална машина, в облака или на друг физически компютър. Докато използвам същия образ (Image), резултатът ще бъде един и същ. Това е огромна разлика спрямо класическата инсталация.
Docker не е заместител на Linux
Това е едно от най-разпространените погрешни схващания. Docker не заменя Linux — Docker използва Linux.
Контейнерите споделят ядрото (Kernel) на хост машината. Затова един Linux контейнер не стартира собствен Kernel, не зарежда BIOS, не емулира хардуер и не стартира цяла операционна система. Всичко това вече съществува на хоста.
Контейнерът използва Kernel-а на хост машината. Това означава, че ако изтрия 30 контейнера, Linux дори няма да разбере, че преди секунди са съществували. За ядрото те са просто още няколко процеса. Именно това прави Docker толкова светкавичен и лек.
Контейнерът не е виртуална машина
Тази разлика трябва да бъде абсолютно ясна:
| Характеристика | Виртуална машина | Docker Container |
|---|---|---|
| Ядро (Kernel) | Собствен Kernel | Използва Kernel на Host |
| Операционна система | Пълна ОС | Само приложението |
| Време за старт | Стартира за минути | Стартира за секунди |
| Дисков размер | Голям размер (GB) | Малък размер (MB) |
| Памет (RAM) | Повече RAM | Значително по-малко RAM |
| Архитектура | Хардуерна виртуализация | Изолация на процесите |
Именно поради тази причина на един сървър спокойно могат да работят десетки контейнери, без това да означава десетки виртуални машини.
💡 Важно правило: Ако започнеш да влизаш вътре и да инсталираш пакети на ръка, значи използваш Docker като виртуална машина. Работи... докато не дойде първиятdocker compose up -dи не пресъздаде контейнера от нулата.
Най-честата грешка на начинаещите
Почти всеки нов потребител прави едно и също:
След това редактира конфигурации вътре. След няколко дни изпълнява:
И изведнъж всичко изчезва. Не защото Docker е счупен, а защото контейнерът никога не е бил предназначен да бъде постоянно място за съхранение на информация.
Контейнерът е временен. Данните трябва да бъдат извън него. Това е философията на Docker.
Една мисъл, която промени начина ми на работа
След години работа стигнах до едно златно правило:
"Ако се страхувам да изтрия контейнера, значи съм го направил неправилно."
Всеки контейнер трябва да може да бъде изтрит без никакво притеснение и след това да бъде създаден отново само с една команда:
Ако това не е възможно, значи конфигурацията ми не е достатъчно добра.
Първи стъпки в терминала
Отвори терминала си и изпълни тези 4 основни команди:
Изпълни ги. Не се опитвай да ги запомняш наизуст. Гледай какво връщат – това са четирите стълба на Docker, които ще разглобим в следващите глави.
⏳ Очаквайте скоро:
В следващата част ще разгледаме подробно как работи Docker Daemon, каква е ролята на Docker Client и как архитекурата осигурява пълна изолация на процесите.