Общую информацию об особенностях системы изоляции приложений docker см. в статье Система изоляции приложений docker в ОС Astra Linux Special Edition 1.7.
При использовании ядра ОС с усиленной защитой (ядра hardened) использование непривилегированных контейнеров невозможно, так как в hardened ядре в целях повышения защищенности запрещено использование технологии user_namespaces (CONFIG_USER_NS), необходимой для работы непривилегированных контейнеров.
См. также:
Данная статья применима к:
- Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.8)
- 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
Для того, чтобы работало ограничение объема памяти, предоставляемой контейнерам Docker, следует:
К параметрам загрузки ядра в файле /etc/default/grub в строку значений параметра GRUB_CMDLINE_LINUX_DEFAULT добавить параметры:
cgroup_enable=memory swapaccount=1
Например:
GRUB_CMDLINE_LINUX_DEFAULT="parsec.max_ilev=63 quiet net.ifnames=0 libata.force=noncq net.ifnames=0 cgroup_enable=memory swapaccount=1"
Выполнить команду:
sudo update-grub- Перезагрузить ОС.
Для запуска контейнера с ограничением предоставляемой памяти использовать опцию --memory, например:
sudo docker run -it --memory 100m alpine /bin/sh
Запуск гипервизора контейнеров Docker на пониженном уровне целостности
В Astra Linux Special Edition начиная с очередного обновления x.7 предусмотрена возможность запуска гипервизора контейнеров Docker на пониженном уровне целостности. Для работы гипервизора выделен уровень целостности 2 (Виртуализация, Virtualization). Работа на пониженном уровне целостности не позволит коду, выполняемому в контейнерах, выполнять деструктивные действия. По умолчанию эта возможность не используется. Для переключения гипервизора контейнеров Docker на работу в режиме пониженной целостности выполнить следующие команды:
sudo systemctl restart containerd.service
sudo systemctl restart docker.service
Для отключения работы гипервизора контейнеров Docker на пониженном уровне МКЦ выполнить команды:
sudo systemctl restart containerd.service
sudo systemctl restart docker.service
Установка, включение и применение Docker для работы в непривилегированном (rootless) режиме
Данный режим является рекомендованным к применению. Режим поддерживается в обновлениях Astra Linux, содержащих Docker версии 20.10 и выше. Режим не поддерживается при использовании hardened ядра ОС.
Для использования Docker в rootless режиме следует установить пакет rootless-helper-astra:
После установки пакета необходимо включить пользовательские службы Docker для пользователей, которые будут использовать контейнеры Docker в rootless режиме:
При необходимости, разрешить автоматический запуск этих служб:
Создание собственного реестра образов
Создание и модификация собственных образов
Создание образа из chroot-окружения
Простой пример создания собственного образа см. в статье Создание собственного образа Astra Linux для использования в Docker.
Создание и модификация образа с помощью докерфайла
Подробное описание структуры и работы с докерфайлами доступно в справочной системе man:
man docker-build
Команда docker build выполняется системной службой (демоном) dockerd, при этом полное содержимое контекста рекурсивно пересылается службе dockerd и может по мере надобности копироваться в создаваемый образ. Копирование выполняется командами, указанными в докерфайле.
Перед началом выполнения инструкций, указанных в докерфайле, проводится проверка всех инструкций на корректность. Инструкции выполняются последовательно, и результат выполнения каждой инструкции фиксируется в отдельном слое. Рабочим каталогом по умолчанию является корневой каталог (может быть изменен инструкцией WORKDIR в докерфайле). Инструкции выполняются "построчно" без передачи контекста, т.е., например, при выполнении инструкций:
RUN pwd
Далее приведён пример сборки образа с помощью команды docker build. Сборка выполняется на основе ранее созданного образа wiki/astralinux:se (см. Создание собственного образа Astra Linux для использования в Docker). Порядок действий:
Создать каталог контекста сборки и файлы этом каталоге:
mkdir build-userТ.е. в контексте сборки создан файл с именем data-to-import и содержащий текст "Это импортированные данные" (без кавычек).
echo "Это импортированные данные" > build-user/data-to-importВ файл build-user/Dockerfile внести следующие данные:
# указание из какого образа выполнять сборку 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)
Выполнить сборку образа с тегом test:
rootlessenv docker build -t test build-user/На шаге 4 выводится содержимое скопированного из контекста файла, на шаге 5 выводится рабочий каталог;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
Убедиться, что образ test появился в списке образов:
rootlessenv docker imagesREPOSITORY 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.23MB
Запустить контейнер из образа и проверить содержимое:
rootlessenv docker run --rm -it testВ контейнере в каталоге /srv присутствует скопированный в образ файл data-to-import содержащий текст "Это импортированные данные" и созданный при создании образа пустой файл created-file.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
Управление Docker-ом
Подробная справка по командному интерфейсу Docker представлена на сайте разработчиков: https://docs.docker.com/engine/reference/commandline/docker/. При работе в системе список команд можно получить с помощью команды:
man docker-attach
Команда | Краткое описание | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
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 | Ожидание завершения работы контейнера (контейнеров) и вывод кодов завершения |