Как да създадете и управлявате проекти с Docker Compose

Как да създадете и управлявате проекти с Docker Compose

Създайте стабилен и лесен за управление контейнерен стек за минути – без главоболие и без объркване!


🔍 Въведение

Docker Compose е мощен инструмент, който ви позволява да дефинирате и управлявате мултиконтейнерни приложения. Ако искате да стартирате уеб сървър, база данни и кеш система едновременно — Compose ще ви спести време и усилия.

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


🧠 Какво е Docker Compose?

Docker Compose ви позволява да:

  • Дефинирате всички услуги (контейнери) на вашия проект в един YAML файл
  • Стартирате всичко с една команда: docker-compose up
  • Изолирате и управлявате проекта лесно

📂 Пример:

services:
  web:
    image: nginx
  db:
    image: postgres

С този кратък код стартирате NGINX + PostgreSQL без да пишете дълги команди за всеки контейнер


⚙️ Предварителни условия

За да следвате това ръководство, трябва да имате:

  • Инсталиран Docker
  • Инсталиран Docker Compose (отделно или вграден в Docker Desktop)
  • Основни познания по команден ред

📁 Как изглежда структурата на един Docker Compose проект?

myproject/
│
├── docker-compose.yml  ← Тук описвате всичко
├── .env                ← (По избор) Променливи на средата
└── app/                ← Вашият код

docker-compose.yml е сърцето на проекта. В него описвате кои контейнери ще участват, как комуникират помежду си, какви мрежи и томове използват и как се стартират.

Анатомия на docker-compose.yml файла 📋

Docker-Compose файлът е като рецепта за готвене. Всяка "съставка" (услуга) има своите инструкции.

Основна структура

version: '3.8'

services:
  web:
    image: php:8.2-apache
    ports:
      - "8080:80"
    volumes:
      - ./app:/var/www/html
    depends_on:
      - db

  db:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: myapp
      MYSQL_USER: user
      MYSQL_PASSWORD: userpass

🧾 Обяснение на docker-compose.yml:

Fedyaversion: '3.8'

🔹 Определя версията на Docker Compose спецификацията.
3.8 е стабилна и често използвана версия, съвместима с повечето Docker версии. Въпреки, че вече версията не се пише.


Fedyaservices:

🔹 Тук започва списъкът с услуги (контейнери), които ще бъдат дефинирани. В този случай имаме две:

  1. web – PHP + Apache
  2. db – MySQL

🔧 Услуга: web

Fedya  web:
image: php:8.2-apache

🔹 web е името на услугата. Можете да го промените по желание (например frontend).

🔹 image: php:8.2-apache казва на Docker да използва официалния PHP образ, който включва Apache. Това е удобен начин да имате едновременно уеб сървър и интерпретатор за PHP.


Fedya    ports:
- "8080:80"

🔹 Пренасочва порт 8080 на хоста към порт 80 в контейнера (Apache слуша на порт 80).
Пример: ако отворите http://localhost:8080 в браузъра, ще видите вашия уебсайт.


Fedya    volumes:
- ./app:/var/www/html

🔹 Свързва локалната директория ./app с директорията /var/www/html в контейнера.

📌 Това означава, че всичко, което сложите в папка app до docker-compose.yml, ще бъде достъпно в уеб сървъра. Това е удобно за разработка – промените се отразяват веднага.


Fedya    depends_on:
- db

🔹 depends_on указва, че web трябва да изчака да се стартира услугата db (MySQL), преди да тръгне.

⚠️ Важно: Това не гарантира, че MySQL е готов за връзки – за това се ползват скриптове за „health check“ при нужда.


🗃️ Услуга: db (MySQL)

Fedya  db:
image: mysql:8.0

🔹 Използва официалния образ на MySQL 8.0.


Fedya    restart: always

🔹 Ако контейнерът падне или Docker се рестартира, той ще стартира отново автоматично.

    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: myapp
      MYSQL_USER: user
      MYSQL_PASSWORD: userpass

Това са променливи на средата, които конфигурират базата данни:

  • MYSQL_ROOT_PASSWORD: парола за root потребителя на MySQL
  • MYSQL_DATABASE: автоматично създаване на база с това име
  • MYSQL_USER и MYSQL_PASSWORD: създава се потребител с тези данни и достъп до тази база

📌 На практика: ще имате база myapp и потребител user:userpass, който може да се свързва към нея.

Стартиране на Compose проекта

Стартирайте проекта с:

Fedyadocker-compose up -d

🟢 Това ще:

  • Изтегли нужните образи (ако не са налични)
  • Създаде контейнерите
  • Свърже ги автоматично
  • Пренасочи порт 8080 към PHP сървъра

📌 Отворете браузъра си:
http://localhost:8080 → ще видите phpinfo() страницата.

