Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Оглавление

Общую информацию об особенностях системы изоляции приложений docker см. в статье Система изоляции приложений docker в ОС Astra Linux Special Edition 1.7.

Предупреждение

При использовании ядра ОС с усиленной защитой (ядра hardened) использование непривилегированных контейнеров невозможно, так как в hardened ядре в целях повышения защищенности запрещено использование технологии user_namespaces (CONFIG_USER_NS), необходимой для работы непривилегированных контейнеров.

См. также:


Информация
titleДанная статья применима к:
  • 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 или из командной строки командой:

Command
sudo apt install docker.io

Установка должна выполняться от имени пользователя, являющегося администратором системы (при включенном МКЦ - пользователя с высоким уровнем целостности). После установки Docker рекомендуется предоставить администратору право работать с контейнерами не используя sudo. Для этого пользователя нужно включить в группу docker:

Command
sudo usermod -aG docker $USER

Аналогично в группу docker следует включить других пользователей, которые будут работать с docker. 

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

Command

exec su - $USER

Если пользовательская сессия не перезапускалась, то для последующего корректного запуска графических приложений желательно установить значения переменных окружения:

Command
export DISPLAY=:0 HOME=/home/$USER HOSTNAME=`hostname`


Ограничение объема памяти, предоставляемой контейнерам Docker

Для того, чтобы работало ограничение объема памяти, предоставляемой контейнерам Docker, следует:

  1. К параметрам загрузки ядра в файле /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"


  2. Выполнить команду:

    Command
    sudo update-grub


  3. Перезагрузить ОС.

Для запуска контейнера с ограничением предоставляемой памяти использовать опцию --memory, например:

Command
sudo docker run -it  --memory 100m alpine /bin/sh

Запуск гипервизора контейнеров Docker на пониженном уровне целостности

В Astra Linux Special Edition начиная с очередного обновления x.7 предусмотрена возможность запуска гипервизора контейнеров Docker на пониженном уровне целостности. Для работы гипервизора выделен уровень целостности 2 (Виртуализация, Virtualization). Работа на пониженном уровне целостности не позволит коду, выполняемому в контейнерах,  выполнять деструктивные действия. По умолчанию эта возможность не используется. Для переключения гипервизора контейнеров Docker на работу в режиме пониженной целостности выполнить следующие команды:

Command
sudo astra-docker-isolation enable
sudo systemctl restart containerd.service
sudo systemctl restart docker.service

При этом перезапуск служб должен выполняться отдельными командами.

Для отключения работы гипервизора контейнеров Docker на пониженном уровне МКЦ выполнить команды:

Command

sudo astra-docker-isolation disable
sudo systemctl restart containerd.service
sudo systemctl restart docker.service


Установка, включение и применение Docker для работы в непривилегированном (rootless) режиме

Информация

Данный режим является рекомендованным к применению. Режим поддерживается в обновлениях Astra Linux, содержащих Docker версии 20.10 и выше. Режим не поддерживается при использовании hardened ядра ОС.

Для использования Docker в rootless режиме следует установить пакет rootless-helper-astra:

Command

sudo apt install rootless-helper-astra

при этом если ранее не был установлен пакет docker.io, то он установится автоматически.

После установки пакета необходимо включить пользовательские службы Docker для пользователей, которые будут использовать контейнеры Docker в rootless режиме:

Command
sudo systemctl start rootless-docker@<имя_пользователя>@<метка_безопасности>

Где <метка_безопасности> - метка безопасности, с которой должна быть запущена служба, например, нулевая метка 0:0:0:0. Метка безопасности при этом не может превышать максимальную метку безопасности пользователя. Если метка не указана явно, то будет использована метка безопасности текущей пользовательской сессии. 

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

Command
sudo systemctl enable rootless-docker@<имя_пользователя>@<метка_безопасности>

Дальнейшее применение Docker пользователями возможно с помощью команды rootlessenv. Будучи запущена без параметров, эта команда предоставит пользователю командную оболочку, в которой пользователь сможет выполнять команды Docker от своего имени. При запуске с параметрами команда rootlessenv попытается интерпретировать указанные параметры как стандартные команды Docker, и выполнить их в пользовательском окружении. Все данные при этом будут сохраняться в домашнем каталоге пользователя. Например, создать образ для использования текущим пользователем можно командой:

Command
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.  При этом стандартная команда 

Command
rootlessenv docker images

покажет список только образов, принадлежащих текущему пользователю, а команда:

Command
rootlessenv docker run --rm -ti astralinux:se

запустит пользовательский образ. Далее в примерах используются команды в непривилегированном режиме. Для работы в привилегированном режиме rootlessenv должно быть везде заменено на sudo.

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

