Дерево страниц

Вы просматриваете старую версию данной страницы. Смотрите текущую версию.

Сравнить с текущим просмотр истории страницы

« Предыдущий Версия 10 Следующий »

Данная статья применима к:

  • ОС СН Смоленск 1.7

Термины

Виртуализация - технология, позволяющая запускать экземпляры операционных систем (гостевые машины) параллельно и изолированно на единственной хост-машине. При этом каждой гостевой машине предоставляются собственные ресурсы, а гостевая операционная система может быть полностью отличной от операционной системы хост-машины.

Гипервизор - программное обеспечение, позволяющее запускать многожественные гостевы (виртуальные) машины на единственной физической машине (хост-машине), а также обеспечивающее  передоставление ресурсов виртуальным машинам.

Гостевая машина - виртуальная машина, запускаемая в изолированной среде системы виртуализации внутри хост-машины.

Гостевая операционная система - операционная система, работающая на гостевой машине.

Хост-машина - машина, в операционной системе которой запускатся система виртуализации и работающие в этой системе виртуализации гостевые машины.

Типы виртуализации в ОС СН

Программное обеспечение входящее в состав ОС СН поддерживает два типа виртуализации:

  • Полная виртуализация - технология виртуализации обеспечивающая полное моделирование используемого оборудования полностью индивидуальное для каждой гостевой ОС. Гостевые ОС полностью изолированы друг от друга, и каждая гостевая ОС работает в собственной программно-аппаратной среде, полностью копирующей реальное оборудование и содержащей полную копию всех необходимых ресурсов;

  • Контейнерная виртуализация - технология виртуализации обеспечивающая совместное использование ресурсов гостевыми операционными системами. Экземпляры операционных системах, выполняющихся в контейнерах, изолированы друг от друга, но при этом некоторые ресурсы используются ими совместно.

Системы виртуализации  в ОС СН

В состав ОС СН входят две системы виртуализации, поддерживающие два описанных выше типа виртуальзации:

  • libvirt - система полной виртуальзации;
  • docker - система контейнерной вартуализации.

Система контейнерной виртуализации Docker

Термины

Образ - набор упорядоченных слоёв, фактически сумма изменений, внесённых в систему, текущее состояние системы;

Слой - в трактовке Docker набор изменений файловой системы, другими словами - некий моментальный снимок  состояния системы. Слои доступны только для чтения, каждое изменение порождает новый слой. Любой слой может использоваться несколькоми образами одновременно;

Контейнер - экземпляр образа docker, образ, находящийся в работе, то есть образ с новым слоем текущих изменений. При работе контейнера все изменния сохраняются в новом слое, а все предыдущие слои остаются неизменными;

Реестр образов - сетевое хранилище подготовленных образов, доступных для загрузки на целевые машины.

Особенности

Система контейнерной виртуализации Docker позиционируется не только как система виртуализации, но как система быстрого распространения и развёртывания приложений.

Традиционный способ развёртывания приложений предполагает:

  • передачу пользователю приложения комплекта неких файлов приложения как правило:
    • исполнимый файл;
    • конфигурационный файл;
    • сценарии установки и удаления;
    • инструкции по установке;
  • выполнение пользователем для развёртывания предоставленных сценариев и инструкций на целевой машине.

При этом, несмотря на то, что разработчиками приложений тратятся значительные усилия на создание сценариев развёртывания, учитывающих всевозможные особенности целевыз машин и возможные конфликты с другими приложениями, выполение действий по установке часто завершается неудачей, 

Docker предлагает альтернативный вариант развёртывания: поставщик приложений передаёт пользователям приложений предварительно настроенные контейнеры с приложениями. Эти контейнеры просто запускаются пользователем на целевой машине, предоставляя каждому приложению изолированное преднастроенное окружение для работы. Таким образом исключается существенная часть ошибок, связанных с предварительной настройкой нестандартных пользовательских систем. Хорошим примером использования возможностей Docker по быстрому развёртыванию приложений явлется пример развёртывания собственного реестра образов, выполняемого путём простого скачивания подготовленного образа (см. раздел "Администрировани" - "Создание собственного реестра образов").

При этом, по сравнению с системами полной виртуализации, запуск контейнеров требует значительно меньших вычислительныз ресурсов, и, кроме того, Docker для экономии ресурсов поддерживает систему повторного использования "слоёв". "Слой" в терминологии Docker - это некий моментальный снимок состояния системы, а "образ" - это итоговое состояние системы с учетом cостояний всех подлежащих слоёв. При этом "слои" могут использоваться повторно разными "образами":

Дополнительным эффектом от повторного использования "слоёв" является снижение объёмов передаваемых данных при передаче подготовленных в виде образов прикладных программ: при использовании реестра образов Docker передаваться будет только новые слои, в примере выше - слой "Базовая система Astra Linux SE" будет загружен из реестра образов только один раз, далее загружаться будут только новые слои.

Ограничения Docker

  • Docker не предназначен для:
    • Совместного использования  разными пользователями. Возможность использования Docker непривилегированным пользователем нужна не для того, чтобы любой пользователь смог работать с контейнерами, а для того, чтобы пользователь-администратор мог запускать контейнеры не давая им прав root. Это нужно не для многопользовательской работы, а для снижения рисков компроментации системы при компроментации контейнера.
    • Повышения производительности приложений. Контейнеры Docker потребляют меньше ресурсов, чем полноценные системы виртуализации, но в любом случае контейнеризация потребляет часть доступных ресурсов;
    • Повышения безопасности. Изоляция приложений в разных контейнерах затрудняет распространение угроз при компроментации приложений, однако все контейнеры разделяют одну хостовую ОС, и всегда существут риск появления приложений с неполной изоляцией. Настройки Docker, принятые по умолчанию, 
    • Работы с графическими приложениями.Благодаря тому, что современные графические менеджеры поддерживают удаленную работу с подключением через сети, графические приложения могут использоваться в контейнерах, однако это требует дополнительных настроек. 
  • Docker, в отличие от виртуальных машин, не обеспечивает полной кросс-платформенности. Контейнеры на операционных системах с разными ядрами могут быть запущены с помощью специальных приемов (запуска виртуальных машин), требующих дополнительного расхода ресурсов;
  • Docker не поддерживает systemd, в контейнерах по умолчанию отсутствуют команды systemctl, hostnamectl и пр. 
  • Docker вносит значительные изменения в сетевые настройки, что может привести к 


Администрирование Docker

Установка Docker

В ОС СН Смоленск 1.7 Docker представлен пакетом docker.io и может быть установлен с помощью графического менеджера пакетов или из командной строки командой:

sudo apt install docker.io
Установка выполняется от имени пользователя, являющегося администратором системы, и после установки Docker рекомендуется предоставить этому пользователю право работать с контейнерами не используя sudo. Для этого пользователя нужно включить в группу docker:
sudo usermod -aG docker $USER
Изменение вступит в силу после перезапуска пользовательской сессии.

Для более ранних версий Astra Linux см. статью: Установка и настройка Docker в ОС Astra Linux

Создание собственного реестра образов

Загрузить подготовленный образ Docker, содержащий приложение "Реестр образов Docker". Образ "Реестр образов Docker" загружается из реестра образов Docker:

sudo docker run -d -p 5000:5000 --restart=always --name registry registry:2

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
После выполнения указанной команды локальный реестр образов автоматически запущен и готов к работе. Управление работой контейнера реестра осуществляется так же как управление любым другим контейнером. например остановка работы реестра:
sudo docker container stop registry

Удаление реестра:

sudo docker container stop registry && sudo docker container rm -v registry
Настройка внешнего доступа к собственному реестру

Создание собственного образа

См. статью: Создание собственного образа для использования в Docker

Управление Docker-ом

Подробная справка по командному интерфейсу Docker представлена на сайте разработчиков: https://docs.docker.com/engine/reference/commandline/docker/. При работе в системе список команд можно получить с помощью команды:

docker help
Более подробную справку по аргументам команд можно получить с помощью ключа --help, например:
docker attach --help
Часто употребимые команды (аргументы команд для краткости не указаны):

КомандаКраткое описание

docker attach

Подключить стандартные каналы ввода-вывода (stdin, stdout, stderr) к активному контейнеру
docker buildПостроить Docker-образ из Docker-файла
docker builderУправление модулем построения Docker-образов 
docker commitСоздание нового Docker-образа из активного контейнера
docker configУправление конфигурациями Docker
docker container

Управление контейнерами:

