Будування та управління сучасними застосунками часто потребує надійного та масштабованого середовища для розробки. Хоча локальні налаштування можуть працювати для невеликих проєктів, вони часто стикаються з проблемами масштабування, співпраці та узгодженості. Саме тут у пригоді стають хмарні середовища для розробки.
Використовуючи платформи, такі як Google Cloud Platform (GCP), яка надає $300 кредитів на безкоштовне використання, можна легко налаштувати економічне та масштабоване середовище. Однак описаний у цьому посібнику підхід також чудово працює з будь-якою іншою хмарною платформою чи хостингом, такими як AWS, Azure або навіть локальні віртуальні машини.
У цьому посібнику ви навчитесь налаштовувати професійне середовище для розробки для популярних фреймворків, таких як Flask, Django, FastAPI, Spring Boot та Node.js.
До кінця цього посібника ви отримаєте оптимізований робочий процес, який дозволить зосередитись на розробці застосунків без турбот про інфраструктуру.
Чому масштабоване середовище для розробки?
Масштабоване середовище для розробки надає рішення для реальних проблем, з якими стикаються сучасні розробники та організації. Ось кілька практичних випадків, коли таке середовище стає незамінним:
1. Робота з кластером великих даних:
Платформи, такі як AWS EMR та GCP Dataproc, дозволяють розробникам ефективно обробляти тербайти даних.
Масштабоване середовище для розробки дозволяє:
- Безперешкодно підключатися до головних вузлів кластерів EMR або Dataproc для виконання, налагодження та тестування застосунків безпосередньо в середовищі кластера.
- Використовувати інструменти, такі як Docker та Docker Compose, для створення локальних тестових середовищ для застосунків Spark або Hadoop, що максимально наближені до реального налаштування кластера, забезпечуючи плавне розгортання.
- Уникати обмежень локальних ресурсів при обробці великих наборів даних, використовуючи віддалені налаштування віртуальних машин (VM).
Наприклад, розробники можуть використовувати Docker для налаштування локального застосунку Spark, перевірити його функціональність, а потім підключитися до головного вузла EMR або Dataproc для обробки даних у великих масштабах, не турбуючись про невідповідності між локальними та кластерними налаштуваннями.
2. Розробка застосунків, що використовують потужності GPU:
Застосунки, такі як навчання моделей машинного навчання, обробка зображень або рендеринг відео, потребують потужних графічних процесорів (GPU) та високопродуктивного обладнання.
Хмарні платформи (наприклад, GCP’s Compute Engine або AWS EC2) пропонують віртуальні машини з GPU-екземплярами, але налаштування узгодженого середовища для розробки на такому обладнанні може бути складним.
- Використання Docker Compose гарантує правильне налаштування всіх залежностей (як-от бібліотек CUDA).
- Розробники можуть створювати прототипи моделей локально за допомогою Docker-образів на базі CPU і масштабувати їх до GPU-екземплярів для виробничих навантажень.
Наприклад, дослідники в галузі штучного інтелекту, які працюють з TensorFlow, можуть використовувати Docker-образи, попередньо налаштовані з NVIDIA CUDA, щоб запускати свої моделі як локально, так і в хмарі без необхідності повторної конфігурації.
3. Співпраця між командами:
Команди, що працюють віддалено, часто стикаються з проблемами несумісних середовищ, що призводить до помилок під час розгортання.
Налаштування середовища для розробки в контейнерах усуває ці невідповідності, гарантуючи, що всі використовують однакову конфігурацію.
- Віддалені середовища можна отримати та поділитися за допомогою інструментів, таких як Visual Studio Code з розширеннями SSH.
- Файли Compose можуть визначати узгоджені середовища для бекенд-сервісів (Flask, Spring Boot) та баз даних, що забезпечує більш плавну командну роботу.
4. Масштабування за межі локальних обмежень ресурсів:
Багато розробників стикаються з обмеженнями своїх локальних машин при обробці пам'яттєвоємних завдань або одночасному запуску кількох сервісів. Виводячи середовище розробки в хмару, ви можете:
- Уникнути проблем з продуктивністю, використовуючи масштабовані обчислювальні та сховищні ресурси.
- Тестувати багатосервісні застосунки з реальними конфігураціями, не навантажуючи локальні машини.
5. Оптимізація процесу розгортання:
Тестування застосунку в середовищі, яке імітує виробниче, знижує ризики при розгортанні.
За допомогою інструментів, таких як Docker та Docker Compose, ви можете відтворювати середовища, схожі на виробничі, для тестування API, баз даних та сторонніх сервісів.
Цей підхід:
- Прискорює CI/CD (Continuous Integration/Continuous Deployment) пайплайни.
- Забезпечує відтворюваність середовища між staging (стадією) та production (продукцією).
Як ця стаття допомагає:
- Налаштування з нуля: Покрокові інструкції допоможуть вам створити хмарне середовище Ubuntu та налаштувати інструменти, такі як Docker та Docker Compose.
- Оптимізовані робочі процеси: Дізнайтеся, як налаштувати масштабовані середовища для Flask, Django, FastAPI, Spring Boot та Node.js.
- Реальні застосування: Інтегруючи Docker у робочі процеси, цей посібник дозволяє легко справлятися з великими даними, завданнями, що потребують потужностей GPU, і багатосервісними додатками.
- Продуктивність команди: Узгоджене налаштування на всіх машинах мінімізує помилки, забезпечуючи швидшу та надійнішу співпрацю.
Цільова аудиторія
Цей підручник призначений для професіоналів та ентузіастів у різних сферах розробки програмного забезпечення, які хочуть оптимізувати свої робочі процеси за допомогою Docker та Docker Compose:
**1.
1. Розробники програмного забезпечення (Software Engineers):
- Хочуть створювати стабільні та відтворювані середовища для розробки.
- Керують залежностями між кількома сервісами для великих додатків.
2. Full Stack розробники (Full Stack Developers):
- Створюють сучасні веб-додатки з окремими фронтенд і бекенд сервісами.
- Використовують контейнери для безперешкодного запуску API, баз даних та інших залежностей.
3. Інженери даних (Data Engineers):
- Налаштовують пайплайни для обробки великих даних з розподіленими системами, такими як Spark або Hadoop.
- Спрощують розгортання інструментів для роботи з даними, таких як Kafka, PostgreSQL або MongoDB.
4. DevOps інженери (DevOps Engineers):
- Керують інфраструктурою як кодом за допомогою Docker та Compose файлів.
- Автоматизують пайплайни для розгортання та підтримують масштабовані CI/CD робочі процеси.
**5.
1. Інженери машинного навчання (Machine Learning Engineers):
- Розробляють моделі штучного інтелекту в ізольованих середовищах з попередньо налаштованими залежностями.
- Використовують контейнери Docker з підтримкою GPU для тренування та інференс задач.
Якщо ви належите до будь-якої з цих ролей, цей посібник надасть практичні поради щодо створення, розгортання та керування контейнеризованими додатками.
Крок 1: Налаштування Ubuntu VM на GCP
Чому варто використовувати GCP?
- $300 безкоштовного кредиту від GCP робить його ідеальним стартом для економічного експериментування.
- Альтернативи, такі як AWS Free Tier, Azure або DigitalOcean, також можна використовувати.
Як налаштувати VM:
a. Створення екземпляра Compute Engine:
- Увійдіть у GCP Console.
- Виберіть "Compute Engine" і створіть новий екземпляр.
- Виберіть Ubuntu 24.04 як операційну систему.
b. Налаштування доступу через SSH:
- Використовуйте свій публічний ключ SSH для безпечного входу.
- Підключіться за допомогою CLI gcloud або будь-якого SSH клієнта.
**c.
Конфігурація після налаштування:
sudo apt update && sudo apt upgrade -y
sudo apt install curl git -y
Чому? Ці утиліти є необхідними для завантаження та управління вашим кодом і залежностями.
Крок 2: Встановлення Docker та Docker Compose
Що таке Docker?
Docker — це платформа з відкритим кодом, яка дозволяє розробникам створювати, розгортати та запускати додатки всередині легких, портативних контейнерів. Вона забезпечує стабільність середовищ розробки, тестування та продакшн, об'єднуючи додатки з їхніми залежностями.
Що таке Docker Compose?
Docker Compose — це інструмент для визначення та запуску багатоконтейнерних Docker додатків.
Використовуючи конфігураційний файл YAML, розробники можуть вказати сервіси, мережі та томи, необхідні для запуску додатка, що спрощує керування складними середовищами.
Основні переваги Docker та Docker Compose
- Ізоляція (Isolation): Кожен контейнер працює незалежно, уникаючи конфліктів.
- Портативність (Portability): Контейнери працюють однаково, незалежно від того, де вони розгорнуті.
- Масштабованість (Scalability): Легко масштабувати сервіси вгору або вниз за потребою.
- Ефективність (Efficiency): Контейнери використовують ядро хост-операційної системи, що робить їх легкими та швидкими.
Встановлення Docker та Docker Compose
a. Встановлення Docker Engine:
sudo apt install docker-ce
sudo usermod -aG docker $USER # Для запуску docker без прав sudo
Це встановлює Docker та Docker Compose і автоматично запускає Docker.
Увімкнення цієї опції забезпечує запуск Docker після перезавантаження системи.
Якщо ви зіштовхнулися з проблемами під час встановлення Docker на Ubuntu 24.04, ви можете ознайомитись з цією статтею, щоб отримати покрокову інструкцію з налаштування Docker на Ubuntu для посилання.
b. Перевірка встановлення:
docker --version
docker-compose --version
c. Запуск тестового контейнера:
docker run hello-world
Вивід підтверджує, що Docker встановлений та працює правильно.
Використання Docker та Docker Compose
**a.
Налаштування контейнера з Ubuntu:
- Завантаження образу Ubuntu: Почніть з того, щоб завантажити офіційний образ Ubuntu з Docker Hub:
docker pull ubuntu
- Запуск контейнера Ubuntu: Запустіть контейнер, використовуючи образ Ubuntu:
docker run -it --name ubuntu-container ubuntu
-it
: Відкриває інтерактивний термінал.
--name
: Призначає контейнеру користувацьке ім'я.
- Перевірка роботи контейнера: Відкрийте новий термінал і виконайте команду:
docker ps
Це відобразить активні контейнери. Ви повинні побачити
ubuntu-container
у списку.
- Зупинка та перезапуск контейнера:
docker stop ubuntu-container
docker start -ai ubuntu-container
Прапорець
-ai
підключає вас до інтерактивного терміналу контейнера.
**b.
Створення власного образу з Nginx:
- Створіть директорію для проєкту:
mkdir docker-nginx && cd docker-nginx
- Напишіть Dockerfile: Усередині директорії проєкту створіть файл
Dockerfile
:
FROM ubuntu
RUN apt update && apt install -y nginx
CMD ["nginx", "-g", "daemon off;"]
FROM ubuntu
: Базовий образ.
RUN
: Оновлює менеджер пакетів і встановлює Nginx.
CMD
: Визначає команду за замовчуванням для запуску Nginx.
- Створіть власний образ:
docker build -t custom-nginx .
-t
: Призначає тег образу якcustom-nginx
.
.
: Вказує на поточну директорію як контекст побудови.
- Запустіть контейнер з власного образу:
docker run -d --name nginx-container -p 8080:80 custom-nginx
-d
: Запускає контейнер у відокремленому режимі.
--name
: Призначає контейнеру користувацьке ім'я.
-p
: Прив'язує порт 8080 на хості до порту 80 в контейнері.
- Доступ до сервера Nginx: Відкрийте браузер і перейдіть за адресою
http://localhost:8080
, щоб побачити сторінку привітання Nginx.
**c.
Керування контейнерами Docker:
- Перегляд запущених контейнерів:
docker ps
- Перегляд усіх контейнерів (включаючи зупинені):
docker ps -a
- Зупинка контейнера:
docker stop nginx-container
- Видалення контейнера:
docker rm nginx-container
- Видалення образу:
docker rmi custom-nginx
Використання Docker Compose:
- Напишіть файл
docker-compose.yml
: Створіть новий файл з назвоюdocker-compose.yml
:
version: '3.8'
services:
nginx:
build: .
ports:
- "8080:80"
build
: Вказує на директорію, що міститьDockerfile
.
ports
: Прив'язує порти між хостом і контейнером.
- Створіть і запустіть сервіс:
docker-compose up --build
- Зупиніть сервіс:
docker-compose down
Налагодження всередині контейнера:
-
Доступ до запущеного контейнера: Використовуйте команду
exec
, щоб відкрити оболонку всередині запущеного контейнера:docker exec -it nginx-container bash
2.Огляди журналів:
-
Оглянути журнали: Перегляньте журнали контейнера для відлагодження проблем:
docker logs nginx-container
-
Оглянути запущені процеси: Після входу в контейнер ви можете переглянути запущені процеси:
ps aux
3.Вихід з контейнера:
-
Вийти з контейнера: Введіть
exit
, щоб вийти з контейнера.
Основні команди Docker:
- Перегляд зображень:
docker images
- Завантажити зображення:
docker pull
- Видалити невикористовувані контейнери та зображення:
docker system prune
Команди Docker Compose:
- Запустити всі сервіси:
docker-compose up
- Зупинити всі сервіси:
docker-compose down
- Переглянути журнали всіх сервісів:
docker-compose logs
- Перебудувати сервіси після змін:
docker-compose up --build
Типові випадки використання Docker Compose:
- Розробка: Швидко налаштуйте середовище для розробки фреймворків, таких як Flask, Django чи Node.js, з базою даних, наприклад, PostgreSQL або MySQL.
- Тестування: Запускайте автоматизовані тести в ізольованих середовищах, які імітують виробниче.
- Розгортання: Спрощене розгортання багатосервісних застосунків за допомогою одного конфігураційного файлу.
Чому використовувати Docker Compose?
Керування окремими контейнерами може стати громіздким, коли застосунки стають складнішими.
Docker Compose спрощує керування багатоконтейнерними застосунками, дозволяючи визначити та організувати кілька сервісів в одному YAML файлі. Ось чому Docker Compose є незамінним:
- Спрощує багатосервісні застосунки: Складні застосунки часто включають кілька компонентів, таких як веб-сервери, бази даних і брокери повідомлень. Docker Compose ефективно управляє цими залежностями, піднімаючи всі сервіси за допомогою однієї команди.
- Забезпечує консистентність у середовищах: Файли Compose діють як шаблони для середовищ розробки, тестування та виробництва, гарантуючи однакові конфігурації в командах і системах.
- Спрощує налаштування мережі: Docker Compose автоматично створює ізольовану мережу для ваших сервісів, спрощуючи комунікацію між контейнерами без необхідності вручну налаштовувати мережу.
- Спрощує масштабування: Масштабування сервісів з Compose є дуже простим.
Наприклад, ви можете масштабувати кількість екземплярів веб-сервера однією командою:docker-compose up --scale nginx=3
- Покращує робочі процеси для CI/CD пайплайнів: Compose інтегрується безперешкодно з CI/CD пайплайнами, дозволяючи розробникам тестувати багатосервісні налаштування в ізольованих середовищах перед розгортанням.
- Зменшує ручну працю: Автоматизує завдання, такі як створення образів, монтування томів і налаштування портів, зменшуючи необхідність у повторюваних ручних командах.
Наприклад, якщо ви працюєте над веб-застосунком з фронтендом на Nginx, API на Flask і базою даних PostgreSQL, Docker Compose дозволяє вам:
- Визначити всі три сервіси в одному файлі
docker-compose.yml
. - Запускати та керувати усією стекою за допомогою однієї команди.
Крок 3: Віддалена розробка з Visual Studio Code
Чому віддалена розробка?
Віддалена розробка мінімізує споживання ресурсів локального середовища, забезпечує консистентність та дозволяє співпрацювати на централізованих середовищах.
Це особливо корисно для:
- Ресурсоємних застосунків: Перенесення обчислювальних задач (наприклад, обробка великих даних або навантаження на GPU) на хмарну віртуальну машину, поки ви працюєте на легкому локальному комп'ютері.
- Командної співпраці: Централізовані середовища забезпечують узгоджені залежності та конфігурації серед розробників.
- Безперешкодного налагодження та тестування: Пряме налагодження та тестування застосунків, що працюють в віддаленому середовищі, без необхідності їх локального відтворення.
Як налаштувати віддалену розробку:
a. Встановлення пакета розширень для віддаленої розробки:
- Відкрийте Visual Studio Code.
- Перейдіть до Marketplace розширень і знайдіть "Remote Development."
-
Встановіть пакет розширень Remote Development, який включає розширення для SSH, контейнерів та WSL.
Налаштування SSH для підключення до вашої віртуальної машини: -
Переконайтеся, що у вас є доступ до віддаленої віртуальної машини через SSH:
ssh @
- У VS Code відкрийте Command Palette (
Ctrl+Shift+P
абоCmd+Shift+P
) та шукайте “Remote-SSH: Connect to Host.” - Додайте дані вашої віртуальної машини та підключіться.
c. Налаштування робочого простору для розробки:
- Після підключення ви можете відкрити будь-яку папку або робочий простір на віддаленому сервері. Це дозволяє вам:
- Редагувати файли на сервері, наче вони локальні.
- Запускати та налагоджувати код безпосередньо на віртуальній машині.
d. Покращення продуктивності за допомогою розширень:
- Встановіть специфічні для мови розширення (наприклад, Python, Java, Node.js) для покращених можливостей, таких як IntelliSense, лінтинг коду та налагодження.
-
Використовуйте розширення для Git для контролю версій, що дозволяє зручно передавати зміни між віддаленим середовищем і вашим локальним середовищем.
Налагодження застосунків на віддаленому сервері: -
Налаштуйте точки зупину (breakpoints) та запустіть налагоджувач безпосередньо в VS Code, поки застосунок виконується на віртуальній машині.
-
Переглядайте логи та виведення в реальному часі, що полегшує виявлення помилок.
Чому використовувати VS Code для віддаленої розробки?
- Уніфікований досвід: Доступ, редагування та налагодження віддалених проєктів у межах одного інтерфейсу редактора.
- Зменшення накладних витрат на налаштування: Не потрібно повторно налаштовувати залежності або конфігурації середовища локально.
- Гнучкість: Легко переключатися між кількома віддаленими середовищами без перезапуску IDE.
- Масштабованість: Легко працювати з великими проєктами або ресурсомісткими застосунками, розміщеними на високопродуктивних віртуальних машинах.
Приклад використання: Розробка застосунку на Flask
a. Використовуйте функцію Remote SSH у VS Code для підключення до вашої хмарної Ubuntu VM.
b. Клонуйте репозиторій або створіть нову папку проєкту:
git clone https://github.com/example/flask-app.git
cd flask-app
Відкрийте папку проєкту у VS Code та встановіть необхідні залежності:
pip install -r requirements.txt
```
d. Запустіть Flask-застосунок на віддаленій віртуальній машині:
flask run --host=0.0.0.0 --port=5000
e. Використовуйте налагоджувач (debugger) VS Code для встановлення точок зупину (breakpoints) та перевірки поведінки застосунку.
Завдяки можливостям віддаленої розробки в VS Code розробники можуть зосередитися на побудові та тестуванні застосунків, не турбуючись про обмеження своїх локальних машин.
Крок 4: Створення початкових проєктів для популярних фреймворків
Flask, Django або FastAPI (Python фреймворки)
a. Налаштування структури проєкту:
mkdir python-app && cd python-app
b. Напишіть Dockerfile
:
FROM python:3.9
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run", "--host=0.0.0.0", "--port=5000"]
Замініть команди, специфічні для Flask, на manage.py runserver
для Django або uvicorn main:app --host 0.0.0.0 --port 8000
для FastAPI, залежно від потреб.
c. Налаштування docker-compose.yml
:
version: '3.8'
services:
app:
build: .
ports:
- "8000:8000"
volumes:
- .:/app
d. Запуск вашого застосунку:
docker-compose up
Spring Boot (Java фреймворк)
a. Створіть Spring Boot застосунок:
- Використовуйте
Spring Initializr
для генерації проєкту.
b. Напишіть Dockerfile
:
FROM openjdk:11
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
c. Налаштуйте docker-compose.yml
:
version: '3.8'
services:
app:
build: .
ports:
- "8080:8080"
d. Запуск застосунку:
docker-compose up
Node.js (JavaScript фреймворк)
a. Налаштування проєкту:
mkdir node-app && cd node-app
npm init -y
b.
Напишіть** Dockerfile
:
FROM node:14
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
CMD ["npm", "start"]
c. Напишіть docker-compose.yml
:
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
volumes:
- .:/app
d. Запустіть ваш застосунок:
docker-compose up
Крок 5: Огляд команд Docker
a. Основні команди:
- Побудова і запуск:
docker-compose up --build
- Зупинка сервісів:
docker-compose down
- Перегляд логів:
docker-compose logs
b. Поради для налагодження:
- Використовуйте
docker exec -it /bin/bash
, щоб налагоджувати всередині контейнера.
Висновок
Налаштування масштабованого середовища для розробки не обов’язково має бути складним.
Із такими інструментами, як Docker, і хмарними кредитами від платформ, таких як GCP, ви можете створювати послідовні, готові до віддаленої роботи середовища для будь-якої сучасної фреймворки для розробки застосунків.
Почніть сьогодні, незалежно від того, чи розробляєте ви за допомогою Flask, Django, FastAPI, Spring Boot або Node.js, і відчуйте приріст продуктивності завдяки налаштуванню для розробки, що хоститься в хмарі.
Перекладено з: Setting Up Scalable Development Environments