Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni

🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!

28.04.2023

Про наше локальне Docker-хазяйство

Хочу ще розказати про те, як зробив локальну емуляцію складної інфраструктури з продакшна — для інтеграційних тестів або ж просто для розробки.

Для того потрібний Docker Compose. Це доповнення до Docker, яке оркеструє багато контейнерів у вигляді сталої схеми. За допомогою Docker Compose можна всі контейнери відразу зібрати, запустити, звʼязати між собою, подивитися журнал, видалити, і ще багато всього.

(Docker Compose мій другий вибір подібного рішення; першим буде Foreman - утиліта, що може запускати декілька процесів з одного терміналу та збирати їх вивід в один. Але Foreman рішення обмежене — наприклад, з ним не вдасться підмінити DNS, звертатись до сервісів за хостом або IP, або запускати на macOS програми, що є тільки під Linux.)

Все це можна робити з Docker Compose. Наприклад, у нас все середовище складає на цей час 19 контейнерів. Частина з них — власні сервіси, але є й загальнодоступні — наприклад, бази даних, або dnsmasq. Вони всі розташовані в віртуальній мережі. Для деяких функцій потрібно звертатись до фіксованого IP, то це легко зробити.

Конфігураційний формат Docker Compose гнучкий. Оскільки це YAML, в ньому можна вживати якірі, тобто виносити частини конфігурації, що повторюються. Можна навіть посилатися на інший файл. Так можна суттєво знизити кількість копіпасти.

Щоб ще узагальнити конфігурацію, можна використати змінні оточення. Наприклад, завдяки змінним, можна легко зробити дві копії інфраструктури — одну для тестів, одну для ручного використання. Або виправити мілкі незручності, які заважають запускати конфігурацію як на macOS, так і на Linux (для CI) - а такі незручності трапляються.

А щоб сховати довжелезні команди docker-compose з купою параметрів, я написав Rakefile. Rake - то аналог класичного Make, написаний на Ruby, та я нерідко вживаю його за межами проєктів на Ruby, щоб спростити скрипти. Адже системні скрипти — це вроджений талант Ruby.