docker container createсоздать новый контейнер
docker container execвыполнить команду в активном контейнере
docker container runвыполнить команду в новом контейнере
docker container startактивировать контейнер (контейнеры)
docker container stopдеактивация контейнера
docker contextУправление конекстами Docker
docker cp Копирование файлов или каталогов между локальной файловой системой и файловой системой контейнера
docker createСоздать новый изменяемый слой в указанном контейнере
docker diffВывести список файлов и каталогов, изменененных с момента создания контейнера
docker eventsВывести  событий, произошедших с различными объектами Docker
docker execВыполнить команду в активном контейнере
docker exportЭкспортировать файловую систему контейнера как архив формата tar
docker historyПоказать историю образа
docker image

Управление образами:

docker image buildсоздание нового образа
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 run --rmудалить новый (изменённый) слой после деактивации контейнера, т.е. сохранить образ неизменным
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Ожидание завершения работы контейнера (контейнеров) и вывод кодов завершения

Загрузка образа в реестр

Получить список доступных на локальной машине образов:

sudo docker image ls

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
Пометить загружаемый образ тэгом (tag) для загрузки в нужный реестр:
sudo docker tag wiki/astralinux:se17rc5 localhost:5000/se17rc5
Перепроверить список доступных образов, чтобы убедиться, что тэг присвоен верно:
 sudo docker image ls

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
В примере выше первые две строки сообщают об одном и том же образе (идентификатор образа 5d69ce8720a7). При этом образ помечен как размещенный в двух локациях - на локальной машине wiki/astralinux и сетевом реестре на локальной машине localhost:5000.

Загрузить образ в реестр:

sudo docker push localhost:5000/se17rc5

The push refers to repository [localhost:5000/se17rc5]
d5f516170dbe: Pushed 
latest: digest: sha256:8d12b1c9ebe3b3060734965bbd7214a0063633261bf1da17d3caf50ed4f1f534 size: 529

Использование Docker

Получение образа из реестра

Пример получения образа Docker из реестра описан выше (см. "Создание собственого реестра образов"). При этом для получения образа используется просто команда запуска контейнера (docker run), которая, не найдя на локальной машине указанный образ, ищет образ в реестре образов, и, если образ найден, автоматически загружает и запускает его.

Образ также можно просто загрузить из реестра с помощью команды docker pull, например:

docker pull debian

Копирование образа без использования реестра

Образ, хранящийся на локальной машине может быть скопирован (например, на другую (целевую) машину) без использования реестра образов. Далее для примера используется стандартный образ hello-world из реестра образов Docker. Перенос образа на другую машину:

  1. Выгрузить образ в файл архива:

    docker save -o hello-world.bz2 hello-world
    Опция -o указывает имя файла, в который нужно выводить данные. Если опция не указана, то вывод осуществляется в стандартный вывод (stdout), что можно использовать для автоматизации работы (см. далее).
     

  2. Скопировать полученный файл hello-world.bz2 на целевую машину любым доступным способом;

  3. На целевой машине загрузить файл в локальный реестр образов:

    docker load -i hello-world.bz2
    Опция -i указывает имя файла, из которого должен заружаться образ. Если опция не указана - образ загружается из стандартного ввода.

Или, как вариант, выполнить все указанные выше шаги одной командой, скопировав создаваемый файл через SSH (естественно, на целевом компьютере для этого должен быть настроен SSH):

docker save hello-world | bzip2 | ssh user@host 'bunzip2 | docker load'
Где:

  • docker save hello-world - команда выгрузки образа с именем hello-world. В отличие от примера выше команда используется без указания файла, то есть выводит в стандатный вывод (stdout);
  • bzip2 - программа сжатия данных (архиватор);
  • ssh user@host 'bunzip2 | docker load' - подключение через SSH к компьютеру с именем host от имени пользователя user и запуск команды загрузки образа из стандартного ввода (stdin). Пользователь user на целевом компьютере должен иметь право работать с Docker без использования sudo.

Создание контейнеров из образов и основы работы с контейнерами

При запуске приложений, упакованных в контейнеры Docker, важно понимать разницу между "образом" (неизменяемым набором данных) и "контейнером" (изменяемым набором данных, создаваемых из "образа").

Для примера используем стандартный образ busybox, который загрузим из ресстра Docker:

