1. Введение в Docker: установка, архитектура и базовые команды управления контейнерами
Введение в Docker: установка, архитектура и базовые команды управления контейнерами
Добро пожаловать на курс «Docker для начинающих: от основ до Python-приложений». Это первая статья, с которой начнется ваше погружение в мир контейнеризации. Если вы когда-либо слышали фразу «на моем компьютере это работает, а на сервере — нет», то вы уже понимаете, какую главную проблему решает Docker.
В этой статье мы разберем, что такое Docker, чем он отличается от виртуальных машин, как устроена его архитектура и научимся управлять контейнерами с помощью базовых команд.
Что такое Docker и зачем он нужен?
Docker — это открытая платформа для разработки, доставки и запуска приложений. Она позволяет отделить ваше приложение от инфраструктуры, чтобы вы могли быстро доставлять программное обеспечение. С Docker вы можете управлять инфраструктурой так же, как управляете своими приложениями.
Главная идея Docker заключается в упаковке приложения и всех его зависимостей (библиотек, конфигурационных файлов, среды исполнения) в единый объект, называемый контейнером. Это гарантирует, что приложение будет работать одинаково везде: на ноутбуке разработчика, на тестовом сервере или в облаке.
Проблема «It works on my machine»
Представьте, что вы пишете приложение на Python. У вас установлена конкретная версия Python (например, 3.9), определенные версии библиотек pandas и flask, а также специфические настройки операционной системы. Вы передаете код коллеге, у которого стоит Python 3.11 и другие версии библиотек. Приложение падает с ошибкой. Docker решает эту проблему, изолируя среду исполнения.
Контейнеры против Виртуальных машин
Чтобы понять суть Docker, важно сравнить его с виртуальными машинами (VM). Оба подхода используются для изоляции приложений, но работают они по-разному.
Архитектура Docker
Docker использует клиент-серверную архитектуру. Понимание этих компонентов критически важно для дальнейшей работы.
!Клиент-серверная архитектура Docker: взаимодействие клиента, демона и реестра образов.
Основные компоненты
dockerd): Это «сердце» Docker. Фоновый процесс, который работает на хост-машине. Он слушает запросы от клиента API и управляет объектами Docker (образами, контейнерами, сетями).docker): Это то, с чем вы взаимодействуете в терминале. Когда вы пишете команду docker run, клиент отправляет запрос демону, который и выполняет работу.Ключевые понятия: Образ и Контейнер
Новички часто путают эти два понятия. Давайте проведем аналогию с кулинарией или программированием.
Образ (Image): Это шаблон или класс* в программировании. Это неизменяемый файл, содержащий исходный код, библиотеки, зависимости и инструменты, необходимые для запуска приложения. Образ — это то, что вы скачиваете или собираете. Контейнер (Container): Это запущенный экземпляр образа или объект* класса. Это живой процесс. Вы можете запустить множество контейнеров из одного и того же образа.
> Образ — это рецепт торта. Контейнер — это сам испеченный торт. Вы можете испечь сколько угодно тортов по одному рецепту.
Установка Docker
Процесс установки зависит от вашей операционной системы. Мы не будем дублировать документацию, так как она обновляется, но дадим основные направления.
После установки откройте терминал (или PowerShell) и введите команду для проверки версии:
Если вы видите номер версии, значит, установка прошла успешно.
Базовые команды управления
Теперь перейдем к практике. Мы научимся скачивать образы, запускать контейнеры и управлять ими.
1. Запуск первого контейнера
Традиционно начнем с «Hello World». Введите в терминале:
Что произошло?
hello-world у вас локально.2. Работа с образами
Чтобы скачать образ без запуска, используется команда pull. Давайте скачаем официальный образ веб-сервера Nginx:
Чтобы посмотреть список всех скачанных образов на вашем компьютере:
Вы увидите таблицу с репозиторием, тегом (версией), ID образа и его размером.
3. Запуск контейнера в фоновом режиме
Если мы запустим Nginx просто командой docker run nginx, он захватит терминал, и мы не сможем вводить другие команды. Для серверных приложений обычно используется флаг -d (detach — отсоединить), чтобы запустить контейнер в фоне.
Также нам нужно получить доступ к веб-серверу. Контейнеры изолированы, поэтому нам нужно «пробросить» порт из контейнера наружу. Для этого используется флаг -p.
Команда будет выглядеть так:
Разберем аргументы:
* -d: Запуск в фоновом режиме.
* -p 8080:80: Перенаправление порта. Порт 8080 на вашем компьютере (host) будет вести на порт 80 внутри контейнера.
* --name my-web-server: Мы дали контейнеру понятное имя, иначе Docker придумает случайное (например, vigorous_newton).
* nginx: Имя образа.
Теперь откройте браузер и перейдите по адресу http://localhost:8080. Вы увидите приветственную страницу Nginx.
4. Просмотр запущенных контейнеров
Чтобы узнать, какие контейнеры работают прямо сейчас, используйте команду:
Если вы хотите увидеть все контейнеры, включая те, что были остановлены (например, наш hello-world), добавьте флаг -a:
5. Остановка и удаление
Чтобы остановить работающий контейнер, используйте команду stop и имя (или ID) контейнера:
Теперь контейнер остановлен, но он все еще существует (занимает место на диске). Чтобы удалить его окончательно, используйте rm:
Важно: Вы не можете удалить запущенный контейнер командой rm без предварительной остановки (если не использовать флаг -f для принудительного удаления, что не рекомендуется делать без необходимости).
Если вы хотите удалить сам образ (рецепт), используйте команду rmi (remove image):
Жизненный цикл контейнера
Понимание состояний контейнера поможет вам в отладке.
!Жизненный цикл контейнера: от создания до удаления.
* Created: Контейнер создан, но не запущен. * Running: Процесс внутри контейнера работает. * Paused: Все процессы контейнера приостановлены. * Exited (Stopped): Процесс завершился или был остановлен. * Dead: Контейнер неработоспособен (встречается редко).
Заключение
В этой статье мы познакомились с фундаментом Docker. Мы узнали, что контейнеры — это легковесная альтернатива виртуальным машинам, использующая ядро хостовой системы. Мы разобрали архитектуру (клиент, демон, реестр) и научились выполнять базовые операции: скачивать образы, запускать, останавливать и удалять контейнеры.
В следующих статьях мы углубимся в создание собственных образов с помощью Dockerfile и научимся упаковывать Python-приложения, чтобы они работали идеально на любой машине.