DevOps с нуля: полный гайд по старту
Полный гайд по старту в DevOps: Docker, CI/CD, Infrastructure as Code, облачные платформы. Практические примеры, команды, проекты для портфолио.
Как читать. Это подробный маршрут обучения. Нужен краткий обзор роли DevOps: задачи, порог входа, зарплаты? Смотрите обзор роли.
Введение: что такое DevOps
DevOps — это культура и практики, которые объединяют разработку (Development) и эксплуатацию (Operations). Цель DevOps — автоматизировать процессы разработки, тестирования и развертывания приложений, чтобы выпускать обновления быстрее и надежнее.
Основные задачи DevOps-инженера:
- Настройка CI/CD пайплайнов для автоматической сборки и деплоя
- Работа с контейнерами (Docker) и оркестрацией (Kubernetes)
- Управление инфраструктурой через код (Terraform, Ansible)
- Мониторинг и логирование сервисов
- Автоматизация рутинных задач
- Обеспечение безопасности инфраструктуры
Для старта в DevOps нужно знать Linux, основы программирования (Bash, Python), понимать, как работают приложения и сети. Можно начать с позиции DevOps-ассистента или перейти из системного администрирования.
Docker: контейнеризация приложений
Docker — это платформа для контейнеризации приложений. Контейнер упаковывает приложение и все его зависимости в единый образ, который работает одинаково на любой системе.
Установка Docker
Установите Docker Engine и плагин Compose по инструкции для вашей системы: Ubuntu или Debian. Репозитории пакетов у них разные. После установки проверьте клиент, сервер и Compose:
sudo docker version
sudo docker compose version
sudo docker run --rm hello-worldДальше команды показаны для пользователя с доступом к Docker. Если доступа нет, используйте sudo. Участник группы docker фактически получает права root на сервере, поэтому добавлять туда пользователя нужно осознанно. Подробнее — в инструкции Docker.
Базовые команды Docker
Работа с образами:
# Скачать образ
docker pull nginx
# Посмотреть список образов
docker images
# Удалить образ
docker rmi nginx
# Поиск образов в Docker Hub
docker search nginxРабота с контейнерами:
# Запустить контейнер
docker run -d -p 80:80 --name my-nginx nginx
# Посмотреть запущенные контейнеры
docker ps
# Посмотреть все контейнеры (включая остановленные)
docker ps -a
# Остановить контейнер
docker stop my-nginx
# Запустить остановленный контейнер
docker start my-nginx
# Остановить и удалить контейнер
docker stop my-nginx
docker rm my-nginx
# Посмотреть логи контейнера
docker logs my-nginx
# Выполнить команду в запущенном контейнере
docker exec -it my-nginx bashСоздание Dockerfile
Dockerfile — это инструкция для создания образа. Пример для Python-приложения, у которого уже есть requirements.txt и app.py. Приложение должно слушать 0.0.0.0:8000:
# Используем официальный Python образ
FROM python:3.11-slim
# Устанавливаем рабочую директорию
WORKDIR /app
# Копируем файл зависимостей
COPY requirements.txt .
# Устанавливаем зависимости
RUN pip install --no-cache-dir -r requirements.txt
# Копируем код приложения
COPY . .
# Открываем порт
EXPOSE 8000
# Команда запуска
CMD ["python", "app.py"]Сборка образа:
docker build -t my-app:latest .
# Запуск контейнера из образа
docker run -d -p 8000:8000 --name my-app my-app:latestDocker Compose
Docker Compose позволяет управлять несколькими контейнерами через один файл. Пример docker-compose.yml:
services:
web:
build: .
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/mydb
depends_on:
db:
condition: service_healthy
db:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d mydb"]
interval: 5s
timeout: 5s
retries: 10
volumes:
postgres_data:Пароль pass здесь учебный. Для рабочего сервера задайте отдельный секрет. Проверка БД помогает дождаться её запуска, но приложение всё равно должно обрабатывать разрывы соединения. Данные БД лежат в volume: обычный down его не удаляет, а down -v удалит.
Команды Docker Compose:
# Запустить все сервисы
docker compose up -d
# Остановить все сервисы
docker compose down
# Посмотреть логи
docker compose logs -f
# Пересобрать образы
docker compose buildОптимизация Dockerfile
Кэширование слоёв: копируем зависимости отдельно от кода, чтобы использовать кэш:
FROM python:3.11-slim
WORKDIR /app
# Сначала копируем только requirements.txt
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Потом копируем код (этот слой пересобирается только при изменении кода)
COPY . .
EXPOSE 8000
CMD ["python", "app.py"]Использование .dockerignore: исключаем ненужные файлы из образа:
# .dockerignore
__pycache__
*.pyc
.git
.env
node_modules
*.mdCI/CD: автоматизация сборки и деплоя
CI/CD (Continuous Integration / Continuous Deployment) — это практика автоматической сборки, тестирования и развертывания кода при каждом изменении.
GitHub Actions
GitHub Actions — встроенная система CI/CD в GitHub. Создайте файл .github/workflows/ci.yml:
name: Build and test
permissions:
contents: read
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v5
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: '3.11'
- name: Install dependencies
run: |
pip install -r requirements.txt
pip install pytest
- name: Run linter
run: |
pip install flake8
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
- name: Run tests
run: pytest
- name: Build Docker image
run: docker build -t my-app:${{ github.sha }} .В проекте должны быть тесты для pytest. Этот workflow проверяет код и сборку образа, но пока ничего не публикует и не развёртывает. Пример рассчитан на GitHub-hosted runner; свой runner нужно обновлять под требования используемых actions.
GitLab CI
Для проекта с requirements.txt и тестами pytest начните с проверок. Файл .gitlab-ci.yml:
image: python:3.11
stages:
- test
test:
stage: test
script:
- pip install -r requirements.txt
- pip install pytest flake8
- flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
- pytestНужен доступный runner с поддержкой контейнерных jobs. Сборка Docker требует отдельной настройки runner, а не только строки docker build в YAML. Варианты описаны в документации GitLab.
Как добавить деплой на сервер
Сначала отработайте деплой на учебный VPS вручную. Затем перенесите проверенные команды в скрипт: выбрать точную версию, запустить её, проверить ответ сервиса и при неудаче вернуть предыдущую. Автоматический запуск разрешайте только после тестов и для нужной ветки.
Ключ SSH храните в secrets CI, отпечаток сервера проверяйте до подключения. Не выключайте работающий сервис заранее ради пересборки и не добавляйте очистку всех Docker-ресурсов в каждый релиз. База и пользовательские файлы должны храниться отдельно от контейнера приложения.
Infrastructure as Code: Terraform
Terraform — инструмент для управления инфраструктурой через код. Позволяет описывать серверы, сети, базы данных в файлах конфигурации.
Установка Terraform
Выберите пакет под свою ОС и архитектуру в инструкции HashiCorp. Для работы с Yandex Cloud есть официальный стартовый пример и настройка зеркала. Если скачиваете архив вручную, сверяйте контрольную сумму из того же релиза.
terraform versionБазовый пример: создание сервера в Yandex Cloud
Пример создаёт платную учебную VM и сеть. До запуска выберите актуальный публичный образ Ubuntu и проверьте лимиты каталога. Создайте файл main.tf:
terraform {
required_providers {
yandex = {
source = "yandex-cloud/yandex"
version = "~> 0.100"
}
}
}
provider "yandex" {
token = var.yandex_token
cloud_id = var.cloud_id
folder_id = var.folder_id
zone = "ru-central1-a"
}
resource "yandex_compute_instance" "vm" {
name = "my-vm"
platform_id = "standard-v2"
resources {
cores = 2
memory = 4
}
boot_disk {
initialize_params {
image_id = var.image_id
size = 20
}
}
network_interface {
subnet_id = yandex_vpc_subnet.subnet.id
nat = true
}
metadata = {
ssh-keys = "ubuntu:${file("~/.ssh/id_rsa.pub")}"
}
}
resource "yandex_vpc_network" "network" {
name = "my-network"
}
resource "yandex_vpc_subnet" "subnet" {
name = "my-subnet"
zone = "ru-central1-a"
network_id = yandex_vpc_network.network.id
v4_cidr_blocks = ["10.0.1.0/24"]
}Создайте файл variables.tf:
variable "yandex_token" {
description = "Yandex Cloud OAuth token"
type = string
sensitive = true
}
variable "cloud_id" {
description = "Yandex Cloud ID"
type = string
}
variable "folder_id" {
description = "Yandex Cloud Folder ID"
type = string
}
variable "image_id" {
description = "ID выбранного публичного образа Ubuntu"
type = string
}Создайте файл terraform.tfvars (не коммитьте в Git!):
yandex_token = "your-token"
cloud_id = "your-cloud-id"
folder_id = "your-folder-id"
image_id = "your-image-id"Замените значения на свои, включая ID образа из списка публичных образов. Проверьте путь к SSH-ключу. После init сохраните .terraform.lock.hcl в Git: он фиксирует выбранную версию провайдера. Файлы .tfvars, state, сохранённый план tfplan и каталог .terraform исключите через .gitignore: они могут содержать секреты. Токену нужны права на выбранный каталог.
Команды Terraform:
# Инициализация
terraform init
# Проверка конфигурации и план
terraform fmt -check
terraform validate
terraform plan -out=tfplan
# Применение просмотренного плана
terraform apply tfplan
# Только для удаления ресурсов этого учебного проекта
terraform destroy
# Просмотр состояния
terraform showМодули Terraform
Модули позволяют переиспользовать код. Ниже показана структура отдельного модуля. Чтобы пример заработал, внутри webserver нужно описать ресурсы и объявить переменные instance_count и instance_type:
modules/
webserver/
main.tf
variables.tf
outputs.tfИспользование модуля:
module "webserver" {
source = "./modules/webserver"
instance_count = 2
instance_type = "standard-v2"
}Облачные платформы
Для DevOps важно знать облачные платформы. В России популярны Yandex Cloud и VK Cloud (бывший Mail.ru Cloud Solutions).
Yandex Cloud
Основные сервисы:
- Compute Cloud — виртуальные машины
- Object Storage — хранилище файлов (аналог S3)
- Managed Kubernetes — управляемый Kubernetes
- Container Registry — реестр Docker-образов
- Load Balancer — балансировка нагрузки
Начало работы:
- Зарегистрируйтесь на cloud.yandex.ru
- Создайте облако и каталог
- Получите OAuth токен
- Установите Yandex Cloud CLI
AWS (для международных проектов)
Основные сервисы:
- EC2 — виртуальные машины
- S3 — хранилище объектов
- RDS — управляемые базы данных
- EKS — управляемый Kubernetes
- Lambda — serverless функции
Практические проекты для портфолио
Проект 1: Настройка CI/CD для веб-приложения
- Создайте простое веб-приложение (Python/Node.js)
- Напишите Dockerfile
- Настройте GitHub Actions для автоматической сборки и тестирования
- Задеплойте на сервер через CI/CD
- Опубликуйте на GitHub с README
Проект 2: Инфраструктура через Terraform
- Опишите инфраструктуру для приложения (сервер, БД, сеть)
- Используйте модули для переиспользования
- Настройте переменные и outputs
- Задокументируйте в README
Проект 3: Мониторинг и логирование
- Настройте Prometheus для сбора метрик
- Создайте дашборды в Grafana
- Настройте алерты
- Настройте сбор логов (ELK Stack или Loki)
Ресурсы для изучения
Официальная документация:
Курсы и туториалы:
- Docker для начинающих — официальный туториал
- Terraform Learn — интерактивные туториалы от HashiCorp
- Kubernetes Basics — официальный курс
Практика:
- Создавайте проекты и публикуйте на GitHub
- Используйте free tier облачных платформ
- Читайте блоги и статьи на Habr, Medium
- Участвуйте в open-source проектах
Заключение
DevOps — это практическая область. Начните с Docker, затем изучите CI/CD, потом Terraform. Делайте проекты, публикуйте на GitHub, описывайте в резюме. Linux, Docker и основы CI/CD — база для первых практических задач. Дальше сверяйте подготовку с требованиями выбранных вакансий: одного списка инструментов для оффера мало. Kubernetes и продвинутые темы можно изучать на работе.
Перед первыми собесами прогоните себя по 66 реальным вопросам с DevOps-собеседований — с ответами и разбором, где валятся кандидаты. А когда закрепитесь в роли, дальше по треку есть подборки вопросов по SRE и DevSecOps — но это уже не про первый оффер. А вот Linux пригодится сразу: базу спрашивают на каждом собесе, и она разобрана в 42 вопроса с собесов на Linux-администратора.
Следующие шаги:
- Установите Docker и попрактикуйтесь с базовыми командами
- Создайте Dockerfile для простого приложения
- Настройте CI/CD пайплайн для своего проекта
- Изучите Terraform на примере создания сервера в облаке
- Соберите портфолио из 2-3 проектов
Следующий шаг в DevOps
Примените идеи из «DevOps с нуля: полный гайд по старту» к своему учебному проекту или к одной вакансии на этой неделе. Поднимите один сервис в Docker, прогоните простой CI, задеплойте на VPS или в песочницу. База: Docker, GitHub Actions, VPS. Обзор роли — DevOps на уровне джуна.
Частые вопросы
Можно ли войти в DevOps без опыта?
Сложно: вакансий «с нуля» мало, чаще приходят из администрирования, разработки или QA.
С чего начать изучение?
С Linux и Docker, затем CI/CD, инфраструктура как код и уже потом Kubernetes.
Нужен ли Kubernetes сразу?
Нет. Сначала уверенные Linux, Docker и CI/CD; K8s — следующий шаг.