1. Описание Docker и его роли
Docker — это платформа с открытым исходным кодом, которая позволяет автоматизировать развертывание приложений в контейнерах.
Проект Docker родился как внутренняя разработка компании dotCloud, основанной Соломоном Хайксом в 2008 году для создания публичной платформы PaaS с поддержкой разных языков программирования. Вместе с Хайксом над проектом работали Андреа Лудзарди и Франсуа-Ксавье Бурле. В марте 2013 года код Docker был открыт под лицензией Apache 2.0, а в июне компанию возглавил Бен Голуб, ранее занимавший руководящую должность в GlusterFS. Октябрь 2013 года стал поворотным моментом: dotCloud переименовалась в Docker, подчеркнув смену фокуса на новую технологию, а PaaS-платформа сохранила название dotCloud.
В том же году Docker вошел в OpenStack Havana и Red Hat Enterprise Linux версии 6.5. Позднее он был включен и в Fedora 20, а также получил поддержку в Google Compute Engine. В 2014 году начались работы по интеграции Docker с Hadoop, где он показал превосходство над KVM в производительности на ключевых операциях. С 2017 года помимо открытой версии Docker выпускается коммерческая редакция для организаций.
Основные роли Docker
- Изоляция приложений. Контейнеры изолируют приложения друг от друга и от хост-системы, создавая свое собственное окружение. Это предотвращает конфликты зависимостей, где одна библиотека может быть совместима только с одной версией Python. Также контейнеры защищают хост-систему от потенциальных вредоносных действий или сбоев в работающем приложении.
- Портативность. Одним из ключевых преимуществ Docker является портативность. Приложение, упакованное в контейнер, легко переносится на разные платформы (Linux, Windows, macOS) без изменений кода. Это означает, что разработчики могут писать код один раз и запускать его на любой платформе с установленным Docker Engine.
- Автоматизация. Docker упрощает весь жизненный цикл приложения, от разработки до развертывания и масштабирования. Он автоматизирует процессы сборки, тестирования, упаковки в контейнеры и запуска приложений.
- Масштабируемость. Docker позволяет легко масштабировать приложения, увеличивая или уменьшая количество запущенных контейнеров в зависимости от нагрузки.
Пример. Представьте, что вы создали телеграм-бота, который отвечает на вопросы пользователей с помощью нейросети и работает в связке с движком Ollama. Бота использовало несколько десятков человек, но в какой-то момент их стало в разы больше — новый тренд, популярная новость или активное обсуждение темы, связанной с ботом.
В обычных условиях ваш сервер может просто не справиться с такой нагрузкой, что приведет к медленной работе бота или его полному зависанию. Но если вы используете Docker, у вас есть возможность быстро и эффективно масштабировать систему.
Вы можете создать Docker-образы для вашего бота с необходимыми инстансами Ollama и построить логику работы так, чтобы, когда количество запросов превышает определенный порог, Docker автоматически запускал новые контейнеры с Ollama, обеспечивая плавную работу бота даже в условиях резкого скачка нагрузки. После того как нагрузка снизится, Docker удалит лишние контейнеры, чтобы сэкономить ресурсы.
Иначе говоря, в данном примере Docker позволил быстро адаптироваться к увеличению пользователей и предоставить стабильную и быструю работу вашего телеграм-бота, причем независимо от масштаба нагрузки.
2. Что такое контейнеры и их состояния?
Контейнер — это виртуальная среда, которая содержит все необходимое для работы приложения: код, библиотеки, системные зависимости и т. д. Его можно представить как аналог виртуальной машины, только не перегруженной системными библиотеками и ядром операционной системы. Docker Engine использует операционные системы — хосты (например Ubuntu) для создания и запуска контейнеров.
Каждый контейнер выполняется в собственном пространстве пользователя и имеет свою файловую систему, процессы и ресурсы.
Основные состояния контейнера:
- Запущенный. Контейнер активно выполняет задачи. Вы можете взаимодействовать с ним через терминал или порты.
- Остановленный. Контейнер не выполняет задачи, но все его данные сохраняются. Он может быть легко перезапущен.
- Удаленный. Контейнер завершил работу (либо успешно, либо неудачно) и был удален с системы.
- Неудачный. Контейнер завершил работу неудачно из-за ошибок в коде или системных проблем.
3. Почему важно знать, какие контейнеры запущены?
Контроль состояния контейнеров является одним из ключевых элементов управления Docker, он обеспечивает надежную работу и безопасность всего окружения.
Мониторинг ресурсов, потребляемых запущенными контейнерами, играет важнейшую роль в этом процессе. Процессорное время, память и место на диске — ресурсы, которые могут быть исчерпаны контейнерами при интенсивной работе. Отслеживание их использования позволяет вовремя заметить перегрузку системы и принять меры для ее предотвращения, гарантируя стабильность работы всего окружения Docker.
Кроме того, контроль состояния контейнеров необходим для эффективного отладки и устранения неполадок. Если приложение работает некорректно, необходимо проверить состояние его контейнера, чтобы понять причину сбоя и принять соответствующие меры. Быстрота и точность диагностики напрямую зависят от возможности мониторить состояние каждого контейнера.
Контроль состояния контейнеров также повышает уровень безопасности всей системы. Отключение ненужных контейнеров минимизирует количество потенциальных целей для атак, снижая общую уязвимость системы к вредоносным программам и злоумышленникам. Это особенно важно в средах с высокой конфиденциальностью данных, где безопасность является приоритетом.
4. Обзор командной строки Docker для начинающих
Docker CLI (командная строка) — это мощный инструмент для управления всеми аспектами Docker: контейнерами, образами и сетями. Вы всегда можете посмотреть доступные вам команды, набрав docker --help в командной строке.
Основные команды Docker
Команда | Описание |
docker images | Показывает список всех доступных образов Docker на вашем хосте. Это все образы, которые вы скачали и запустили на вашей машине и которые не были физически удалены с нее. |
docker run | Запускает новый контейнер из образа. C ключом -d запускает контейнер под управление демона Docker. |
docker ps | Показывает список запущенных контейнеров. С ключом -a может показать также и остановленные контейнеры. |
docker stop | Останавливает контейнер. |
docker start | Запускает остановленный контейнер. |
docker kill | Немедленно останавливает контейнер (не сохраняет состояние). |
docker rm | Удаляет контейнер (но не удаляет данные, поэтому контейнер можно снова запустить командой run). |
docker pause | Приостанавливает работу контейнера (не полностью останавливает, но приостанавливает выполнение). |
docker unpause | Возобновляет приостановленный контейнер. |
docker top | Показывает информацию о процессах, запущенных внутри контейнера. |
docker search | Запускает поиск образов в Docker Hub. |
docker network create | Создает новую сеть Docker. |
5. Команды для просмотра запущенных контейнеров
Предположим, что у нас запущено несколько контейнеров под хост-системой на Ubuntu 22.04. Зайдя в командную строку (локально или удаленно через SSH или HTML5-консоль), вы можете посмотреть запущенные на хост-системе контейнеры Docker:
docker ps. Показывает информацию о всех запущенных контейнерах.
bash
docker ps -a. Показывает информацию о всех контейнерах (запущенных и остановленных). Остановленные контейнеры можно запустить командой docker start.
Поле STATUS в выводе команд docker ps (docker ps -a) отображает текущее состояние контейнера.
Вот наиболее распространенные значения, которые вы можете увидеть:
- Up. Контейнер запущен и работает исправно. Показывает время его работы с момента запуска.
- Exited. Контейнер завершил работу. Код выхода контейнера (0 обычно означает успешное завершение).
- Created. Контейнер создан, но еще не запущен.
- Pending. Контейнер ожидает запуска. Это может быть вызвано недостатком ресурсов или другими проблемами.
- Stopping. Контейнер в данный момент останавливается.
- Restarting. Процесс перезапуска контейнера.
Поле STATUS предоставляет краткий, но важный обзор состояния вашего контейнера, что помогает понять, как он работает, и реагировать на любые проблемы.