Експертно управление на контейнери с Docker Compose: Пълно ръководство

  • Docker Compose рационализира управлението и оркестрираното внедряване на множество контейнери.
  • Позволява ви да дефинирате връзки, променливи и обеми между услуги в един YAML файл.
  • Улеснява репликацията на средата и ускорява непрекъснатата интеграция и отстраняване на грешки.

Докер Композиране

Светът на разработването и внедряването на приложения претърпя истинска революция през последните години с появата на контейнерите. Този напредък позволи на екипи от всякакъв мащаб да забравят за класическите „екологични проблеми“ и да постигнат по-голяма гъвкавост, мащабируемост и контрол върху своята инфраструктура. В този контекст два инструмента се открояват особено: Docker и, за координирано управление на множество контейнери, Докер Композиране. Днес ще се потопим дълбоко в управлението на контейнери с този инструмент, обхващайки не само основите, но и подробни съвети, реални случаи и най-добри практики за пълно овладяване на тази технология.

Ако някога сте се разочаровали, опитвайки се да синхронизирате версиите на софтуерните си инструменти между локалната среда за разработка и производствената среда, или ако сте губили часове в инсталиране на зависимости и отстраняване на несъвместимости, това, което следва, е от голям интерес за вас. Docker Compose напълно промени начина, по който се внедряват сложни услуги, което ви позволява да настройвате цели архитектури (уеб, API, бази данни, кешове и др.) с една единствена команда и гарантира, че те се държат еднакво тук, там и навсякъде. Нека разгледаме заедно, подробно, как да се възползваме от пълния му потенциал.

Какво е Docker Compose и защо е толкова важен?

Преди да се потопим в командите и конфигурациите, е добре да изясним ролята, която Docker Compose играе в екосистемата на контейнерите. Docker Compose е инструмент, който ни позволява да дефинираме, конфигурираме и оркестрираме набори от контейнери използвайки обикновен YAML файл (обикновено наричан докер-compose.yml). Причината за съществуването му се крие в необходимостта от управление на приложения, съставени от повече от една услуга – например уебсайт, база данни и система за кеширане, всяка в отделен контейнер, но работещи заедно.

С Compose, Можете да стартирате всички услуги на дадено приложение с една команда., дефинирайте техните взаимоотношения, променливи на средата, постоянни томове, споделени мрежи и много други. Освен това, той е незаменим както в среди за разработка (поради скоростта, с която създава репликируема среда), така и в процесите на непрекъсната интеграция и внедряване (CI/CD), както и в предпроизводствената и дори производствената фаза за малки и средномащабни проекти.

Основните предимства на Docker Compose за управление на контейнери

По-долу изброяваме някои от основни ползи Какво предлага Docker Compose за управление на контейнери:

  • Опростен дизайн и внедряванеПозволява ви да дефинирате инфраструктурата като код, което прави репликацията и внедряването автоматични и възпроизводими.
  • Координация между службитеУправлява зависимостите, вътрешните мрежи и реда за стартиране на контейнерите, като гарантира, че услугите взаимодействат правилно от самото начало.
  • Изолирани и последователни средиВсички членове на екипа – и дори различни машини или среди – работят при едни и същи технически условия, което минимизира митичното „при мен работи“.
  • Проста мащабируемостМожете да увеличите или намалите броя на репликите за всяка услуга с една инструкция, което улеснява тестването на натоварването или по-стабилните внедрявания.
  • Лесна интеграция в CI/CDВписва се идеално в непрекъснати интеграционни процеси за изграждане, тестване и автоматично внедряване на среди.
  • Управлявайте целия жизнен цикълКонтролирането на стартирането, изключването, рестартирането, регистрирането, актуализирането и изтриването на всички контейнери в стека е толкова лесно, колкото изпълнението на команди Compose.

Ограничения и предизвикателства при използването на Docker Compose

Както всяка технология, Docker Compose също представя някои предизвикателства и съображения:

  • Първоначална крива на обучениеТрябва да сте запознати със синтаксиса на YAML, специфичните за Compose команди и концепциите за мрежи, томове и зависимости.
  • Ненужна сложност в прости проектиЗа приложения с една услуга или много прости приложения, Docker Compose може да е прекалено сложна система.
  • Необходими са разширени настройкиДефинирането на персонализирани мрежи, състояние на услугите или стратегии за рестартиране може да изисква известен опит, за да се опрости поддръжката.
  • Ограничен мащаб в големи инфраструктуриЗа много големи внедрявания се препоръчва използването на оркестратори като Kubernetes, въпреки че Compose все още е перфектен за много ситуации.

