Docker
Last updated
Last updated
Для Linux, чтобы каждый раз не нужно было писать sudo.
И дальше требуется перезагрузить компьютер или перелогиниться, чтобы изменения вступили в силу.
Если требуется, чтобы Docker daemon автоматически загружался при старте операционной системы нужно указать это в настройках (systemd).
Для отключения этого.
Для проверки работы Docker.
И после этого должен отображаться контейнер hello-world.
Дальше этот образ не требуется, поэтому его можно удалять.
host
— операционная система, на которую устанавливают Docker и на которой он работает.
daemon
— служба, которая управляет Docker-объектами: сетями, хранилищами, образами и контейнерами.
client
— консольный клиент, при помощи которого пользователь взаимодействует с Docker daemon и отправляет ему команды.
image
— это неизменяемый образ, из которого разворачивается контейнер.
container
— развёрнутое и запущенное приложение.
volumes
- тома для постоянного хранения информации.
registry
— репозиторий, в котором хранятся образы.
Docker Hub
- Популярный публичный репозиторий, используемый по умолчанию в Docker.
Dockerfile
— файл-инструкция для сборки образа.
Docker Compose
— инструмент для управления несколькими контейнерами. Он позволяет создавать контейнеры и задавать их конфигурацию.
Docker Desktop
— Это GUI-клиент, который отображает все сущности Docker. Работает на Linux, macOS и Windows.
Команда для клонирования образа.
По стандарту будет скачиваться latest версия, но через двоеточие можно указать версию image.
Склонированный образ является неизменяемым.
Примеры:
Клонирование образа nginx.
Клонирование образа debian.
Для поиска образа используется команда search
. Она будет выводить все найденные варианты с Docker Hub.
Примеры:
Поиск образов для debian.
Команда docker ps
показывает все запущенные контейнеры.
Опции:
a
- показать все контейнеры, даже остановленные.
s
- показать размер контейнера.
q
- показать только id контейнера.
Примеры:
Показать запущенные контейнеры.
Показать все контейнеры.
Показать все контейнеры и их размер.
Вывести id запущенных контейнеров.
Для просмотра логов, которые отдаёт контейнер есть атрибут logs
.
Сборка всего проекта в один контейнер.
Опции.
-t / --tag
- тег для контейнера.
-f / --file
- путь до Dockerfile.
--squash
- все слои будут соединены в один.
Точка в конце указывает текущую директорию как место сборки. Также можно указать путь до директории.
Примеры:
Сборка контейнера с именем.
Сборка контейнера из определённого Dockerfile.
inspect
- позволяет просмотреть низкоуровневую информацию о различных объектах в docker.
Примеры:
Просмотреть данные контейнера.
Просмотреть данные образа.
Просмотреть данные network.
Просмотреть данные volume.
Для просмотра существующих образов.
Изначальный запуск контейнера. Если образ никогда не был установлен, то сначала Docker скачает образ, а потом запустит его.
Для работы внутри контейнера требуется указать флаги -it
(-i interactive, -t - tty).
Для старта работы контейнера в фоновом режиме нужно использовать флаг -d
(-d - detach).
При обычном запуске генерируется рандомное имя контейнера. Для того, чтобы дать самостоятельно имя требуется использовать флаг --name
.
Для того, чтобы контейнеры взаимодействовали с основной машиной, нужно установить им порты, по которым они будут взаимодействовать. Для этого используется флаг -p
, и после этого указывается порт вашей машины, и порт, который будет в докер контейнере.
Для того, чтобы передать контейнеру файлы основной машины, можно воспользоваться флагом -v
, где требуется указать директорию, которая будет монтироваться, и потом, куда она будет монтироваться.
Примеры:
Запуск nginx.
Проброс портов для nginx.
Добавление имени к контейнеру.
Если использовать run
, то Docker будет создавать новый контейнер. Но если требуется запустить контейнер, который уже когда-то использовался, используется команда start
. Запускать контейнер можно как и по имени контейнера, так и по его id.
Команда для присоединения к рабочему контейнеру.
Для выхода из него обычно используется exit
.
Для остановки контейнера используется команда stop
.
Для остановки всех контейнеров.
Принудительное завершение контейнера.
Для удаления контейнера нужно использовать rm, удалять можно как и по имени контейнера, так и по его id.
Если требуется удалить все контейнеры.
Если требуется удалить контейнеры по имени образа.
Для удаления образа нужно использовать rmi, при этом все контейнеры основанные на нём должны быть удалены.
Для удаления всех образов.
Для запуска команд используется команда exec
.
Если нужно запусить команду под определённым пользователем используется флаг -u
.
Примеры:
Просмотреть корректность заполнения конфига в nginx.
Вход под root пользователем в контейнере.
Для сохранения изменений требуется его закоммитить.
Для отправки данных требуется авторизация
После этого можно передать данные на Docker Hub.
Команда cp
позволяет копировать файлы к контейнер и из контейнера.
Опции:
-a / --archive
- копирование всей инфромации (uid/gid).
-L / --follow-link
- следовать символьной ссылке.
-q / --quiet
- подавить вывод во время копирования.
Примеры:
Копирование файла в контейнер.
Копирование файла из контейнера.
Команда, для того чтобы получить сколько использует docker дискового пространства.
Подробная информация об каждом объекте.
Docker при долгом использовании очень сильно загрезняет диск.
Очистка всего docker от мусора.
Будут удалены:
все остановленные контейнеры.
все сети, не используемые хотя бы одним контейнером.
все тома, не используемые хотя бы одним контейнером.
все образы, с которыми не связан хотя бы один контейнер.
весь кэш сборки.
Такой вариант может быть довольно жёстким для очищения.
Отдельное удалеение:
Удаление всех dangling образов.
Удаление всех неиспользуемых сетей.
Удаление volumes.
Удаление всех остановленных контейнеров.
Dockerfile является настройкой собственного контейнера. Каждая новая инструкция будет создавать новый слой контейнера.
Наследование от другого образа, с которого будет происходить старт.
Примеры.
Метаданные для образа.
Примеры.
Регистрация переменной окружения.
Примеры.
Указания рабочей директории, в какой директории будет находиться контейнер, от куда будет запуск команд. Если директория не создана, тогда docker сам создаст эту директорию.
Примеры.
Копирование файлов из хоста в образ. Копирование файлов будет происходить из хоста, где находится Dockerfile и ниже, выше подниматься нельзя.
Примеры.
Добавление файлов работают ровно так же, как и COPY, но также можно добавлять вместо локальных файлов файлы из интернета.
Примеры.
Вызов команд. Для уменьшения слоев можно писать несколько команд в одном запуске.
Примеры.
Указание какая команда будет выполняться при старте контейнера.
Примеры.
Аналог CMD - ENTRYPOINT.
Примеры.
Указание точки монтирования томов внутри образа.
Примеры.
Указание портов, которые слушает сервис в запущенном контейнере.
Примеры.
Указывается сигнал, который посылается процессу при остановке контейнера.
Примеры.
Имя (ID) пользователя, от которого выполняются директивы RUN, CMD, ENTRYPOINT.
Примеры.
Почти как ENV, но задаёт параметры только для docker build. Если в ENV мы задавали константные переменные, то здесь они будут задаваться динамически.
Примеры.
Команда, которой можно проверить состояние сервиса.
Избегать установки лишних пакетов и упаковки лишних данных в образы.
Использовать связанные команды для RUN инструкций.
Или можно привести к более читаемому виду
Следить за последовательностью описания Dockerfile.
Уменьшать количество слоёв.
Продумывать порядок слоёв - сначала выполняются слои которые не будут обновляться после каждой пересборки, после, те которые могут подвергаться изменениям.
Один контейнер - одна задача.
Чистить за собой в контейнере.
Использовать multi-stage сборки (для компилируемых языков).
Использовать scratch образ для собственных приложений.
scratch
- зарезервированный образ Docker, который является нулевым образом.
Многоэтапная сборка (multi-stage build) - предназначена для оптимизации конечного контейнера.
Что было до появления многоэтапной сборки?
Создавались 2 Dockerfile-а, один для разработки (содержит все необходимое для создания вашего приложения), другой оптимизированный для создания итогового образа, Эта практика в свое время получила название «шаблон строителя». Однако, поддерживать в актуальном состоянии два Dockerfile-а очень трудно. От этой концепции отказались когда пришла многоэтапная сборка.
Зачем нужна многоэтапная сборка?
Многоэтапная сборка нужна для оптимизации конечного контейнера. Суть подхода заключается в том, чтобы не заботиться о количестве получающихся слоев в процессе сборки вашего приложения и копировать результаты сборки из одного образа в другой.
К примеру, при компиляции приложения на c++, требуются специальные библиотеки, компилятор и исходный код, а в конце мы получаем лишь скомпилированный файл, который весит пару МиБ. И тогда можно просто перкопировать скомпилированный файл на другой контейнер, и в итоге мы получим очень легковестный контейнер.
Для копирования файлов с одного контейнера на другой используется команда COPY
с опцией --from
, и через равно указывается номер контейнера от куда будет происходить копирование.
К опции FROM
можно добавить псевдоним для более удобного понимания от куда идёт копирование.
Пример:
Файл .dockerignore
преднзначен для исключения файлов и директорий. Это помогает избежать ненужной отправки больший и конфиденциальных файлов и каталогов.
#
Комментарий
*
Ноль, один или более символов
**
Любое количество директорий, включая ноль
?
Подстановка одного символа
!
Исключение из исключений
Примеры:
Комментарий.
Игноривание всех файлов заканчивающихся на .log.
Игноривание всех файлов заканчивающихся на .log во всех директориях.
Исключение из исключений.
Docker Compose используется для одновременного управления несколькими контейнерами, входящими в состав приложения. Этот инструмент предлагает те же возможности, что и Docker, но позволяет работать с более сложными приложениями.
Описывается всё в файле docker-compose.yml
. Это файл, который будет содержать инструкции, необходимые для запуска и настройки сервисов. Обычно он хранится в корневой директории проекта.
Можно установить docker-compose
используя пакетный менеждер дистрибутива. Это отдельный файл, который является обёрткой над docker.
Docker Compose имеет общие опции для работы со всеми командами.
Опции:
-f / --file <docker-compose-specify-file>
- если требуется использовать другой файл. docker compose обычно запускает только файл docker-compose.yml
или docker-compose.override.yml
,
--env-file
- указать альтернативный env файл. По умолчанию docker compose использует файл .env
.
--project-name / -p
- указать имя проекта.
--parallel <int>
- контролировать максимальное количество параллелизма. для неограниченного количества -1
. По умолчанию -1
.
Сборка проекта.
Опции:
--no-cache
- не использовать кэш при сборке образа.
--pull
- стараться всегда получить более новую версию.
--quiet / -q
- ничего не выводить на stdout.
--build-arg
- установить параметры сборки.
Команда up
запускает описанные контейнеры.
Опции:
--build
- перед запуском, происходит сборка контейнеров.
-d
- запуск контейнеров в фоновом режиме.
--no-build
- не создавать образ, даже если он отсутствует.
--attach
- прикрепиться сервисному выходу.
--attach-dependencies
- присойдениться к зависимым контейнерам.
--no-recreate
- если контейнеры существуют, не пересоздовать их заново.
--pull
- вытянуть образы перед запуском.
--abort-on-container-exit
- останавливает все контейнеры, если какой-то контейнер был остановлен.
--force-recreate
- пересоздать контейнер, даже если его конфигурация не изменилась.
--remove-orphans
- удалить контейнеры, если они были не определены в compose файле.
Примеры:
Запуск проекта.
Запустить проект и дополнительно собрать его.
Запустить проект в фоновом режиме.
Запустить проект, собрать его и в фоновом режиме.
Остановка проекта.
Остановить проект и удалить контейнеры.
Посмотр логов сервиса.
Вывод списка контейнеров.
Команда показывает какие процессы запущены в каждом запущенном контейнере.
Команда для просмотра информации о образах.
Выполнение команды в контейнере.
version
- предназначен для просмотра версии docker compose.
Справка по всем командам.
При указании используемой версии файла compose, при версиях 2 и 3, нужно указать как старший, так и дополнительный номера. Если дополнительная версия не указана, по умолчанию используется 0, а не последняя дополнительная версия.
services
- в данном блоке описывается список сервисов.
build
- указание пути, где лежит Dockerfile для определенного проекта и передача определённых аргументов.
Примеры:
В текущей директории будет искаться файл Dockerfile
и запускаться.
Будет запущен Dockerfile.nginx
в директории nginx
.
Так же можно это разбить.
Для передачи аргументов используется args
.
Либо такой вариант.
image
- образ с которого будет запускаться контейнер.
Примеры:
Запуск от определённого image.
ports
- Открытие контейнерных портов, для работы с хостом.
Примеры.
Открытие порта.
Открытие нескольких портов.
expose
- открывает порты, не окрывая из на хостовой машине. Будут доступны только связным службам.
Пример.
env_file
- Добавление переменные среды из файла. Может быть одним значением или списком.
Примеры.
Указания файлов.
Сам env файл.
environment
- Добавление переменных для среды.
Примеры:
Указания переменных.
Указания переменных в другом формате yml.
volumes
- Указание точки монтирования томов внутри образа.
Примеры:
Монтирование по абсолютному пути.
Монтирование относительно compose файла.
Так же можно указывать именнованный том.
Сначала требуется создать. В конце после всех services создаются все нужные volumes.
И дальше в нужном сервисе вставляется нужный volume.
Все созданые volumes хранятся по пути /var/lib/docker/volumes
.
У volume есть параметры, которые монжо конфигурировать его.
name
- указание имени volume, с которым он будет создоваться.
external
- если стоит true, значит он не будет создавать новый volume, а будет искать готовый. Если не указывается параметр name
, тогда требуется указать его в external.
Примеры:
Указание имени volume.
Использовать готовый volume.
Использование external вместе с name.
container_name
- Собственное имя контейнера, вместо генерации по умолчанию.
Пример.
entrypoint
- Переопределение начального запуска.
Примеры:
command
- Переопределение команды для запуска.
Примеры:
depends_on
- зависимости запуска и завершения работы между службами.
Примеры:
Служба name_1 зависит от name_2 и name_3, т.е. будет запускаться после них.
restart
- Политика перезапуска контейнера.
Существуют 4 варианта:
no
- не перезапускает контейнер (по умолчанию).
always
- контейнер будет всегда перезапускается.
on-failure
- при ошибке будет перезапускаться контейнер.
unless-stopped
- всегда перезапускается контейнер, если контейнер не остановлен (вручную или другим образом).
Примеры:
healthcheck
- проверка, которая запускается, чтобы определить, являются ли контейнеры для этой службы работоспособными.
Параметры для healthcheck:
interval
- через какой период будет запускаться проверка.
timeout
- если проверка длится больше указанного времени, значит контейнер не работоспособен.
retries
- сколько раз запускается проверка, чтобы понять что контейнер не работает.
start_period
- время для запуска контейнера, перед запуском проверок работоспособности.
interval, timeout и start_period имеют специфичный вариант написания. Поддерживаемые единицы измерения: us, ms, s, m и h.
Примеры написания:
Пример:
extends
- позволяет использовать общие конфигурации для разных файлов или даже для разных проектов. Расширение служб полезно, если есть несколько служб, повторно использующих общий набор параметров конфигурации.
Шаблон.
Примеры:
Использование сервиса из другого файла.
first-service.yml
second-service.yml
ctop
- удобный просмотр контейнеров, какие запущены, какие простаивают, сколько памяти тратят и прочее.
hadolint
- инструмент который проверяет корректность написания Dockerfile.
.
Для Windows и Mac OS систем, требуется установить Docker Desktop c .
Официальный сайт, где можно найти все контейнеры и описание к ним .
Полная документация по .
После этой команды консоль запрашивает логин и пароль для авторизации на сайте .
.
Один из вариантов установки docker compose, это установка Docker Desktop. Он будет содержать в себе и docker и docker-compose. Ссылка на установку .
Так же существует специальный плагин для docker - docker-compose-plugin
. Он позволяет использовать команду не docker-compose
, а docker compose
, команда будет являться не отдельным файлом, а расширением docker. .
Полная документация по .
.
В начале файла указывается версия compose. В различных версиях добавлены/удалены/изменены службы. Все различные .
Документацию и установку можно найти на .
.
.