Основы Docker: Полное погружение в контейнеризацию

Практический курс для изучения Docker с нуля. Вы научитесь упаковывать приложения в контейнеры, управлять ими, настраивать сети и хранилища данных, а также использовать Docker Compose для сложных проектов.

1. Введение в Docker: архитектура, установка и отличие от виртуальных машин

Введение в Docker: архитектура, установка и отличие от виртуальных машин

Добро пожаловать в курс «Основы Docker: Полное погружение в контейнеризацию». Мы начинаем наше путешествие с фундаментальных понятий. Если вы когда-либо слышали фразу «но на моем компьютере это работает», то вы уже понимаете, какую главную проблему решает Docker.

В этой статье мы разберем, что такое контейнеризация, чем она отличается от классической виртуализации, из чего состоит Docker и как запустить ваш первый контейнер.

Проблема «Works on my machine»

До появления контейнеров процесс доставки программного обеспечения был настоящей головной болью. Разработчик писал код в одной среде (например, macOS с определенными версиями библиотек), тестировщик проверял его в другой, а на боевом сервере (Production) стояла третья операционная система.

Результат? Конфликты зависимостей, разные версии языков программирования и бесконечные часы отладки среды, а не самого кода. Docker решил эту проблему, упаковав приложение и все его зависимости в единый стандартный блок — контейнер.

> Docker — это открытая платформа для разработки, доставки и запуска приложений. Docker позволяет отделить ваше приложение от инфраструктуры, чтобы вы могли быстро доставлять программное обеспечение. > Обзор Docker на docs.docker.com

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

Чтобы понять революционность Docker, нужно сравнить его с технологией, которая доминировала ранее — виртуальными машинами (VM).

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

