Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Введение в контейнеризацию
intro

Введение в контейнеризацию

Что такое контейнеры, чем они отличаются от виртуальных машин, архитектура Docker

Введение в контейнеризацию

Контейнеры изменили способ развёртывания приложений. Узнайте, как они работают и почему стали стандартом индустрии.

#Что такое контейнеризация?

Контейнеризация — это технология упаковки приложения вместе со всеми его зависимостями (библиотеками, конфигурационными файлами, переменными окружения) в изолированную среду выполнения — контейнер.

Контейнер запускается как обычный процесс в операционной системе, но имеет собственное изолированное пространство:

  • Файловую систему
  • Сеть
  • Процессы
  • Переменные окружения

#Контейнеры vs Виртуальные машины

Это первый вопрос, который возникает у новичков. Давайте разберёмся.

#Виртуальные машины (VM)

Виртуальные машины используют гипервизор (VirtualBox, VMware, Hyper-V) для эмуляции полноценного компьютера. Каждая VM включает:

  • Полную гостевую операционную систему
  • Виртуализированное железо
  • Приложение и зависимости

ASCII Diagram

Преимущества VM:

  • Полная изоляция
  • Можно запускать разные ОС (Linux, Windows)
  • Зрелая технология

Недостатки VM:

  • Большой размер (гигабайты на образ)
  • Долгий запуск (минуты)
  • Высокие накладные расходы на ресурсы

#Контейнеры

Контейнеры используют ядро хостовой ОС напрямую. Они включают:

  • Приложение
  • Зависимости
  • Минимальный набор системных утилит

ASCII Diagram

Преимущества контейнеров:

  • Малый размер (мегабайты)
  • Быстрый запуск (секунды)
  • Минимальные накладные расходы
  • Переносимость («работает на моей машине» → «работает везде»)

Недостатки контейнеров:

  • Меньшая изоляция (общее ядро)
  • Только одна ОС (нельзя запустить Windows-контейнер на Linux)

#Сравнительная таблица

ХарактеристикаВиртуальные машиныКонтейнеры
РазмерГБМБ
ЗапускМинутыСекунды
ИзоляцияПолнаяПроцессная
ПроизводительностьНижеВыше
Разные ОСДаНет

#Архитектура Docker

Docker — самая популярная платформа для работы с контейнерами. Разберём её компоненты.

#Docker Engine

Docker Engine — это клиент-серверное приложение, состоящее из:

  1. Docker Daemon (dockerd) — фоновый процесс, который управляет образами, контейнерами, сетями и хранилищами.

  2. REST API — интерфейс для взаимодействия с демоном.

  3. Docker CLI — командная строка (docker), которую используют люди.

ASCII Diagram

#Основные команды для начала работы

Проверьте установку Docker:

docker --version # Docker version 24.0.7, build afdd53b docker run hello-world # Загружает тестовый образ и запускает контейнер

#Ключевые концепции

#Образ (Image)

Образ — это неизменяемый шаблон для создания контейнеров. Можно сравнить с классом в ООП.

# Загрузить образ из реестра docker pull nginx:latest # Посмотреть локальные образы docker images

#Контейнер (Container)

Контейнер — это запущенный экземпляр образа. Аналогия: объект — экземпляр класса.

# Запустить контейнер docker run -d --name my-nginx -p 8080:80 nginx # Посмотреть запущенные контейнеры docker ps # Остановить контейнер docker stop my-nginx

#Реестр (Registry)

Реестр — хранилище образов. Docker Hub — публичный реестр по умолчанию.

# Поиск образов docker search python # Загрузка из реестра docker pull python:3.11-slim

#Как работают контейнеры: под капотом

Контейнеры используют возможности ядра Linux:

#Namespaces

Namespaces обеспечивают изоляцию ресурсов:

  • PID — изоляция процессов
  • NET — изоляция сети (интерфейсы, порты)
  • MNT — изоляция файловой системы
  • UTS — изоляция имени хоста
  • IPC — изоляция межпроцессного взаимодействия
  • USER — изоляция пользователей

Каждый контейнер работает в своём namespace и «не видит» процессы других контейнеров.

#Control Groups (cgroups)

Cgroups ограничивают использование ресурсов:

  • CPU (процессорное время)
  • Memory (оперативная память)
  • I/O (дисковые операции)
  • Network (сетевой трафик)
# Запуск с ограничением ресурсов docker run --memory=512m --cpus=1.5 nginx

#Union File System

Union FS позволяет создавать слоистые файловые системы. Каждый образ состоит из слоёв:

ASCII Diagram

При изменении файла в контейнере он копируется в верхний слой (Copy-on-Write).

#Практика: первый контейнер

#Запуск веб-сервера

# Запустить nginx в фоновом режиме docker run -d \ --name web-server \ -p 8080:80 \ nginx:latest # Проверить, что работает curl http://localhost:8080 # Посмотреть логи docker logs web-server # Остановить docker stop web-server # Удалить docker rm web-server

#Интерактивный контейнер

# Запустить Ubuntu с интерактивной оболочкой docker run -it ubuntu:22.04 bash # Внутри контейнера: root@abc123:/# apt update root@abc123:/# exit

Флаги:

  • -i — интерактивный режим (stdin)
  • -t — выделение TTY
  • -d — detached mode (фон)

#Жизненный цикл контейнера

Created → Running → Paused → Running → Stopped → Removed

Основные команды управления:

# Создание (без запуска) docker create --name my-container nginx # Запуск docker start my-container # Остановка (грациозная) docker stop my-container # Принудительная остановка docker kill my-container # Перезапуск docker restart my-container # Пауза docker pause my-container # Возобновление docker unpause my-container # Удаление docker rm my-container

#Когда использовать контейнеры?

#Идеальные сценарии

✅ Микросервисная архитектура — каждый сервис в своём контейнере

✅ CI/CD — одинаковая среда на всех этапах пайплайна

✅ Быстрое масштабирование — запуск сотен экземпляров за секунды

✅ Разработка — изоляция зависимостей разных проектов

✅ Cloud-native приложения — контейнеры — стандарт для облаков

#Когда контейнеры не подходят

❌ Требование полной изоляции — используйте VM

❌ Разные операционные системы — нужно ядро Linux

❌ Монолитные legacy-приложения — может быть проще оставить как есть

❌ Приложения с интенсивным I/O — накладные расходы могут быть заметны

#🧪 Лабораторные работы

#Lab 1.1: Запуск первого контейнера

Цель: Научиться запускать и останавливать контейнеры.

Задание:

  1. Запустите контейнер с nginx в фоновом режиме
  2. Проверьте, что он работает
  3. Откройте браузер и перейдите по адресу http://localhost:8080
  4. Остановите и удалите контейнер
# Запуск docker run -d --name my-nginx -p 8080:80 nginx:latest # Проверка docker ps docker logs my-nginx # Проверка в браузере или через curl curl http://localhost:8080 # Остановка и удаление docker stop my-nginx docker rm my-nginx

Ожидаемый результат: Вы видите приветственную страницу nginx.


#Lab 1.2: Интерактивный контейнер

Цель: Научиться работать с интерактивными контейнерами.

Задание:

  1. Запустите контейнер Ubuntu в интерактивном режиме
  2. Установите пакет curl внутри контейнера
  3. Проверьте доступность внешнего ресурса
  4. Выйдите из контейнера
# Запуск интерактивного контейнера docker run -it ubuntu:22.04 bash # Внутри контейнера: apt update apt install -y curl curl https://example.com exit

Ожидаемый результат: Вы успешно установили пакет и проверили доступ к интернету.


#Lab 1.3: Ограничение ресурсов

Цель: Научиться ограничивать ресурсы контейнера.

Задание:

  1. Запустите контейнер с ограничением памяти 256 МБ
  2. Запустите стресс-тест внутри контейнера
  3. Проверьте, что контейнер был убит при превышении лимита
# Запуск с ограничением памяти docker run -d --name limited --memory=256m --cpus=0.5 nginx # Проверка использования ресурсов docker stats limited # Попытка потребить много памяти (внутри контейнера) docker exec -it limited bash # Внутри: apt update && apt install -y stress-ng # stress-ng --vm 2 --vm-bytes 200M --timeout 10s # Проверка логов docker logs limited docker inspect limited --format='{{.State.OOMKilled}}'

Ожидаемый результат: Контейнер был остановлен OOM killer при превышении лимита памяти.


#Lab 1.4: Исследование namespaces

Цель: Понять изоляцию процессов в контейнерах.

Задание:

  1. Запустите контейнер и посмотрите список процессов внутри
  2. Сравните с процессами на хосте
  3. Обратите внимание, что PID 1 внутри контейнера — это не PID 1 на хосте
# Запуск контейнера docker run -d --name pid-test alpine sleep 1000 # Процессы внутри контейнера docker exec pid-test ps aux # Процессы на хосте (сравните PID) docker top pid-test # Проверка namespace docker inspect pid-test --format='{{.State.Pid}}' # Используйте PID из вывода для проверки namespace на хосте

Ожидаемый результат: Вы увидите, что процессы внутри контейнера изолированы и имеют свои PID.


#Lab 1.5: Copy-on-Write на практике

Цель: Понять, как работает слоистая файловая система.

Задание:

  1. Создайте файл внутри контейнера
  2. Удалите контейнер и создайте новый из того же образа
  3. Убедитесь, что файл не сохранился
# Запуск и создание файла docker run -it --name cow-test alpine sh echo "Hello from container" > /tmp/test.txt cat /tmp/test.txt exit # Проверка, что файл был только в этом контейнере docker run -it --name cow-test-2 alpine sh cat /tmp/test.txt # Файл не существует! exit # Очистка docker rm cow-test cow-test-2

Ожидаемый результат: Файл существовал только в первом контейнере, так как записываемый слой уникален для каждого контейнера.


#Чеклист выполнения лабораторных

  • Lab 1.1: Контейнер запущен, nginx доступен по порту 8080
  • Lab 1.2: Установлен curl, выполнен запрос к external ресурсу
  • Lab 1.3: Контейнер остановлен с OOMKilled=true
  • Lab 1.4: Поняли разницу между PID внутри и снаружи контейнера
  • Lab 1.5: Файл не сохранился после пересоздания контейнера

Далее: Работа с образами