Подготовка на средата: Инсталиране на Docker и Docker Compose

Преди да започнете да дефинирате услуги, Задължително е да имате инсталирани Docker и Docker Compose. на вашата машина. В настоящите системи, Docker Desktop за Windows и Mac вече включва Compose веднага щом е готов за употреба. В Linux среди можете лесно да го инсталирате, като използвате мениджъра на пакети (следният пример е за системи, базирани на Debian/Ubuntu):

  • За Докер:
    sudo apt install docker-ce (Ubuntu/Debian) или sudo dnf install docker-ce (Fedora/CentOS)
  • За Docker Compose:
    sudo apt install docker-compose

В много случаи е достатъчно да добавите потребителя си към групата на docker с sudo usermod -aG докер $(whoami) за да може да се изпълняват команди без „sudo“. Не забравяйте да рестартирате сесията си, за да влязат в сила промените.

Файлът docker-compose.yml: структура и първични ключове

Сърцето на Docker Compose е файлът докер-compose.yml. Основната му структура е много интуитивна, но позволява огромна гъвкавост:

  • версия: Показва версията на синтаксиса на Compose. Обикновено се поставя като първи елемент.
  • услуги: Това изброява всички услуги (контейнери), които ще съставят приложението, всяка със своята специфична конфигурация (образ, компилация, портове, томове, променливи на средата, команди, зависимости и др.).
  • обемиДефинира постоянни томове, които могат да бъдат споделяни или свързани с конкретни услуги, като гарантира, че данните ще оцеляват след рестартиране или изтриване на контейнери.
  • мрежи: Позволява ви да дефинирате персонализирани мрежи за изолиране и свързване на услуги.

Минимален пример за структура:

версия: "3.8" услуги: уеб: изображение: nginx:последни портове: - "8080:80" база данни: изображение: postgres:13 среда: - POSTGRES_PASSWORD=примерни томове: - pgdata:/var/lib/postgresql/data томове: pgdata:

Практическо ръководство: Разгръщане на многоконтейнерно приложение

За да илюстрираме използването на Docker Compose, нека разгледаме казуси за внедряване, базирани на обсъжданите примери:

Пример 1: Уеб в Python + Redis за броене

Да предположим, че искате да стартирате прост уебсайт на Python Flask, който показва брояча на посещенията, използвайки Redis като място за съхранение в паметта. Не е необходимо да инсталирате локално нито Python, нито Redis – просто дефинирайте как трябва да бъдат интегрирани, използвайки Compose. Можете да научите как да създавате персонализирани изображения за вашите услуги на създаване на персонализирани Dockerfile изображения.

  • app.pyУеб код на Flask.
  • изисквания.txtСписък на зависимостите (например, flask и redis-py).
  • Докер файл: Показва как да се изгради персонализирано изображение за уеб услугата.
  • докер-compose.yml: Дефинира както уеб услугата, така и Redis, техните портове, томове и променливи.

Това е пример от файла докер-compose.yml за този случай:

версия: '3.8' услуги: уеб: компилация: . портове: - "8000:5000" томове: - .:/code среда: - FLASK_DEBUG=1 зависи_от: - redis redis: изображение: redis:alpine

Предимства на този подход? Можете да променяте кода на вашата машина и да виждате промените автоматично отразени на сървъра благодарение на монтирания том, без да се налага да пресъздавате образа всеки път (идеално за бърза разработка).

Пример 2: LAMP среда (Apache, PHP, MySQL)

За тези, които разработват с класически технологии като PHP и MySQL, Compose също е ключов. Типичен конфигурационен файл може да изглежда така:

версия: "3.8" услуги: mysql: изображение: mysql:5.7 среда: - MYSQL_DATABASE=midb - MYSQL_ROOT_PASSWORD=secret - MYSQL_USER=потребител - MYSQL_PASSWORD=ключ томове: - ./data/mysql:/var/lib/mysql портове: - "3306:3306" php: изображение: php:7-apache томове: - ./html:/var/www/html портове: - "80:80" зависи_от: - mysql

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

Пример 3: Node.js приложение с PostgreSQL