📦 Управление на услугите

КомандаДействие
docker-compose up -dСтартира в background
docker-compose downСпира и премахва всичко
docker-compose logs -fВиж логовете на всички контейнери
docker-compose exec web bashВлиза в "web" контейнера с bash
docker-compose psПоказва текущите услуги

🔁 Автоматично презареждане при промени

С Docker Compose лесно тествате промени по кода. Просто редактирайте файловете в app/ – те са монтирани в контейнера чрез volumes.

📦 Ако промените docker-compose.yml, рестартирайте със:

Fedyadocker-compose down
docker-compose up -d

🛠️ Използване на .env файл

Можете да държите чувствителни данни и конфигурации в .env файл:

MYSQL_ROOT_PASSWORD=rootpass
MYSQL_DATABASE=myapp
MYSQL_USER=user
MYSQL_PASSWORD=userpass

И в docker-compose.yml:

environment:
  MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
  ...

📌 Предимство: Лесна промяна без докосване на основния YAML файл

🧪 Пример: Стек с NGINX + Node.js + MongoDB

Ето как може да изглежда по-сложен проект:

version: '3.8'

services:
  frontend:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - backend

  backend:
    build: ./backend
    ports:
      - "3000:3000"
    depends_on:
      - mongo

  mongo:
    image: mongo:6
    volumes:
      - mongo-data:/data/db

volumes:
  mongo-data:

📦 Всеки слой комуникира с другия, без да излизат извън стека.


🧹 Почистване на ресурси

Когато приключите с тестването:

docker-compose down --volumes --remove-orphans


📌 Това ще премахне:

Контейнерите

Мрежите

Томовете (ако ги посочите)

📈 Сравнение: Docker CLI срещу Docker Compose
Действие Docker CLI командa Docker Compose
Стартиране на MySQL docker run … (дълга команда) docker-compose up
Свързване между контейнери Създаване на мрежа, link, IP Автоматично
Управление на томове Ръчно конфигуриране YAML структура
Добавяне на услуга Нов docker run и настройки Добавяне в services:

🧠 Извод: Compose прави сложните неща прости.

💡 Практически съвети
✅ Използвайте depends_on, за да управлявате стартирането по ред

✅ Монтирайте код с volumes, за да не билдвате всеки път

✅ Използвайте именувани мрежи и томове, за да запазите състоянието при рестартиране

✅ Винаги добавяйте .env файл, когато имате чувствителни настройки

🔐 Как да добавите потребителска защита?
Може да използвате NGINX или Traefik като reverse proxy с HTTP Basic Auth или SSL. Това излиза извън обхвата на тази статия, но Docker Compose лесно се комбинира с такива инструменти.

🧰 Инструменти, които работят с Compose
Portainer – уеб интерфейс за управление на стекове

Watchtower – автоматични обновления на контейнери

Docker Secrets – сигурно управление на пароли

VSCode + Remote Containers – разработка директно в контейнера

✅ Обобщение
🔎 Какво научихте 💡 Какво получихте
Как се пише docker-compose.yml Стъпка по стъпка инструкции и примери
Как се стартира стек С една команда docker-compose up -d
Как се управлява проект Лесно чрез CLI команди
Какво съдържа един проект Обяснение + практическа структура
Какво прави Compose по-добър Автоматизация, простота и мащабируемост

🧭 Следващи стъпки
Приложете примерите от статията на свой локален проект

Разширете стека си с Redis, Traefik или Elasticsearch

Споделете тази статия с колега – ще ви е благодарен! 🙌

📎 Полезни връзки
Официална документация

Docker Hub – Хранилище на образи

Play with Docker (онлайн среда)

🚀 Не забравяйте: С docker-compose изграждате мащабируеми, модулни и устойчиви проекти – само с един YAML файл!

Заключение 🎉

Docker-Compose е незаменим инструмент за всеки разработчик. Той превръща сложната оркестрация на контейнери в проста задача с един файл и няколко команди.

Ключови ползи:

  • Времеспестяване – настройка на сложни среди за минути
  • Консистентност – еднаква среда за всички разработчици
  • Гъвкавост – лесно добавяне и премахване на услуги
  • Професионализъм – индустриален стандарт за разработка

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

Запомнете: добрият код е като добрата рецепта – ясен, лесен за следване и с отлични резултати всеки път! 👨‍💻✨

Следващи стъпки:

  1. Създайте свой първи compose файл
  2. Експериментирайте с различни услуги
  3. Изучете Docker Swarm за production deployment
  4. Разгледайте Kubernetes за мащабни приложения

Успех с вашите Docker-Compose проекти! 🚀

Ако статията ви е била полезна – споделете я! 📤
Вашият следващ проект ще ви благодари! ❤️

Федя Серафиев

Федя Серафиев

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

Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу: