Что такое контейнеры, чем они отличаются от виртуальных машин, архитектура Docker
Контейнеры изменили способ развёртывания приложений. Узнайте, как они работают и почему стали стандартом индустрии.
Контейнеризация — это технология упаковки приложения вместе со всеми его зависимостями (библиотеками, конфигурационными файлами, переменными окружения) в изолированную среду выполнения — контейнер.
Контейнер запускается как обычный процесс в операционной системе, но имеет собственное изолированное пространство:
Это первый вопрос, который возникает у новичков. Давайте разберёмся.
Виртуальные машины используют гипервизор (VirtualBox, VMware, Hyper-V) для эмуляции полноценного компьютера. Каждая VM включает:

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

Преимущества контейнеров:
Недостатки контейнеров:
| Характеристика | Виртуальные машины | Контейнеры |
|---|---|---|
| Размер | ГБ | МБ |
| Запуск | Минуты | Секунды |
| Изоляция | Полная | Процессная |
| Производительность | Ниже | Выше |
| Разные ОС | Да | Нет |
Docker — самая популярная платформа для работы с контейнерами. Разберём её компоненты.
Docker Engine — это клиент-серверное приложение, состоящее из:
Docker Daemon (dockerd) — фоновый процесс, который управляет образами, контейнерами, сетями и хранилищами.
REST API — интерфейс для взаимодействия с демоном.
Docker CLI — командная строка (docker), которую используют люди.

Проверьте установку Docker:
docker --version
# Docker version 24.0.7, build afdd53b
docker run hello-world
# Загружает тестовый образ и запускает контейнерОбраз — это неизменяемый шаблон для создания контейнеров. Можно сравнить с классом в ООП.
# Загрузить образ из реестра
docker pull nginx:latest
# Посмотреть локальные образы
docker imagesКонтейнер — это запущенный экземпляр образа. Аналогия: объект — экземпляр класса.
# Запустить контейнер
docker run -d --name my-nginx -p 8080:80 nginx
# Посмотреть запущенные контейнеры
docker ps
# Остановить контейнер
docker stop my-nginxРеестр — хранилище образов. Docker Hub — публичный реестр по умолчанию.
# Поиск образов
docker search python
# Загрузка из реестра
docker pull python:3.11-slimКонтейнеры используют возможности ядра Linux:
Namespaces обеспечивают изоляцию ресурсов:
Каждый контейнер работает в своём namespace и «не видит» процессы других контейнеров.
Cgroups ограничивают использование ресурсов:
# Запуск с ограничением ресурсов
docker run --memory=512m --cpus=1.5 nginxUnion FS позволяет создавать слоистые файловые системы. Каждый образ состоит из слоёв:

При изменении файла в контейнере он копируется в верхний слой (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 — накладные расходы могут быть заметны
Цель: Научиться запускать и останавливать контейнеры.
Задание:
http://localhost:8080# Запуск
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.
Цель: Научиться работать с интерактивными контейнерами.
Задание:
curl внутри контейнера# Запуск интерактивного контейнера
docker run -it ubuntu:22.04 bash
# Внутри контейнера:
apt update
apt install -y curl
curl https://example.com
exitОжидаемый результат: Вы успешно установили пакет и проверили доступ к интернету.
Цель: Научиться ограничивать ресурсы контейнера.
Задание:
# Запуск с ограничением памяти
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 при превышении лимита памяти.
Цель: Понять изоляцию процессов в контейнерах.
Задание:
# Запуск контейнера
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.
Цель: Понять, как работает слоистая файловая система.
Задание:
# Запуск и создание файла
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Ожидаемый результат: Файл существовал только в первом контейнере, так как записываемый слой уникален для каждого контейнера.
В следующей теме вы научитесь работать с Docker-образами: искать, загружать, создавать свои и публиковать в реестре.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.