Предупреждение
На момент написания статьи данная возможность в составе Astra Linux Special Edition сертификационные исследования не проходила.


Раскрыть
  1. В Astra Linux Special Edition x.7 пакет docker-registry для создания собственных реестров образов доступен в составе базового репозитория (см. Репозитории Astra Linux Special Edition x.7: структура, особенности подключения и использования) и после подключения репозитория может быть установлен командой:

    Command
    sudo apt install docker-registry

    При установке пакета создается и запускается системная служба docker-registry.service, предоставляющая услуги репозитория образов. Управление службой осуществляется так же, как и другими системными службами;

  2. В более ранних обновлениях Astra Linux для создания собственного реестра образов следует установить docker и загрузить docker-образ, содержащий приложение "Реестр образов Docker". Docker-образ "Реестр образов Docker" загружается из общедоступного реестра образов Docker:

    Command
    Titlerootless 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

    После выполнения указанной команды локальный реестр образов автоматически запущен и готов к работе. Управление работой контейнера реестра осуществляется так же как управление любым другим контейнером. Например:

    1. Остановка работы реестра:

      Command
      rootless docker container stop registry


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

      Command
      rootless docker container stop registry && sudo docker container rm -v registry


Создание и модификация собственных образов

Создание образа из chroot-окружения

Простой пример создания собственного образа см. в статье Создание собственного образа Astra Linux для использования в Docker.

Создание и модификация образа с помощью докерфайла

Подробное описание структуры и работы с докерфайлами доступно в справочной системе man:

Command
man dockerfile
man docker-build

Докер может создавать образы автоматически, получая инструкции из файла (докерфайла) и применяя их к "контексту". Докерфайл представляет собой текстовый файл, содержащий все инструкции которые понадобилось бы выполнить пользователю создавая образ. Команда docker build позволяет пользователям использовать для создания образов автоматические воспроизводимые сценарии, содержащие множество команд. Контекст представляет набор файлов в указанной локации. Локация контекста может быть задана как путь (PATH) в файловой системе или как ссылка (URL) на сетевой репозиторий Git. По умолчанию используется докерфайл с именем Dockerfile, расположенный в корне контекста.

Команда docker build выполняется системной службой (демоном) dockerd, при этом полное содержимое контекста рекурсивно пересылается службе dockerd и может по мере надобности копироваться в создаваемый образ. Копирование выполняется командами, указанными в докерфайле.

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

Перед началом выполнения инструкций, указанных в докерфайле, проводится проверка всех инструкций на корректность. Инструкции выполняются последовательно,  и результат выполнения каждой инструкции фиксируется в отдельном слое. Рабочим каталогом по умолчанию является корневой каталог (может быть изменен инструкцией WORKDIR в докерфайле). Инструкции выполняются "построчно" без передачи контекста, т.е., например, при выполнении инструкций:

Command
RUN cd /home ; pwd
RUN pwd

в первой инструкции команда pwd будет выполнена в каталоге /home, во второй инструкции команда pwd будет выполнена в рабочем каталоге, заданном по умолчанию.

Далее приведён пример сборки образа с помощью команды docker build. Сборка выполняется на основе ранее созданного образа wiki/astralinux:se (см. Создание собственного образа Astra Linux для использования в Docker). Порядок действий:

  1. Создать каталог контекста сборки и файлы этом каталоге:

    Command
    mkdir build-user
    echo "Это импортированные данные" > build-user/data-to-import

    Т.е. в контексте сборки создан файл с именем data-to-import и содержащий текст "Это импортированные данные" (без кавычек).

  2. В файл 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)

     

  3. Выполнить сборку образа с тегом test:

    Command
    Titlerootlessenv 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 выводится рабочий каталог;

  4. Убедиться, что образ test появился в списке образов:

    Command
    Titlerootlessenv 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.23MB


  5. Запустить контейнер из образа и проверить содержимое:

    Command
    Titlerootlessenv 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/. При работе в системе список команд можно получить с помощью команды:

Command
docker help

Более подробную справку по аргументам команд можно получить с помощью ключа --help, или с помощью справочной системы man, например:

Command
docker attach --help
man docker-attach

Часто употребляемые команды (аргументы команд для краткости не указаны):

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

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Ожидание завершения работы контейнера (контейнеров) и вывод кодов завершения

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

Предупреждение
На момент написания статьи данная возможность в составе Astra Linux Special Edition сертификационные исследования не проходила.


Раскрыть

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

Command
Titlesudo 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) для загрузки в нужный реестр:

Command
sudo docker tag wiki/astralinux:se17rc5 localhost:5000/se17rc5

Перепроверить список доступных образов, чтобы убедиться, что тег присвоен верно:

Command
Title 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.

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

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



...