Широко използван стек в съвременната разработка комбинира Node.js услуги с PostgreSQL бази данни. Compose ви позволява също да дефинирате постоянство на данните и необходимите променливи на средата:

версия: '3.8' услуги: приложение: изображение: node:14-alpine команда: sh -c "npm install && npm run dev" томове: - .:/app портове: - 3000:3000 среда: - NODE_ENV=разработка зависи_от: - db db: изображение: postgres:13 среда: - POSTGRES_USER=потребител - POSTGRES_PASSWORD=ключ - POSTGRES_DB=портове на приложението: - 5432:5432

След като всичко е конфигурирано, стартирайте докер-композиране нагоре и ще имате както API, така и базата данни, готови за взаимодействие.

Основни команди за композиране в Docker

За ежедневното управление на многоконтейнерни приложения, Docker Compose предлага много ясен и мощен набор от команди:

  • докер-композиране нагоре: Изгражда и стартира всички услуги, дефинирани в YAML. С параметъра -d стартира ги във фонов режим.
  • docker-съставяне надолуСпира и премахва всички контейнери, мрежи и томове, свързани със стека, като се вземат предвид постоянните данни, ако са дефинирани.
  • компилация на docker-compose: Създава персонализираните изображения, посочени във файла.
  • докер-композиране ps: Показва текущото състояние на контейнерите на стека.
  • лог файлове за композиране на Docker: Позволява ви да преглеждате лог файлове за всички услуги или за конкретна.
  • спиране/стартиране/рестартиране на docker-composeУправлявайте жизнения цикъл на контейнерите по детайлен начин.
  • docker-compose exec: Изпълнява команда във вече стартиран контейнер (например, отваряне на bash или изпълнение на миграции на база данни).

Разширени аспекти: мрежи, обеми, променливи и състояние на услугите

С разрастването на проекта ви, Compose ви позволява да настройвате фино настройките си:

Персонализирани мрежи

Можете да дефинирате различни мрежи и да изолирате чувствителни услуги (напр. бази данни), за да подобрите сигурността. Мрежите се дефинират, както следва:

мрежи: фронтенд: бекенд:

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

Постоянни томове

Те гарантират, че дори ако спрете или изтриете контейнери, важни данни (например бази данни или конфигурации) не се губят. Можете да ги дефинирате глобално или за всяка услуга поотделно.

Променливи на средата и .env файлове

За допълнителна гъвкавост и преносимост, променливите могат да бъдат декларирани в самия YAML или във файлове. .env намиращи се в същата директория. Това ви позволява да променяте критични настройки (напр. идентификационни данни), без да докосвате файла Compose.

Здравни проверки и контрол на зависимостите

Ключов проблем при оркестрирането на множество услуги е да се гарантира, че зависимите услуги (например вашето приложение) не се опитват да стартират, преди базовите услуги (като базата данни) да са готови. Compose предлага опцията зависи_от и в по-новите версии могат да се задават здравословни условия:

услуги: уеб: зависи_на: база данни: състояние: service_healthy база данни: изображение: postgres:13 проверка на състоянието: тест: интервал: 10s време на изчакване: 5s повторни опити: 5

По този начин вашият бекенд няма да стартира, докато базата данни не потвърди, че е стартиран и работи. Това е основна функция в автоматизираните тръбопроводи и внедрявания, за да се избегнат първоначални грешки при свързване.

Docker Compose в непрекъсната интеграция и внедряване (CI/CD)

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

  • Тествайте пълните приложения при всяка заявка за изтегляне без необходимост от ръчно конфигуриране на среди.
  • Разгръщане на ефимерни среди за тестване или демонстрации, като лесно се изхвърлят след употреба.
  • Автоматизирайте производството в малки и средни проекти, където не е възможно да се инсталира Kubernetes.

Други интегрируеми и алтернативни инструменти: Podman, Visual Studio, Azure и други

В допълнение към Docker Compose, контейнерната среда предлага и други подходящи помощни програми и интеграции:

  • Podman и podman-dockerВ системи като SLE Micro или по-ориентирани към сигурността дистрибуции, Podman предлага алтернатива на Docker без демони. Инструментът podman-docker позволява ви да изпълнявате Docker скриптове без промени, като автоматично ги замествате.
  • Visual Studio и .NET.NET разработчиците могат да оркестрират уеб услуги и API, наред с кешове като Redis, от Visual Studio, като автоматично генерират Compose файлове и улесняват последователното отстраняване на грешки и стартиране на услуги.
  • Услуги и облак с изкуствен интелект в AzureМного облачни платформи улесняват внедряването на сложни стекове, използвайки Compose, което ви позволява да управлявате множество AI услуги, бази данни или системи за мониторинг (като Prometheus и Grafana) съвместно.