docker pull busybox
Исходное состояние: в локальном репозитори имеется образы hello-world и busybox:
docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              b97242f89c8a        6 days ago          1.23MB
hello-world         latest              bf756fb1ae65        12 months ago       13.3kB
И нет ни одного контейнера:
docker container ls -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

Создание нового контейнера из образа busybox и его запуск выполняется одной командой:

docker run --name run-busybox --rm -it busybox

/ #
Где:

  • --name run-busybox - присвоить создаваемому контейнеры имя run-busybox. Имя можно не указывать, тогда оно будет создано автоматически.
  • --rm - уничтожить контейнер после завершения его работы;
  • -i - запустить контейнер в интерактивном режиме;
  • -t - создать терминал;
  • /# - приглашение интераутивного режима запущенного контенера и ожидание ввода.

Проверим из отдельной терминальной сессии список контейнеров:

docker container ls -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
09c793a139b2        busybox             "sh"                3 minutes ago       Up 3 minutes                            run-busybox
В списке появился новый контейнер с именем run-busibox.

Вернёмся в первую терминальную сессию, и выйдем из интерактивного контейнера командой exit. Повторная проверка командой docker container ls -a покажет, что список контейнеров пуст (опция --rm указывает удалить контейнер после завершения работы).

Повторно запустим контейнер, уже без опции --rm, и, для примера, не задавая имя контейнера:

docker run -it busybox

/ #
Снова проверим список контейнеров из отдельной сессии:
docker container ls -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
825a33f9c18c        busybox             "sh"                28 seconds ago      Up 28 seconds                           amazing_morse
В списке появился новый контейнер с автоматически созданным именем amazing_morse.
Снова вернёмся в первую терминальную сессию, и выйдем из интерактивного контейнера командой exit. Повторная проверка покажет, что теперь в списоке контейнеров сохранился контейнер:
docker container ls -a

CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                     PORTS               NAMES
825a33f9c18c        busybox             "sh"                About a minute ago   Exited (0) 2 seconds ago                       amazing_morse
Повторно выполним команду docker run:
docker run -it busybox

/ #
И из отдельной терминальной сессии увидим, что контейнеров теперь стало 2: 1) ранее созданный amazing_morse (неактивный) и 2) новый admiring_murdock (активный):
docker container ls -a

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 run имя_образа
создаёт из указанного образа новый контейнер и запускает его. Из одного образа можно создать сколько угодно контенйеров, которые можно сохранять или не сохранять после завершения их работы.

Для запуска созданного и сохранённого контейнера используется команда docker start (обратите внимание, используется не образ, а контейнер):

docker start -ai amazing_morse   

/ #
опции -ai задают подключение в интерактивном режиме, но контейнер можно можно запустить и в фоновом режиме:
docker start amazing_morse

amazing_morse
К контейнеру работающему в фоновом режиме можно подключиться командой docker attach:
docker attach amazing_morse

/ #
Оключиться от конейнера, не останавливая его, можно нажав последовательно клавиши Ctrl+p Ctrl+q. Или можно остановить контейнер, введя команду exit.

Выше описно, как работать с контейнерами, в том числе сохраняя сделанные изменения. То есть, первоначальный образ можно "изменить" (естественно, не сам образ, который неизменен, изменения регистрируются в контейнере), и далее контейнер можно преобразовать в образ:

docker container commit amazing_morse new-busybox

sha256:6f607ea38417448f73f3db5faeddf901832546b8d2882beab4e93062035df680
Проверим список образов:
docker images 

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 для последующего монтирования:

docker volume create my-vol

my-vol
Запуск контейнера с mount-монтированием тома my-vol на хост-машине в каталог /app контейнера:

Формат --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:

  1. Создать (загрузить) исходный образ;
  2. Создать из этого образа контейнер, работая в котором выполнить и сохранить дополнительные настройки;
  3. Конвертировать контейнер с выполненными настройками в новый образ;
  4. Скопировать новый образ на целевые машины для использования;
  5. На целевых машинах:
    1. Можно использовать контейнеры, сохраняющие возникающие при эксплуатации изменения в этих контейнерах;
    2. Можно использовать образ, монтируя к нему внешние каталоги, в которых сохраняются изменения, не сохраняя изменения в контейнерах;
    3. Можно комбинировать указанные варианты.









  • Нет меток