Виртуализация работает за счет гипервизора (Hypervisor). Это программное обеспечение, которое позволяет запускать несколько операционных систем (Guest OS) на одном физическом сервере (Host OS). Каждая виртуальная машина содержит:

  • Собственное ядро операционной системы.
  • Виртуализированное оборудование (процессор, память, сетевая карта).
  • Библиотеки и само приложение.
  • Это надежно, но очень «тяжело». Каждая VM может занимать гигабайты места и требовать минуты на загрузку.

    Контейнеры Docker

    Контейнеры работают иначе. Вместо виртуализации всего «железа» и установки отдельной ОС, они используют ядро хостовой операционной системы.

    !Сравнение архитектуры: Виртуальные машины (слева) против Контейнеров (справа)

    Главное отличие: контейнеры — это изолированные процессы в пространстве пользователя, которые делят ядро ОС, но имеют свою файловую систему.

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

    | Характеристика | Виртуальные машины (VM) | Контейнеры (Docker) | | :--- | :--- | :--- | | Изоляция | Полная (на уровне ОС) | На уровне процессов | | Размер | Гигабайты (GB) | Мегабайты (MB) | | Скорость запуска | Минуты | Миллисекунды/Секунды | | Потребление ресурсов | Высокое (дублирование ОС) | Низкое (общее ядро) | | Переносимость | Ограниченная | Высокая (Write once, run anywhere) |

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

    Docker использует клиент-серверную архитектуру. Понимание этих компонентов критически важно для дальнейшей работы.

    !Схема взаимодействия компонентов Docker: Клиент, Хост и Реестр

    Основные компоненты

  • Docker Daemon (dockerd)
  • Это «мозг» системы. Фоновый процесс, работающий на хост-машине. Он управляет объектами Docker (образами, контейнерами, сетями, томами) и обрабатывает запросы от клиента.

  • Docker Client (docker)
  • Это то, с чем вы взаимодействуете в терминале. Когда вы пишете команду docker run, клиент отправляет запрос демону через REST API.

  • Docker Registry (Реестр)
  • Это хранилище образов. Самый известный публичный реестр — Docker Hub. Это как GitHub, но для скомпилированных пакетов приложений. Вы можете настроить и свой приватный реестр.

    Ключевые понятия: Образ и Контейнер

    Новички часто путают эти два понятия. Давайте разберем их на аналогии.

    Образ (Image) — это класс в программировании или чертеж* здания. Это неизменяемый шаблон, содержащий код, библиотеки, переменные среды и конфигурационные файлы. Образ нельзя запустить, он просто лежит на диске. Контейнер (Container) — это объект класса или построенный дом*. Это запущенный экземпляр образа. Вы можете запустить сколько угодно контейнеров из одного образа. Контейнеры можно создавать, запускать, останавливать и удалять.

    Установка Docker

    Процесс установки зависит от вашей операционной системы. Docker предоставляет удобные инструменты для всех популярных платформ.

    Windows и macOS

    Для этих систем используется Docker Desktop. Это комплексное приложение, которое включает в себя Docker Engine, Docker CLI, Docker Compose и графический интерфейс.

  • Перейдите на официальную страницу загрузки: Docker Desktop.
  • Скачайте установочный файл для вашей архитектуры (Intel или Apple Silicon для Mac).
  • Установите приложение, следуя инструкциям мастера установки.
  • Запустите Docker Desktop и дождитесь, пока статус внизу окна не станет зеленым (Engine running).
  • Linux (Ubuntu/Debian)

    На Linux Docker работает нативно, без лишних прослоек виртуализации. Рекомендуется устанавливать Docker Engine через официальный репозиторий, а не через стандартные пакетные менеджеры дистрибутива (там часто старые версии).

    Пример команд для установки (упрощенно):

    Полную инструкцию для Linux всегда берите из официальной документации, так как она может меняться.

    Ваш первый запуск: Hello World

    Давайте проверим, что все работает корректно. Откройте терминал (PowerShell, Terminal или Bash) и введите следующую команду:

    Если вы видите сообщение, начинающееся со слов "Hello from Docker!", поздравляю — вы успешно установили Docker.

    Что произошло «под капотом»?

    Когда вы ввели эту команду, Docker Daemon выполнил следующие шаги:

  • Проверка: Демон проверил, есть ли образ hello-world у вас на компьютере (локально).
  • Загрузка (Pull): Так как это первый запуск, образа не было. Демон скачал его из Docker Hub.
  • Создание: Демон создал новый контейнер из этого образа.
  • Запуск: Демон запустил контейнер, который выполнил простую программу (вывод текста в консоль).
  • Завершение: После вывода текста процесс внутри контейнера завершился, и контейнер остановился.
  • Заключение

    Мы разобрали фундамент технологии Docker. Теперь вы знаете, что контейнеры — это легковесная альтернатива виртуальным машинам, позволяющая упаковать приложение со всеми зависимостями. Вы познакомились с архитектурой (Клиент-Демон-Реестр) и успешно запустили свой первый контейнер.

    В следующей статье мы углубимся в работу с образами: научимся искать их, скачивать и управлять ими через командную строку.

    2. Работа с контейнерами и образами: основные команды CLI и Docker Hub

    Работа с контейнерами и образами: основные команды CLI и Docker Hub

    В предыдущей статье мы успешно установили Docker и запустили наш первый контейнер hello-world. Это было похоже на магию: одна команда, и программа работает. Но чтобы стать профессионалом, нужно понимать, как управлять этой магией.

    Сегодня мы перейдем от простого запуска к осознанному управлению. Мы разберем жизненный цикл контейнеров, научимся искать и скачивать образы из Docker Hub, пробрасывать порты и выполнять команды внутри изолированной среды. Основным нашим инструментом будет CLI (Command Line Interface) — интерфейс командной строки.

    Docker Hub: Супермаркет приложений

    Прежде чем запустить приложение, нам нужен его «чертеж» — образ (Image). Где его взять? Чаще всего образы хранятся в реестрах. Самый популярный публичный реестр — Docker Hub.

    Представьте Docker Hub как App Store или Google Play, но для серверных приложений. Там можно найти официальные образы для Python, Node.js, MySQL, Nginx и тысяч других инструментов.

    Поиск и скачивание образов

    Вы можете искать образы через веб-интерфейс hub.docker.com, но настоящий инженер делает это через терминал.

    Команда для поиска:

    Вы увидите список доступных образов с их описанием, рейтингом (STARS) и пометкой OFFICIAL (официальный образ). Всегда старайтесь использовать официальные образы, так как они поддерживаются разработчиками технологии и проверены на безопасность.

    Чтобы скачать образ на свой компьютер, используется команда pull:

    Понятие тегов (Tags)

    В команде выше мы не указали версию, поэтому Docker по умолчанию скачал версию с тегом latest. Тег — это метка, указывающая на конкретную версию образа.

    Если вам нужна конкретная версия (например, для совместимости), указывайте её через двоеточие:

    В примере выше 3.9 — это версия Python, а alpine — это указание на то, что образ построен на базе сверхлегкой Linux-системы Alpine (размером всего около 5 МБ).

    !Структура полного имени Docker-образа

    Управление образами

    Скачанные образы хранятся в локальном кэше вашего компьютера. Давайте посмотрим, что у нас есть.

    Список образов

    Вывод покажет репозиторий, тег, ID образа, дату создания и размер. Обратите внимание на размер: образы на базе Alpine могут быть в 10 раз меньше стандартных.

    Удаление образов

    Если образ больше не нужен, его стоит удалить, чтобы освободить место на диске. Для этого используется команда rmi (remove image):

    > Важно: Вы не сможете удалить образ, если из него в данный момент запущен или остановлен (но не удален) контейнер. Сначала нужно разобраться с контейнером.

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

    Теперь самое интересное. Контейнер — это запущенный процесс. У него есть свой жизненный цикл: создание, запуск, пауза, остановка и удаление.

    Запуск контейнера: docker run

    Это самая мощная и часто используемая команда. Она объединяет в себе скачивание образа (если его нет), создание контейнера и его запуск.

    Попробуем запустить веб-сервер Nginx:

    Давайте разберем этот набор флагов, так как вы будете использовать их постоянно:

  • -d (Detached mode): Запуск в фоновом режиме. Если не указать этот флаг, контейнер захватит ваш терминал, и вы будете видеть логи сервера, но не сможете вводить команды.
  • --name: Присваивает контейнеру понятное имя (my-web-server). Если это не сделать, Docker придумает смешное имя сам (например, boring_wozniak).
  • -p (Publish ports): Проброс портов. Это критически важная концепция.
  • Проброс портов (Port Mapping)

    Контейнеры изолированы. По умолчанию никто извне не может достучаться до приложения внутри контейнера. Чтобы открыть доступ, мы должны «связать» порт на вашем компьютере (хосте) с портом внутри контейнера.

    Синтаксис: -p <ПОРТ_ХОСТА>:<ПОРТ_КОНТЕЙНЕРА>

    В нашем примере -p 8080:80 означает: * Любой запрос на порт 8080 вашего компьютера... * ...будет перенаправлен на порт 80 внутри контейнера (стандартный порт Nginx).

    !Схема работы проброса портов (Port Mapping)

    Теперь откройте браузер и перейдите по адресу http://localhost:8080. Вы увидите приветственную страницу Nginx. Поздравляю, ваш веб-сервер работает в изоляции!

    Мониторинг и управление состоянием

    Просмотр запущенных контейнеров

    Чтобы узнать, что сейчас работает на вашем компьютере, используйте:

    Эта команда покажет только активные контейнеры. Вы увидите их ID, статус (Up), порты и имена.

    Чтобы увидеть все контейнеры (в том числе остановленные и завершившие работу с ошибкой), добавьте флаг -a (all):

    Остановка и запуск

    Если сервер вам пока не нужен, но вы не хотите удалять его настройки, остановите его:

    Чтобы снова включить:

    Просмотр логов

    Когда что-то идет не так, первое, что нужно сделать — посмотреть логи. Так как мы запустили контейнер в фоновом режиме (-d), логи не видны в консоли. Чтобы их прочитать:

    Можно добавить флаг -f (follow), чтобы следить за логами в реальном времени (как tail -f в Linux).

    Внутри контейнера: Интерактивный режим

    Иногда нужно «войти» внутрь контейнера, чтобы проверить конфигурационные файлы или выполнить отладку. Для этого используется команда exec.

    Разберем флаги: * -i (interactive): Оставляет поток ввода открытым (чтобы вы могли писать команды). * -t (tty): Выделяет псевдо-терминал (чтобы вы видели красивый вывод консоли). * bash: Команда, которую мы хотим запустить внутри (оболочка командной строки).

    После ввода этой команды ваше приглашение терминала изменится (например, на root@a1b2c3d4e5f6:/#). Теперь вы находитесь внутри Linux-системы контейнера. Вы можете использовать ls, cat и другие команды. Чтобы выйти, наберите exit.

    > Примечание: В сверхлегких образах (например, Alpine) может не быть bash. В таких случаях используйте sh: > docker exec -it my-container sh

    Уборка мусора

    При активной работе с Docker у вас будет накапливаться много остановленных контейнеров и неиспользуемых образов. Это занимает место.

    Удаление контейнера

    Остановленный контейнер удаляется командой rm (не путать с rmi для образов!):

    Если контейнер работает, Docker не даст его удалить. Можно использовать флаг -f (force) для принудительного удаления, но лучше сначала остановить его корректно через docker stop.

    Глобальная чистка

    Есть «волшебная» команда, которая удаляет все остановленные контейнеры, неиспользуемые сети и висячие образы одним махом:

    Будьте осторожны с этой командой на боевых серверах, но на локальной машине разработчика она незаменима.

    Шпаргалка по командам

    Давайте подведем итог и соберем основные команды в таблицу для быстрого доступа.

    | Команда | Описание | | :--- | :--- | | docker pull <image> | Скачать образ из реестра | | docker images | Показать список скачанных образов | | docker run -d -p 80:80 <image> | Запустить контейнер в фоне с пробросом портов | | docker ps | Показать запущенные контейнеры | | docker stop <container> | Остановить контейнер | | docker rm <container> | Удалить контейнер | | docker rmi <image> | Удалить образ | | docker exec -it <container> bash | Зайти внутрь контейнера |

    Заключение

    Теперь вы владеете базовым набором инструментов Docker-инженера. Вы умеете находить образы, запускать их, настраивать сетевой доступ и даже заглядывать «под капот» работающего контейнера.

    В следующей статье мы перейдем к одной из самых важных тем — созданию собственных образов. Мы разберем, что такое Dockerfile, как упаковать ваше собственное приложение и поделиться им с миром.