Термины
Виртуализация - технология, позволяющая запускать экземпляры операционных систем (гостевые машины) параллельно и изолированно на единственной хост-машине. При этом каждой гостевой машине предоставляются собственные ресурсы, а гостевая операционная система может быть полностью отличной от операционной системы хост-машины.
Гипервизор - программное обеспечение, позволяющее запускать множественные гостевые (виртуальные) машины на единственной физической машине (хост-машине), а также обеспечивающее предоставление ресурсов виртуальным машинам.
Гостевая машина - виртуальная машина, запускаемая в изолированной среде системы виртуализации внутри хост-машины.
Гостевая операционная система - операционная система, работающая на гостевой машине.
Хост-машина - машина, в операционной системе которой запущена система виртуализации, под управлением которой работают гостевые машины.
Системы виртуализации в ОС СН
В состав ОС СН входят две системы виртуализации, поддерживающие два описанных выше типа виртуализации:
- libvirt - система полной виртуализации;
- docker - система контейнерной виртуализации.
Система контейнерной виртуализации Docker
Термины
Образ - набор упорядоченных слоёв, фактически сумма изменений, внесённых в систему, текущее состояние системы;
Слой - в трактовке Docker набор изменений файловой системы, другими словами - некий моментальный снимок состояния системы. Слои доступны только для чтения, каждое изменение порождает новый слой. Любой слой может использоваться несколькими контейнерами одновременно;
Контейнер - экземпляр образа docker, образ, находящийся в работе, то есть образ с новым слоем текущих изменений. При работе контейнера все изменения сохраняются в новом слое, а все предыдущие слои остаются неизменными;
Реестр образов - сетевое хранилище подготовленных образов, доступных для загрузки на целевые машины.
Особенности
Система контейнерной виртуализации Docker позиционируется не только как система виртуализации, но как система быстрого распространения и развёртывания приложений.
Традиционный способ развёртывания приложений предполагает:
- передачу пользователю приложения комплекта неких файлов приложения как правило:
- исполнимый файл;
- конфигурационный файл;
- сценарии установки и удаления;
- инструкции по установке;
- выполнение пользователем для развёртывания предоставленных сценариев и инструкций на целевой машине.
При этом, несмотря на то, что разработчиками приложений тратятся значительные усилия на создание сценариев развёртывания, учитывающих всевозможные особенности целевыз машин и возможные конфликты с другими приложениями, выполнение действий по установке часто завершается неудачей,
Docker предлагает альтернативный вариант развёртывания: поставщик приложений передаёт пользователям приложений предварительно настроенные контейнеры с приложениями. Эти контейнеры просто запускаются пользователем на целевой машине, предоставляя каждому приложению изолированное преварительно настроенное окружение для работы. Таким образом исключается существенная часть ошибок, связанных с предварительной настройкой нестандартных пользовательских систем. Хорошим примером использования возможностей Docker по быстрому развёртыванию приложений является пример развёртывания собственного реестра образов, выполняемого путём простого скачивания подготовленного образа (см. раздел "Администрирование" - "Создание собственного реестра образов").
При этом, по сравнению с системами полной виртуализации, запуск контейнеров требует значительно меньших вычислительных ресурсов, и, кроме того, Docker для экономии ресурсов поддерживает систему повторного использования "слоёв". "Слой" в терминологии Docker - это некий моментальный снимок состояния системы, а "образ" - это итоговое состояние системы с учётом состояний всех подлежащих слоёв. При этом "слои" могут использоваться повторно разными "образами":
Дополнительным эффектом от повторного использования "слоёв" является снижение объёмов передаваемых данных при передаче подготовленных в виде образов прикладных программ: при использовании реестра образов Docker передаваться будет только новые слои, в примере выше - слой "Базовая система Astra Linux SE" будет загружен из реестра образов только один раз, далее загружаться будут только новые слои.
Ограничения Docker
- Docker не предназначен для:
- Совместного использования разными пользователями. Возможность использования Docker непривилегированным пользователем нужна не для того, чтобы любой пользователь смог работать с контейнерами, а для того, чтобы пользователь-администратор мог запускать контейнеры не давая им прав root. Это нужно не для многопользовательской работы, а для снижения рисков компрометации системы при компрометации контейнера.
- Повышения производительности приложений. Контейнеры Docker потребляют меньше ресурсов, чем полноценные системы виртуализации, но в любом случае контейнеризация потребляет часть доступных ресурсов;
- Повышения безопасности. Изоляция приложений в разных контейнерах затрудняет распространение угроз при компрометации приложений, однако все контейнеры разделяют одну хостовую ОС, и всегда существует риск появления приложений с неполной изоляцией;
- Работы с графическими приложениями. Благодаря тому, что современные графические менеджеры поддерживают удалённую работу с подключением через сети, графические приложения могут использоваться в контейнерах, однако это требует дополнительных настроек.
- Docker, в отличие от виртуальных машин, не обеспечивает полной кросс-платформенности. Контейнеры на операционных системах с разными ядрами могут быть запущены с помощью специальных приёмов (запуска виртуальных машин), требующих дополнительного расхода ресурсов;
- Docker по умолчанию не поддерживает systemd, в контейнерах по умолчанию отсутствуют команды systemctl, hostnamectl и пр.
- Docker вносит значительные изменения в сетевые настройки, что может привести к полной или частичной неработоспособности хост-машины.
Администрирование Docker
Установка Docker
В ОС СН Смоленск 1.7 Docker представлен пакетом docker.io и может быть установлен с помощью графического менеджера пакетов или из командной строки командой:
Для более ранних версий Astra Linux см. статью: Установка и настройка Docker в ОС Astra Linux
Создание собственного реестра образов
Загрузить подготовленный образ Docker, содержащий приложение "Реестр образов Docker". Образ "Реестр образов Docker" загружается из реестра образов Docker:
Unable to find image 'registry:2' locally
2: Pulling from library/registry
0a6724ff3fcd: Pull complete
d550a247d74f: Pull complete
1a938458ca36: Pull complete
acd758c36fc9: Pull complete
9af6d68b484a: Pull complete
Digest: sha256:d5459fcb27aecc752520df4b492b08358a1912fcdfa454f7d2101d4b09991daa
Status: Downloaded newer image for registry:2
782dbf275b4521715930a5478c3af2ed3e77614fc6042d03fff9a27740fafd97
Удаление реестра:
Создание собственного образа
См. статью: Создание собственного образа для использования в Docker
Управление Docker-ом
Подробная справка по командному интерфейсу Docker представлена на сайте разработчиков: https://docs.docker.com/engine/reference/commandline/docker/. При работе в системе список команд можно получить с помощью команды:
Команда | Краткое описание | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
docker attach | Подключить стандартные каналы ввода-вывода (stdin, stdout, stderr) к активному контейнеру | ||||||||||
docker build | Построить Docker-образ из Docker-файла | ||||||||||
docker builder | Управление модулем построения Docker-образов | ||||||||||
docker commit | Создание нового Docker-образа из активного контейнера | ||||||||||
docker config | Управление конфигурациями Docker | ||||||||||
docker container | Управление контейнерами:
| ||||||||||
docker context | Управление контекстами Docker | ||||||||||
docker cp | Копирование файлов или каталогов между локальной файловой системой и файловой системой контейнера | ||||||||||
docker create | Создать новый изменяемый слой в указанном контейнере | ||||||||||
docker diff | Вывести список файлов и каталогов, изменённых с момента создания контейнера | ||||||||||
docker events | Вывести событий, произошедших с различными объектами Docker | ||||||||||
docker exec | Выполнить команду в активном контейнере | ||||||||||
docker export | Экспортировать файловую систему контейнера как архив формата tar | ||||||||||
docker history | Показать историю образа | ||||||||||
docker image | Управление образами:
| ||||||||||
docker images | Вывести список образов верхнего уровня | ||||||||||
docker import | Создать файловую систему образа из архива | ||||||||||
docker info | Вывод системной информации | ||||||||||
docker inspect | Вывод подробной информации об объектах Docker | ||||||||||
docker kill | Принудительно деактивировать активный контейнер (контейнеры) | ||||||||||
docker load | Загрузить образ из архива tar или из стандартного ввода | ||||||||||
docker login | Войти в реестр образов | ||||||||||
docker logout | Выйти из реестра образов | ||||||||||
docker logs | Извлечь журналы контейнера | ||||||||||
docker manifest | Управление манифестами и списками манифестов Docker | ||||||||||
docker network | Управление сетями | ||||||||||
docker node | Управление узлами кластеров Docker | ||||||||||
docker pause | Приостановить все процессы в активном контейнере (контейнерах) | ||||||||||
docker plugin | Управление плагинами | ||||||||||
docker port | Вывести список отображения портов контейнера | ||||||||||
docker ps | Вывести список активных контейнеров | ||||||||||
docker pull | Загрузить образ на локальный компьютер из реестра образов | ||||||||||
docker push | Загрузить образ с локального компьютера в реестр образов | ||||||||||
docker rename | Переименовать контейнер | ||||||||||
docker restart | Перезапустить контейнер (контейнеры) | ||||||||||
docker rm | Удалить контейнер (контейнеры) | ||||||||||
docker rmi | Удалить образ (образы) | ||||||||||
docker run | Выполнить команду в новом контейнере, то есть: создать в существующем образе новый изменяемый слой, и выполнить команду, сохраняя изменения в этом слое
| ||||||||||
docker save | Сохранить образ (образы) в архиве tar (через стандартный вывод по умолчанию) | ||||||||||
docker search | Поиск образов Docker в сети Интернет | ||||||||||
docker secret | Управление паролями кластеров Docker | ||||||||||
docker service | Управление сервисами кластеров Docker | ||||||||||
docker stack | Управление стеками | ||||||||||
docker start | Запустить контейнер (контейнеры) | ||||||||||
docker stats | Отобразить в режиме реального времени статистику потребления ресурсов контейнером | ||||||||||
docker stop | Остановить активный контейнер (контейнеры) | ||||||||||
docker swarm | Управление кластерами Docker | ||||||||||
docker system | Управление службой Docker | ||||||||||
docker tag | Создать тег (метку) образа, ссылающийся на существующий образ | ||||||||||
docker top | Вывести список процессов активного контейнера | ||||||||||
docker trust | Управление ключами и подписями образов | ||||||||||
docker unpause | Продолжить выполнение приостановленного активного контейнера (контейнеров) | ||||||||||
docker update | Обновить конфигурацию контейнера (контейнеров) | ||||||||||
docker version | Отобразить версию Docker | ||||||||||
docker volume | Управление томами хранения данных для контейнеров | ||||||||||
docker wait | Ожидание завершения работы контейнера (контейнеров) и вывод кодов завершения |
Загрузка образа в реестр
Получить список доступных на локальной машине образов:
REPOSITORY TAG IMAGE ID CREATED SIZE
wiki/astralinux se17rc5 5d69ce8720a7 25 hours ago 318MB
registry 2 678dfa38fcfa 12 days ago 26.2MB
localhost:5000/hello-world-se latest bf756fb1ae65 12 months ago 13.3kB
hello-world latest bf756fb1ae65 12 months ago 13.3kB
REPOSITORY TAG IMAGE ID CREATED SIZE
wiki/astralinux se17rc5 5d69ce8720a7 25 hours ago 318MB
localhost:5000/se17rc5 latest 5d69ce8720a7 25 hours ago 318MB
registry 2 678dfa38fcfa 12 days ago 26.2MB
localhost:5000/hello-world-se latest bf756fb1ae65 12 months ago 13.3kB
hello-world latest bf756fb1ae65 12 months ago 13.3kB
Загрузить образ в реестр:
The push refers to repository [localhost:5000/se17rc5]
d5f516170dbe: Pushed
latest: digest: sha256:8d12b1c9ebe3b3060734965bbd7214a0063633261bf1da17d3caf50ed4f1f534 size: 529
Использование Docker
Получение образа из реестра
Пример получения образа Docker из реестра описан выше (см. "Создание собственного реестра образов"). При этом для получения образа используется просто команда запуска контейнера (docker run), которая, не найдя на локальной машине указанный образ, ищет образ в реестре образов, и, если образ найден, автоматически загружает и запускает его.
Образ также можно просто загрузить из реестра с помощью команды docker pull, например:
Копирование образа без использования реестра
Образ, хранящийся на локальной машине может быть скопирован (например, на другую (целевую) машину) без использования реестра образов. Далее для примера используется стандартный образ hello-world из реестра образов Docker. Перенос образа на другую машину:
Выгрузить образ в файл архива:
docker save -o hello-world.bz2 hello-worldОпция -o указывает имя файла, в который нужно выводить данные. Если опция не указана, то вывод осуществляется в стандартный вывод (stdout), что можно использовать для автоматизации работы (см. далее).
- Скопировать полученный файл hello-world.bz2 на целевую машину любым доступным способом;
На целевой машине загрузить файл в локальный реестр образов:
docker load -i hello-world.bz2Опция -i указывает имя файла, из которого должен загружаться образ. Если опция не указана - образ загружается из стандартного ввода.
Или, как вариант, выполнить все указанные выше шаги одной командой, скопировав создаваемый файл через SSH (естественно, на целевом компьютере для этого должен быть настроен SSH):
- docker save hello-world - команда выгрузки образа с именем hello-world. В отличие от примера выше команда используется без указания файла, то есть выводит в стандартный вывод (stdout);
- bzip2 - программа сжатия данных (архиватор);
- ssh user@host 'bunzip2 | docker load' - подключение через SSH к компьютеру с именем host от имени пользователя user и запуск команды загрузки образа из стандартного ввода (stdin). Пользователь user на целевом компьютере должен иметь право работать с Docker без использования sudo.
Создание контейнеров из образов и основы работы с контейнерами
При запуске приложений, упакованных в контейнеры Docker, важно понимать разницу между "образом" (неизменяемым набором данных) и "контейнером" (изменяемым набором данных, создаваемых из "образа").
Для примера используем стандартный образ busybox, который загрузим из ресстра Docker:
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest b97242f89c8a 6 days ago 1.23MB
hello-world latest bf756fb1ae65 12 months ago 13.3kB
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Создание нового контейнера из образа busybox и его запуск выполняется одной командой:
/ #
- --name run-busybox - присвоить создаваемому контейнеры имя run-busybox. Имя можно не указывать, тогда оно будет создано автоматически.
- --rm - уничтожить контейнер после завершения его работы;
- -i - запустить контейнер в интерактивном режиме;
- -t - создать терминал;
- /# - приглашение интерактивного режима запущенного контейнера и ожидание ввода.
Проверим из отдельной терминальной сессии список контейнеров:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
09c793a139b2 busybox "sh" 3 minutes ago Up 3 minutes run-busybox
Вернёмся в первую терминальную сессию, и выйдем из интерактивного контейнера командой exit. Повторная проверка командой docker container ls -a покажет, что список контейнеров пуст (опция --rm указывает удалить контейнер после завершения работы).
Повторно запустим контейнер, уже без опции --rm, и, для примера, не задавая имя контейнера:
/ #
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
825a33f9c18c busybox "sh" 28 seconds ago Up 28 seconds amazing_morse
Снова вернёмся в первую терминальную сессию, и выйдем из интерактивного контейнера командой exit. Повторная проверка покажет, что теперь в списке контейнеров сохранился контейнер:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
825a33f9c18c busybox "sh" About a minute ago Exited (0) 2 seconds ago amazing_morse
/ #
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b894e0b0b22d busybox "sh" 17 seconds ago Up 16 seconds admiring_murdock
825a33f9c18c busybox "sh" 3 minutes ago Exited (0) About a minute ago amazing_morse
Команда
Для запуска созданного и сохранённого контейнера используется команда docker start (обратите внимание, используется не образ, а контейнер):
/ #
amazing_morse
/ #
Выше описано, как работать с контейнерами, в том числе сохраняя сделанные изменения. То есть, первоначальный образ можно "изменить" (естественно, не сам образ, который неизменен, изменения регистрируются в контейнере), и далее контейнер можно преобразовать в образ с помощью команды docker container commit:
sha256:6f607ea38417448f73f3db5faeddf901832546b8d2882beab4e93062035df680
REPOSITORY TAG IMAGE ID CREATED SIZE
new-busybox latest 6f607ea38417 2 seconds ago 1.23MB
busybox latest b97242f89c8a 6 days ago 1.23MB
hello-world latest bf756fb1ae65 12 months ago 13.3kB
Монтирование файловых ресурсов хост-машины
Docker поддерживает следующие варианты монтирования файловых ресурсов хост-машины:
bind - монтирование файла или каталога хост-машины в контейнер. Примонтированный ресурс доступен по его абсолютному пути на хост машине.
Метод монтирования является устаревшим и не рекомендуется к применению.- mount - монтирование заранее созданных изолированных томов для размещения данных.
- tmpfs - монтирование временных ресурсов вне файловой системы хост-машины и вне изменяемого слоя контейнера в памяти хост-машины. Данные уничтожаются после остановки контейнера и не могут разделяться между контейнерами.
Опции монтирования задаются при создании контейнеров из образов, и сохраняются в параемтрах контейнера. Опции монтирования могут задаваться в двух альтернативных форматах: "формат -v" и "формат --mount". Значение "формат -v" состоит их трех фиксированных полей, разделённых символами двоеточия: ресурс монтирования, точка монтирования, опции монтирования. Значение "формат --mount" состоит из списка пар вида "опция=значение", разделённых запятыми, см. примеры далее. Опции монтирования в варианте bind фактически отличается от опция монтирования в варианте mount названием монтируемого ресурса: в первом случае это путь к файловому объекту, во втором - имя заранее созданного тома монтирования. Если точка монтирования внутри контейнера не существует то она создаётся автоматически, причём всегда в виде каталога.
Опции монтировниния "формат --mount":
Опция | Значение | Комментарий |
---|---|---|
type | Тип монтирования, может быть bind, volume (по умолчанию) или tmpfs. Тип монтирования tmpfs | |
source или src | Для монтирования bind - путь к файловому объекту хост-машины. Не используется при монтировании с типом tmpfs. | |
destination или dst или target. | Точка монтирования в контейнере | |
readonly | Монтирование в режиме только чтение | Опция ro в "формате -v" |
bind-propagation | По умолчанию имеет значение rprivate, а для монтирования bind может быть private, rshared, shared, rslave, slave. Подробнее см. документацию на ядро: https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt | |
tmpfs-size | Лимит размера ресурса в байтах, по умолчанию размер не ограничен. | Применимо только для монтирования tmpfs |
tmpfs-mode | Восьмеричная маска доступа для фаловых объектов (например, 700 или 0770). По умолчанию 1777, т.е. доступно на запись всем. | Применимо только для монтирования tmpfs |
Запуск контейнера с bind-монтированием текущего каталога на хост-машине в каталог /app контейнера:
Формат --mount | Формат -v |
---|---|
docker run --rm -it --mount type=bind,src=$(pwd),dst=/app busybox | docker run --rm -it -v $(pwd):/app busybox |
Создание тома с именем my-vol для последующего монтирования:
my-vol
Формат --mount | Формат -v |
---|---|
docker run --rm -it --mount src=my-vol,dst=/app busybox | docker run --rm -it -v my-vol:/app busybox |
Запуск контейнера с tmpfs-монтированием:
Формат --mount | Формат -v | Параметры монтирования по умолчанию |
---|---|---|
docker run --rm -it --mount type=tmpfs,destination=/app busybox | не поддерживается | docker run --rm -it --tmpfs /app busybox |
Возможный сценарий применения Docker
Таким образом, возможный сценарий применения Docker:
- Создать (загрузить) исходный образ;
- Создать из этого образа контейнер, работая в котором выполнить и сохранить дополнительные настройки;
- Конвертировать контейнер с выполненными настройками в новый образ;
- Скопировать новый образ на целевые машины для использования;
- На целевых машинах:
- Можно использовать контейнеры, сохраняющие возникающие при эксплуатации изменения в этих контейнерах;
- Можно использовать образ, монтируя к нему внешние каталоги, в которых сохраняются изменения, не сохраняя изменения в контейнерах;
- Можно комбинировать указанные варианты.