Docker

Редактировал(а) atsarkov 21.06.2024 13:06

Установка

sudo apt install docker.io

Добавить пользователя в группу docker, перелогиниться.

sudo usermod -aG docker ПОЛЬЗОВАТЕЛЬ

Работа в условиях замкнутой программной среды (ЗПС)

Особенности работы docker-контейнеров в ОС ОСнова в условиях замкнутой программной среды (ЗПС) состоят в следующем:

Если контейнер не базируется на ОС ОСнова, для работы в режиме ЗПС, все его содержимое должно быть подписано. Это возможно сделать через наложение дампа:

setfattr --restore=<файл дампа>

либо через подпись всех файлов экспортированного контейнера с последующей запаковкой (с учетом расширенных атрибутов) и импортом.
Например, рассмотрим Alpine Linux :

docker pull alpine
mkdir /tmp/alpine
cd /tmp/alpine
docker export - alpine | tar - -x
for f in `find . -type f`
do
sudo evmctl -k <закрытый ключ> ima_sign $f
done
sudo tar --xattrs-include=user.pax.flags --xattrs-include=security.ima \
 --xattrs-include=security.NESSCTX \  
 -C /tmp/alpine -c . | docker import - alpine-signed

Работа в условиях механизма зашиты памяти MPROTECT

В контейнерах, которые не базируются на ОС ОСнова, некоторое ПО, например Java, не будет функционировать корректно на хосте под управлением ОС ОСнова с включенным механизмом защиты памяти MPROTECT. Существует несколько способов решения данной проблемы:

  1. Полное отключение механизма защиты памяти MPROTECT путем добавления параметра mprotect=off в командную строку ядра.
  2. Установка в контейнер paxrat или ручная разметка исключений через:
sudo setfattr -n user.pax.flags -v m <filename>

или через наложение дампа:

sudo setfattr --restore=<dump>
  1. Использование (если в ОС образа контейнера отсутствует paxrat) устаревших утилит paxctl и/или chpax; Пример настройки Alpine и paxctl . Например, следующие инструкции в Dockerfile устанавливают paxctl, Java и проставляют исключение MPROTECT на файл /usr/bin/java:
FROM alpine
RUN apk update
RUN apk add paxctl
RUN apk add openjdk10
RUN paxctl -cm /usr/bin/java
  1. Запуск всех контейнеров с контекстом, отключающим механизм защиты памяти MPROTECT. Для этого в файле /lib/systemd/system/docker.service в конце секции [Service] дописать:
NESSCTX=t=30,50

И перечитать конфигурацию, перезапустить docker.

sudo systemctl daemon-reload
sudo systemctl restart docker

Создание docker-образа на базе ОС ОСнова

Для создания docker-образа на базе ОС ОСнова требуется наличие первого установочного диска, или его iso образа, или доступ к сетевому репозиторию (в этом случае диск не монтируется, в приведенной команде debootstrap заменить /mnt на адрес репозитория, например https://dl.nppct.ru/onyx/stable/repos/).

Создание docker-образа:

sudo apt install debootstrap
sudo mount /dev/cdrom /mnt
(или sudo mount -o loop onyx-Version-disk1.iso /mnt)
mkdir /tmp/image
cd /tmp/image
sudo debootstrap --variant=minbase --keyring /usr/share/apt/osnova.gpg  --components=main,contrib,non-free onyx onyx file:///mnt
sudo tar --xattrs-include=user.pax.flags --xattrs-include=security.ima --xattrs-include=security.NESSCTX  -C onyx/ -c . | sudo docker import - onyx
sudo umount /mnt

Запуск контейнера:

docker run -it --rm onyx bash