Что такое Docker
Содержание
Docker — это технология, которая позволяет создавать и использовать приложения в «родном» окружении. В основе Docker лежит идея: если приложение работает у вас, то оно должно работать где угодно. Способ этого добиться очень простой — нужно упаковать настройки окружения вместе с приложением.
Docker чаще всего применяется для развёртывания серверных приложений, но может использоваться и в мире фронтенда для:
- сборки бандлов;
- статического анализа кода;
- тестирования приложений;
- подготовки ресурсов (картинок, шрифтов, иконок и пр.);
- воспроизводимых экспериментов с новыми технологиями и демок;
- настройки инфраструктуры разработчика (редактора кода, платформы, пакетных менеджеров, линтеров и прочего).
Установка Docker
Установите Docker:
- Windows — Docker Desktop for Windows
- macOS — Docker Desktop for Mac
- Linux — в зависимости от версии: CentOS, Debian, Fedora, Raspbian, Ubuntu.
Запустите Docker и проверьте его работоспособность с помощью графического интерфейса Dashboard (для Mac или Windows) или команды в терминале (для всех операционных систем):
docker --version
У создателей Docker есть готовая демка, которую можно запустить командой:
docker run -d -p 80:80 docker/getting-started
Теперь можно открыть в браузере документацию Docker по адресу http://localhost.
Представьте, что вы передали проект другому разработчику, и вам не приходится возиться с тем, чтобы проект запускался, не приходится говорить: «А у меня все работало»
Без Docker вы, скорее всего, действовали бы так:
- Узнали операционную систему на компьютере разработчика.
- Сформировали сценарий или инструкцию настройки окружения.
- Протестировали, как развёртывается ваше приложение.
- Передали приложение разработчику, и ждали результаты.
Ситуация будет ещё сложнее, если вы и другой разработчик используете разные операционные системы. С Docker все намного проще! Вы создаёте конфигурацию, и если она работает у вас, то заработает у всех.
Docker упаковывает приложение так, что будет счастлив любой, кто его получит.
Давайте разберёмся, как это происходит. Что должен делать Docker с вашим приложением, какое окружение он должен подготовить?
Рассмотрим пример с демкой от создателей Docker. Когда вы выполнили команду docker run, произошло следующее:
- Docker нашёл и загрузил приложение с именем docker/getting-started из реестра приложений Docker Hub. Приложение уже было заботливо упаковано со всеми необходимыми ему утилитами и программами. Такая упаковка называется образ (Docker Image). Образ обычно содержит в себе операционную систему на базе Linux, стартовую конфигурацию для установки служб, утилит, приложений, зависимостей проекта — все это называется окружением приложения.
- Docker создал контейнер (Docker Container) на основе образа. Контейнер — это конкретный экземпляр образа на вашем компьютере. Отношение «образ — контейнер» примерно такое же, как у пары «класс — объект класса» в ООП.
- Docker запустил контейнер с веб-сервером Nginx внутри, и веб-приложение «Справка по Docker» заработало. Для вашей операционной системы запустить контейнер — это все равно что запустить любое приложение или сервис.
Вы просто начали использовать веб-приложение, никаких сложностей.
Перед тем, как мы научимся готовить образ сами, необходимо разобраться с терминами.
Важные службы
Движок Docker Engine — приложение для управления объектами Docker включает в себя три компонента:
- сервер (Docker Daemon);
- интерфейс (Docker API);
- консольный клиент (Docker CLI).
Ваш компьютер называется Docker Host. Все операции, которые мы выполняем в интерфейсе или через консоль, выполняются сервером через API движка.
Docker Desktop — пакет приложений с графическим интерфейсом, включающий специальную виртуальную машину для работы с движком, визуальный интерфейс (Dashboard), консольный клиент, инструменты для работы с реестром Docker Hub и пр.
Для платформы Mac и Windows невозможно использовать Docker Engine напрямую, необходимо запустить виртуальную машину. Docker Desktop содержит такую виртуальную машину. Все процессы в ней оптимизированы, контейнеры работают быстрее, но определённые ограничения все равно присутствуют.
Объекты Docker
Образ (Docker Image) — прототип будущего контейнера, содержащий операционную систему, приложение или проект для сборки приложения. Образы состоят из слоёв. Каждый новый слой — это надстройка над предыдущим. Слои должны надстраиваться поверх базового образа, формируя новый. Например, базовым образом может быть образ операционной системы.
Слои образа описываются в специальных файлах конфигурации. Как правило, для этого используется Dockerfile. Конфигурационный файл всегда начинается с указания базового образа, имя которого прописывается после директивы FROM. Дальше могут идти разные надстройки (новые слои) образа.
Вы можете задать рабочую папку проекта с помощью директивы WORKDIR, скопировать файлы в эту рабочую папку директивой COPY, запустить выполнение команды или нескольких команд в терминале директивой RUN.
Пример конфигурации:
FROM ubuntu:18.04 WORKDIR /app COPY . . RUN apt-get update && apt-get upgrade
Контейнер (Docker Container) — уже собранное и запущенное приложение в изолированном окружении, которое формируется послойно, в соответствии с образом. Каждый новый слой расширяет функциональность предыдущего, формируя стек используемых инструментов, платформ и настроек системных служб. Файловая система контейнера тоже стековая (Union File Systems). Каталоги и файлы отдельного слоя образа накладываются друг на друга, образуя единое целое.
Том (Docker Volume) — папка, которую можно подключить (говорят «примонтировать») к контейнерам. Папка может быть связана с конкретной папкой на вашем компьютере, а может быть как бы сетевой для контейнеров на вашем компьютере.
Тома необходимы для хранения файлов конфигурации, критических с точки зрения безопасности, файлов баз данных, файлов, которые нельзя удалять после окончания работы приложения.
Сеть (Docker Network) — виртуальная локальная сеть, которая позволяет совместно использовать несколько запущенных контейнеров и соединять запущенный контейнер с вашим компьютером. В основном вы будете использовать три режима работы сетевой инфраструктуры Docker:
- bridge — когда контейнеры могут взаимодействовать между собой как веб-сервер и база данных.
- host — для доступа к локальному сетевому окружению на вашем компьютере.
- none — сеть для контейнеров полностью отключена.
Инструменты
Docker Hub (реестр) — официальный реестр образов.
Опубликованные образы хранятся в Docker Hub. Существуют и другие публичные реестры образов:
- Yandex Container Registry
- Google Cloud Container Registry
- Azure Container Registry
- IBM Cloud Container Registry
- Oracle Cloud Infrastructure Container Registry
Предпочитайте официальные образы Docker, которые обновляются самой компанией. Они относительно безопасны. Для фронтенд - разработчика могут быть интересны:
Docker CLI — консольный клиент, позволяющий управлять Docker через интерфейс командной строки.
Консольный клиент содержит команды для управления объектами Docker. Список основных команд:
Как пользоваться
Ключи командного интерфейса Docker CLI хорошо проработаны и похожи на консольные команды в bash. Например, дополнительный ключ prune позволяет удалять неиспользуемые объекты. Ключ rm служит для удаления, а ключ ls для просмотра объектов.
Объекты Docker в обязательном порядке имеют уникальное имя. Если вы не именуете объект специально, то имя объекта формируется с помощью хэш-функции. Если вы попытаетесь создать объект одного и того же типа с уже использованным именем, в этом вам будет отказано.
Мониторинг контейнеров
- docker ps — просмотр запущенных контейнеров.
- docker ps -a — ключ -a выводит и запущенные, и остановленные контейнеры.
- docker ps -s — ключ -s выводит дисковое пространство, используемое каждым запущенным контейнером.
- docker ps -f name=hello — ключ -f фильтрует список контейнеров по имени, например, hello.
Полный список ключей для команды docker ps доступен в документации.
Запуск контейнеров
Для запуска контейнера, который доступен локально или на Docker Hub, выполните команду:
docker run --name test -i -t hello
Ключ --name используется для установки имени запущенного контейнера. Ключи -i и -t указывают, что для запуска контейнера будет использоваться стандартный поток ввода и терминал TTY соответственно.
Полный список ключей для команды docker run доступен в документации.
Управление образами
Вы можете получить список всех доступных локально образов с помощью команды:
docker image ls
Ключи prune, rm действуют обычным способом, позволяя удалить неиспользуемые или конкретные образы соответственно. Для работы с реестром необходимо использовать следующие команды:
- docker image pull hello — загрузка образа с именем hello из реестра;
- docker image push hello — отправка образа с именем hello в реестр;
- docker image inspect hello — полная информация о контейнере hello;
- docker image build — собрать контейнер из текущей папки с учётом Dockerfile.
Полный список ключей для команды docker image доступен в документации.
Управление контейнерами
Наиболее используемыми командами будут команды запуска и остановки контейнеров.
Команда для запуска контейнера:
docker container start
Команда для перезапуска контейнера:
docker container restart
Команда для остановки контейнера:
docker container stop
Команда для постановки контейнера на паузу:
docker container pause
Полный список ключей для команды docker container доступен в документации.
Управление томами
- docker volume ls — вывод всех томов.
- docker volume ls -f name=hello — вывод всех томов с фильтрацией по имени, например, hello.
- docker volume create hello — создание нового тома, например, hello.
- docker volume inspect hello — исчерпывающая информация о томе.
Полный список ключей для команды docker volume доступен в документации.
Источник: doka.guide