Най-добри практики и съвети за извличане на максимума от Docker Compose

  • Разделяй и владейПоддържайте услугите добре разделени и дефинирайте само необходимите, за да избегнете скрити зависимости и да улесните композирането на различни стекове.
  • Използвайте официални изображения, когато е възможноНамалява проблемите, гарантира поддръжка и улеснява актуализациите.
  • Версия на вашия docker-compose.ymlДобавете го към вашата система за контрол на версиите (като Git) заедно с останалата част от проекта, за да осигурите проследимост на промените.
  • Не съхранявайте критични данни само в контейнераВинаги използвайте външни томове или бази данни, за да избегнете загуба на данни, ако е необходимо да премахнете или актуализирате услуги.
  • Оптимизиране на DockerfilesАко създавате персонализирани изображения, уверете се, че те са леки и добре документирани, за да намалите времето за изграждане и грешките. Можете също да научите как да създавате персонализирани изображения в .
  • Пазете се от портовеУверете се, че портовете, които излагате на достъп, не са заети на вашата машина и прегледайте сигурността при публични излагания на достъп.
  • Пазете променливите и тайните извън хранилищетоИзползвайте .env файлове или мениджъри на секретни данни за чувствителни данни.

Диагностика и ежедневно управление на приложения с множество контейнери

Compose улеснява изключително много наблюдението и диагностицирането на състоянието на приложението. Някои препоръки за ежедневно приложение:

  • Проверете лог файловете с docker-compose логове -f да наблюдава поведението на всяка услуга в реално време.
  • Спиране и рестартиране на конкретни услуги ако трябва да проведете тестове или временно да освободите ресурси.
  • Пауза и възобновяване на целия стек ако е необходимо да извършвате задачи по поддръжката.

Разгръщане на сложни приложения: примери от реалния живот и препоръки

Много приложения от реалния свят използват Compose за координиране на множество услуги. Често срещани случаи включват:

  • Модерни уеб стековеНапример, React приложение на фронтенда, API в Node/Express и база данни MongoDB.
  • МикроуслугиРазлични специализирани услуги, комуникиращи помежду си чрез вътрешни мрежи, като се съхраняват в отделни бази данни.
  • Бизнес приложенияСвързване на услуги като RabbitMQ (съобщения), Redis (кеширане), Elasticsearch (търсачка) и др., всички в един и същ Compose файл.

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

Допълнителни препоръки за производствени среди

Въпреки че Compose е идеален за разработка и предпроизводство, използването му в производствения процес има нюанси:

  • Използвайте специфични променливи на средата да се раздели конфигурацията за разработка и производство.
  • Проверете сигурността на контейнери и мрежи: излагайте само необходимите портове, използвайте оптимизирани изображения и поддържайте софтуера актуален.
  • Внимавайте с обемитеВ производствения процес, помислете за използването на външно постоянно хранилище и редовно архивиране на критични данни.
  • Мониториране на състоянието и производителността на услуги с инструменти като Prometheus и Grafana.

За по-големи проекти или такива с високи изисквания за достъпност и мащабируемост, може да е от съществено значение да се премине към оркестратори като Kubernetes, въпреки че Docker Compose все още е идеален за стартиращи компании, MVP, малки екипи и бързо тестване.

Управлението на многоконтейнерни приложения никога не е било по-достъпно и мощно, отколкото с Docker Compose. С един единствен конфигурационен файл можете да дефинирате и контролирате цели инфраструктури, като гарантирате, че вашето приложение се разгръща, мащабира и работи еднакво във всяка среда. Ключът е да се възползвате от неговата гъвкавост, да поддържате добри практики и най-вече да разбирате напълно възможностите и ограниченията, които той предлага. Ако сте усвоили Compose, разполагате с основен инструмент за съвременна разработка и управление на софтуер.

Персонализирани изображения на Dockerfile-4
Свързана статия:
Как да създавате персонализирани Dockerfile изображения стъпка по стъпка