Docker & Docker Compose — Ръководство

Глава 1. Docker не е виртуална машина – това е съвсем различен начин на мислене

Автор: Федя Серафиев • Работно заглавие: Docker и Docker Compose – професионално ръководство от практиката

Въведение

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

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

След първия docker rm разбрах, че всичко е изчезнало. Тогава осъзнах най-важното правило:

Контейнерът никога не е мястото, където трябва да живее конфигурацията или информацията.

От този момент нататък започнах да използвам Docker по начина, по който е проектиран. Разликата е огромна. Днес почти всичките ми услуги работят в Docker. Не говоря за един-два контейнера — говоря за десетки услуги, които работят непрекъснато:

WordPress
MariaDB
Redis
Nextcloud
Paperless-ngx
Grafana
Prometheus
Uptime Kuma
Nginx Proxy Mgr
Cloudflare Tunnel
Portainer
Homepage
phpMyAdmin / Adminer
Watchtower

След време осъзнах още нещо: Docker не е просто технология — той променя начина, по който мислиш за сървърите.

Как изглежда традиционният подход

Преди Docker повечето Linux сървъри изглеждаха приблизително така:

Ubuntu Server
├── Apache
├── PHP
├── MariaDB
├── Redis
├── Postfix
├── phpMyAdmin
├── Fail2ban
├── WordPress
└── Nextcloud

Всичко работи директно върху операционната система. На пръв поглед няма проблем, докато не се появи следното:

  • WordPress изисква PHP 8.3.
  • Следващият сайт работи само с PHP 8.1.
  • Третият използва друга версия на MariaDB.
  • Четвъртият има собствен Nginx, а петият изисква различни библиотеки.

Започва истински хаос. Една актуализация спокойно може да повреди няколко работещи сайта.

Docker решава проблема по различен начин

Docker не се опитва да направи още една виртуална машина. Той изолира приложението. Вместо една голяма операционна система с десетки инсталирани услуги получаваме множество малки самостоятелни среди:

Docker Host
├── WordPress
├── MariaDB
├── Redis
├── Grafana
├── Prometheus
├── Nextcloud
├── Paperless
├── Portainer
├── NPM
└── Cloudflared

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

Най-голямото предимство

За мен най-голямото предимство не е скоростта или по-ниската консумация на памет. Истинското предимство е предсказуемостта.

Ако един контейнер работи днес, той ще работи по абсолютно същия начин и след шест месеца. Няма значение дали го стартирам на домашния си сървър, във виртуална машина, в облака или на друг физически компютър. Докато използвам същия образ (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 exec -it nginx bash
# Инсталиране на инструменти:
apt update && apt install nano htop -y

След това редактира конфигурации вътре. След няколко дни изпълнява:

docker compose pull
docker compose up -d

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

Контейнерът е временен. Данните трябва да бъдат извън него. Това е философията на Docker.

Една мисъл, която промени начина ми на работа

След години работа стигнах до едно златно правило:

"Ако се страхувам да изтрия контейнера, значи съм го направил неправилно."

Всеки контейнер трябва да може да бъде изтрит без никакво притеснение и след това да бъде създаден отново само с една команда:

docker compose up -d

Ако това не е възможно, значи конфигурацията ми не е достатъчно добра.


Първи стъпки в терминала

Отвори терминала си и изпълни тези 4 основни команди:

docker ps
docker images
docker volume ls
docker network ls

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


⏳ Очаквайте скоро:

Част 2: Архитектура на Docker

В следващата част ще разгледаме подробно как работи Docker Daemon, каква е ролята на Docker Client и как архитекурата осигурява пълна изолация на процесите.