DevOps с нуля: полный гайд по старту

Полный гайд по старту в DevOps: Docker, CI/CD, Infrastructure as Code, облачные платформы. Практические примеры, команды, проекты для портфолио.

Как читать. Это подробный маршрут обучения. Нужен краткий обзор роли DevOps: задачи, порог входа, зарплаты? Смотрите обзор роли.

Автор — Дмитрий Тыльный · опыт Senior DevOps · 10 января 2026 · 8 мин

Введение: что такое 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:latest

Docker 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
*.md

CI/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 — балансировка нагрузки

Начало работы:

  1. Зарегистрируйтесь на cloud.yandex.ru
  2. Создайте облако и каталог
  3. Получите OAuth токен
  4. Установите 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-администратора.

Следующие шаги:

  1. Установите Docker и попрактикуйтесь с базовыми командами
  2. Создайте Dockerfile для простого приложения
  3. Настройте CI/CD пайплайн для своего проекта
  4. Изучите Terraform на примере создания сервера в облаке
  5. Соберите портфолио из 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 — следующий шаг.

Нужен оффер, а не пятый сертификат?

Записи реальных собесов и разборы — в Telegram.

Смотреть разборы