- Установка и администрирование Docker в Astra Linux 1.7
- Привилегированный и непривилегированный режимы работы Docker
- Установка Docker
- Установка Docker для работы в привилегированном режиме
- Запуск гипервизора контейнеров Docker на пониженном уровне целостности
- Установка, включение и применение Docker для работы в непривилегированном (rootless) режиме
- Создание собственного реестра образов
- Создание и модификация собственных образов
- Создание образа из chroot-окружения
- Создание и модификация образа с помощью докерфайла
- Управление Docker-ом
- Загрузка образа в реестр
Установка и администрирование Docker в Astra Linux 1.7
При использовании ядра ОС с усиленной защитой (ядра hardened) использование непривилегированных контейнеров невозможно, так как в hardened ядре в целях повышения защищенности запрещено использование технологии user_namespaces (CONFIG_USER_NS), необходимой для работы непривилегированных контейнеров.
Данная статья применима к:
- Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7) с установленным обновлением БЮЛЛЕТЕНЬ № 2022-1110SE17 (оперативное обновление 1.7.3), РУСБ.10015-10, РУСБ.10015-17
- Astra Linux Special Edition РУСБ.10015-37 (очередное обновление 7.7)
Для более ранних обновлений Astra Linux см. статью: Установка docker в Астра Linux 1.6 и 2.12
Привилегированный и непривилегированный режимы работы Docker
Система контейнерной изоляции приложений Docker в Astra Linux Special Edition РУСБ.10015-01/РУСБ.10015-10 (очередное обновление 1.7) поддерживает два режима работы:
- привилегированный режим — выполнение службы контейнеризации docker с правами суперпользователя;
- непривилегированный (rootless) режим — выполнение службы контейнеризации docker в пользовательском пространстве имён. При использовании этого режима:
- служба контейнеризации работает как суперпользователь только с точки зрения приложения в контейнере;
- служба контейнеризации и контейнеры не получают прав суперпользователя в хостовой ОС;
Установка Docker
Установка Docker для работы в привилегированном режиме
В Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7) Docker представлен пакетом docker.io и может быть установлен с помощью Графический менеджер пакетов synaptic или из командной строки командой:
Установка должна выполняться от имени пользователя, являющегося администратором системы (при включенном МКЦ — пользователя с высоким уровнем целостности). После установки Docker рекомендуется предоставить администратору право работать с контейнерами не используя sudo. Для этого пользователя нужно включить в группу docker:
Для начала действия включения пользователя в группу обычно рекомендуется перезапустить пользовательскую сессию. В целях тестирования актуализировать включение пользователя в группу можно следующими командами (команда действуют только на активный терминал, и для выполнения команды понадобится ввести пароль пользователя):
Если пользовательская сессия не перезапускалась, то для последующего корректного запуска графических приложений желательно установить значения переменных окружения:
Запуск гипервизора контейнеров Docker на пониженном уровне целостности
В Astra Linux Special Edition предусмотрена возможность запуска гипервизора контейнеров Docker на пониженном уровне целостности. Для работы гипервизора выделен уровень целостности 2 (Виртуализация, Virtualization). Работа на пониженном уровне целостности не позволит коду, выполняемому в контейнерах, выполнять деструктивные действия. По умолчанию эта возможность не используется. Для переключения гипервизора контейнеров Docker на работу в режиме пониженной целостности выполнить команды:
Установка, включение и применение Docker для работы в непривилегированном (rootless) режиме
Данный режим является рекомендованным к применению. Режим поддерживается в обновлениях Astra Linux, содержащих Docker версии 20.10 и выше. Режим не поддерживается при использовании hardened ядра ОС.
Для использования Docker в rootless режиме следует установить пакет rootless-helper-astra:
После установки пакета необходимо включить пользовательские службы Docker для пользователей, которые будут использовать контейнеры Docker в rootless режиме:
Дальнейшее применение Docker пользователями возможно с помощью команды rootlessenv. Будучи запущена без параметров, эта команда предоставит пользователю командную оболочку, в которой пользователь сможет выполнять команды Docker от своего имени. При запуске с параметрами команда rootlessenv попытается интерпретировать указанные параметры как стандартные команды Docker, и выполнить их в пользовательском окружении. Все данные при этом будут сохраняться в домашнем каталоге пользователя. Например, создать образ для использования текущим пользователем можно командой:
sudo tar -C /var/docker-chroot -cpf — . | rootlessenv docker import — wiki/astralinux:se —change «ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin» —change ‘CMD [«/bin/bash»]’
От команд, описанных в статье Создание собственного образа Astra Linux для использования в Docker, приведенная выше команда отличается только использованием rootlessenv для выполнения команды docker import. При этом стандартная команда
запустит пользовательский образ. Далее в примерах используются команды в непривилегированном режиме. Для работы в привилегированном режиме rootlessenv должно быть везде заменено на sudo.
Создание собственного реестра образов
На момент написания статьи данная возможность в составе Astra Linux Special Edition сертификационные исследования не проходила.
- В Astra Linux Special Edition x.7 пакет docker-registry для создания собственных реестров образов доступен в составе базового репозитория (см. Репозитории Astra Linux Special Edition x.7: структура, особенности подключения и использования) и после подключения репозитория может быть установлен командой:
При установке пакета создается и запускается системная служба docker-registry.service, предоставляющая услуги репозитория образов. Управление службой осуществляется так же, как и другими системными службами;
rootless 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Создание и модификация собственных образов
Создание образа из chroot-окружения
Создание и модификация образа с помощью докерфайла
Подробное описание структуры и работы с докерфайлами доступно в справочной системе man:
Докер может создавать образы автоматически, получая инструкции из «докерфайла» и применяя их к «контексту». Докерфайл представляет собой текстовый файл, содержащий все инструкции которые понадобилось бы выполнить пользователю создавая образ. Команда docker build позволяет пользователям использовать для создания образов автоматические воспроизводимые сценарии, содержащие множество команд. Контекст представляет набор файлов в указанной локации. Локация контекста может быть задана как путь (PATH) в файловой системе или как ссылка (URL) на сетевой репозиторий Git. По умолчанию используется докерфайл с именем Dockerfile, расположенный в корне контекста.
Команда docker build выполняется системной службой (демоном) dockerd, при этом п олное содержимое контекста рекурсивно пересылается службе dockerd и может по мере надобности копироваться в создаваемый образ. Копирование выполняется командами, указанными в докерфайле.
Не используйте в качестве контекста корневой каталог файловой системы, так как в этом случае будет предпринята попытка передать всё содержимое файловой системы.
Перед началом выполнения инструкций, указанных в докерфайле, проводится проверка всех инструкций на корректность. Инструкции выполняются последовательно, и результат выполнения каждой инструкции фиксируется в отдельном слое. Рабочим каталогом по умолчанию является корневой каталог (может быть изменен инструкцией WORKDIR в докерфайле). Инструкции выполняются «построчно» без передачи контекста, т.е., например, при выполнении инструкций:
в первой инструкции команда pwd будет выполнена в каталоге /home, во второй инструкции команда pwd будет выполнена в рабочем каталоге, заданном по умолчанию.
Далее приведён пример сборки образа с помощью команды docker build. Сборка выполняется на основе ранее созданного образа wiki/astralinux:se (см. Создание собственного образа Astra Linux для использования в Docker). Порядок действий:
- Создать каталог контекста сборки и файлы этом каталоге:
Т.е. в контексте сборки создан файл с именем data-to-import и содержащий текст «Это импортированные данные» (без кавычек).
# указание из какого образа выполнять сборку FROM wiki/astralinux:se # скопировать файл data-to-import из контекста сборки в образ COPY data-to-import /srv # создать в образе пустой файл /srv/created-file RUN touch /srv/created-file # вывести на печать содержимое скопированного файла RUN cat /srv/data-to-import # вывести на печать рабочий каталог RUN echo Current work directory is $(pwd)
rootlessenv docker build -t test build-user/
Sending build context to Docker daemon 5.12kB
Step 1/5 : FROM wiki/astralinux:orel
—> 60d0611fe56a
Step 2/5 : COPY /data-to-import /srv
—> 7a75a002d29f
Step 3/5 : RUN touch /srv/created-file
—> Running in 709bb54af8c3
Removing intermediate container 709bb54af8c3
—> b5fd28178901
Step 4/5 : RUN cat /srv/data-to-import
—> Running in 4c69f455cf2f
Это импортированные данные
Removing intermediate container 4c69f455cf2f
—> c8f8c7c3797a
Step 5/5 : RUN echo Current work directory is $(pwd)
—> Running in 27db5fcaaba5
Current work directory is /
Removing intermediate container 27db5fcaaba5
—> 14446097a09e
Successfully built 14446097a09e
Successfully tagged test:latestНа шаге 4 выводится содержимое скопированного из контекста файла, на шаге 5 выводится рабочий каталог;
rootlessenv docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test latest 14446097a09e 2 minutes ago 290MB
wiki/astralinux orel 60d0611fe56a About an hour ago 290MB
busybox latest b97242f89c8a 7 days ago 1.23MBrootlessenv docker run —rm -it test
root@978a4cc9fbd8:/# ls -l /srv
total 4
-rw-r—r— 1 root root 0 Jan 20 10:12 created-file
-rw-r—r— 1 root root 51 Jan 20 10:11 data-to-import
root@978a4cc9fbd8:/# cat /srv/data-to-import
Это импортированные данные
root@978a4cc9fbd8:/# exit
exitВ контейнере в каталоге /srv присутствует скопированный в образ файл data-to-import содержащий текст «Это импортированные данные» и созданный при создании образа пустой файл created-file.
Управление Docker-ом
Подробная справка по командному интерфейсу Docker представлена на сайте разработчиков: https://docs.docker.com/engine/reference/commandline/docker/. При работе в системе список команд можно получить с помощью команды:
Более подробную справку по аргументам команд можно получить с помощью ключа —help, или с помощью справочной системы man, например:
docker container create создать новый контейнер docker container exec выполнить команду в активном контейнере docker container run выполнить команду в новом контейнере docker container start активировать контейнер (контейнеры) docker container stop деактивация контейнера Выполнить команду в новом контейнере, то есть: создать в существующем образе новый изменяемый слой, и выполнить команду, сохраняя изменения в этом слое
docker run —rm удалить новый (изменённый) слой после деактивации контейнера, т.е. сохранить образ неизменным Загрузка образа в реестр
На момент написания статьи данная возможность в составе Astra Linux Special Edition сертификационные исследования не проходила.
Получить список доступных на локальной машине образов:
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.3kBsudo 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