Docker#
Docker — это одновременно платформа и технология для контейнеризации. Она позволяет создавать контейнеры и управлять ими для развертывания и доставки кода на целевую систему.
Приложение, развернутое с помощью Docker, будет работать одинаково в любой системе, где он установлен. Для этого требуется создавать контейнер, в котором будет содержатся весь код приложения с зависимостями и среда выполнения. При запуске Docker изолирует приложения друг от друга и от хостовой системы, что обеспечивает высокий уровень безопасности и предотвращает конфликты зависимостей.
В статье показано, как установить Docker в Astra Linux и приведен пример запуска образа из репозитория.
1. Установка Docker#
В состав ОС Astra Linux Special Edition (ALSE) входит программное обеспечение Docker. Ниже описана рекомендуемая установка с помощью менеджера пакетов APT (из репозиториев ALSE). В таблице приведен список версий и очередных обновлений ALSE.
Таблица доступных версий Docker из репозиториев ALSE
ALSE |
Debian |
Docker |
---|---|---|
1.8 |
12 (Bookworm) |
25.0.5 |
1.7 |
10 ( Buster) |
20.10.2 - 24.0.2 |
Пакет Docker Desktop не доступен из репозиториев AL, его установка аналогична установке на Debian совместимой версии (подробнее см. по ссылке).
Из репозиториев ALSE доступен инструмент Docker Compose (версии 1.29). Информацию о всех доступных компонентах Docker из репозиториев AL можно посмотреть с помощью команды:
sudo apt search docker
Docker в ALSE 1.7 и 1.8 поддерживает два режима работы:
привилегированный режим - выполнение службы контейнеризации docker с правами суперпользователя;
непривилегированный режим (рекомендуемый) - выполнение службы контейнеризации docker в пользовательском пространстве имён. При использовании этого режима:
служба контейнеризации работает как суперпользователь только с точки зрения приложения в контейнере;
служба контейнеризации и контейнеры не получают прав суперпользователя в хостовой ОС;
Подробнее об особенностях и режимах работы можно посмотреть в статье “Установка и администрирование Docker в Astra Linux Special Edition”.
1.1. Установка Docker для работы в привилегированном режиме#
Для установки Docker на ALSE 1.7 и 1.8 требуется выполнить команды ниже:
sudo apt install docker.io
После установки возможно добавить пользователя в группу docker, что позволит работать с Docker без использования sudo.
Для включения пользователя в группу docker выполнить команду:
sudo usermod -aG docker <имя_пользователя>
Текущего пользователя можно включить в группу командой:
sudo usermod -aG docker $USER
Для применения действия необходимо выйти из текущей сессии пользователя и зайти повторно.
Ограничение объема памяти, предоставляемой контейнерам Docker#
Для того, чтобы работало ограничение объема памяти, предоставляемой контейнерам Docker, следует:
1. К параметрам загрузки ядра в файле
/etc/default/grub в строку значений параметра GRUB_CMDLINE_LINUX_DEFAULT
добавить параметры: bash 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. Выполнить команду: bash sudo update-grub
3. Перезагрузить ОС.
Для запуска контейнера с ограничением предоставляемой памяти использовать опцию –memory, например:
sudo docker run -it --memory 100m alpine /bin/sh
Запуск Docker на пониженном уровне целостности#
В ALSE начиная с очередного обновления 1.7 предусмотрена возможность запуска гипервизора контейнеров Docker на пониженном уровне целостности. Для работы гипервизора выделен уровень целостности 2 (Виртуализация, Virtualization). Работа на пониженном уровне целостности не позволит коду, выполняемому в контейнерах, выполнять деструктивные действия. По умолчанию эта возможность не используется. Для переключения гипервизора контейнеров Docker на работу в режиме пониженной целостности выполнить следующие команды:
sudo astra-docker-isolation enable
sudo systemctl restart containerd.service
sudo systemctl restart docker.service
При этом перезапуск служб должен выполняться отдельными командами.
Для отключения работы гипервизора контейнеров Docker на пониженном уровне МКЦ выполнить команды:
sudo astra-docker-isolation disable
sudo systemctl restart containerd.service
sudo systemctl restart docker.service
1.2. Установка, включение и применение Docker для работы в непривилегированном (rootless) режиме#
Данный режим является рекомендованным к применению. Режим поддерживается в обновлениях AL, содержащих Docker версии 20.10 и выше. Режим не поддерживается при использовании hardened ядра ОС.
Для использования Docker в rootless режиме следует установить пакет rootless-helper-astra:
sudo apt install rootless-helper-astra
При выполнении команды выше если ранее не был установлен пакет docker.io, он установится автоматически.
После установки пакета необходимо включить пользовательские службы Docker для пользователей, которые будут использовать контейнеры Docker в rootless режиме:
sudo systemctl start rootless-docker@<имя_пользователя>@<метка_безопасности>
Где - метка безопасности, с которой должна быть запущена служба, например, нулевая метка 0:0:0:0. Метка безопасности при этом не может превышать максимальную метку безопасности пользователя. Если метка не указана явно, то будет использована метка безопасности текущей пользовательской сессии.
При необходимости, разрешить автоматический запуск этих служб:
sudo systemctl enable rootless-docker@<имя_пользователя>@<метка_безопасности>
Дальнейшее использование 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 docker images
покажет список только образов, принадлежащих текущему пользователю, а команда:
rootlessenv docker run --rm -ti astralinux:se
запустит пользовательский образ.
2. Проверка установки#
Для просмотра информации о версии Docker используется команда
docker --version
. Общие сведения об установленных образах и
запущенных процессах Docker можно посмотреть командой docker info
.
В качестве проверки можно запустить образ hello-world (минимальный образ, предназначенный для подтверждения корректности установки Docker) командой:
docker run hello-world
При успешной работе Docker будет выведено подтверждающее сообщение или строка с информацией о типе ошибки.
Для выполнения команды выше требуется подключения к интернету для загрузки тестового образа.
2.1 Проблемы установки#
Ошибка запуска Docker Daemon#
Если при запуске тестового образа появляется сообщение “Is the docker daemon running?”, следует проверить статус Docker Daemon:
sudo systemctl status docker
Если статус inactive (dead), необходимо запустить демона командой ниже:
sudo systemctl start docker
Ошибка доступа#
При появлении сообщения “Permission denied”, следует добавить пользователя в группу docker командой:
sudo usermod -aG docker $USER
Для начала действия включения пользователя в группу необходимо перезапустить пользовательскую сессию.
Ошибка конфигурации#
При возникновении ошибки “Error response from daemon” следует изучить логи для выявления ошибок:
journalctl -u docker.service
Исходя из логов рекомендуется обратится к официальной документации Docker или переустановить Docker.
3. Использование Docker в ALSE#
3.1. Docker образы для разработки#
Для разработки предложены три типа докер образов ALSE (подробную информацию см. по ссылке):
Standard – базовая ОС Astra Linux Special Edition и стандартные утилиты из базовой системы.
Multi-service (init) – базовая ОС Astra Linux Special Edition с системой инициализации systemd.
Dev – базовая ОС Astra Linux Special Edition и окружение для одного из языков программирования.
Поддерживаются следующие языки программирования (указаны версии из базовых репозиториев):
Языки программирования |
ALSE 1.7.4 |
ALSE 1.7.5 |
ALSE 1.8.0 |
---|---|---|---|
Golang |
2:1.15~1 |
2:1.19~1 |
2:1.21~2.astra1 |
NodeJS |
10.24.0~dfsg-1~deb10u3 |
18.13.0+dfsg1-1 |
|
OpenJDK |
11.0.18+10-1~deb10u1+b1 |
17.0.10+7-1~deb12u1 |
|
Python |
3.7.3-1 |
3.11.2-1 |
|
Ruby |
1.2.5-1 |
1:3.1 |
Образы доступны для скачивания по ссылке. После выбора подходящего образа предлагается скопировать команду для скачивания следующего вида:
podman pull registry.astralinux.ru/library/astra/ubi...
Предложенные контейнеры имеют стандарт Open Container Initiative (OCI), что обеспечивает совместимость с образами docker. Для работы с контейнером с помощью Docker необходимо заменить podman на docker в команде выше.
Например, для загрузки образа с ALSE 1.7 и окружением python нужно
выполнить команду:
bash docker pull registry.astralinux.ru/library/astra/ubi17-python
Для запуска образа с python окружением, необходимо выполнить команду:
bash docker run -it registry.astralinux.ru/library/astra/ubi17-python
Для запуска базового образа ALSE 1.8 c доступом к командной оболочке
внутри контейнера необходимо выполнить команду:
bash docker run -it registry.astralinux.ru/library/astra/ubi18 bash
Сведения о Podman и его работе в ALSE можно посмотреть по ссылке.
Создание собственного образа AL для использования в Docker#
Докер образы представляют собой исполняемый пакет, содержащий все необходимое для запуска приложения: код, среду выполнения, библиотеки, переменные окружения и файлы конфигурации. Использование собственных образов приложений имеет ряд преимуществ при разработке. Ниже предложены два метода создания образов: 1. Создание образа из chroot-окружения (подробнее см. в статье Создание собственного образа Astra Linux для использования в Docker. 1. Создание и модификация образа с помощью докерфайла (подробнее см. в статье Установка и администрирование Docker в ALSE.
Создание и модификация образа с помощью докерфайла#
Dockerfile — текстовый файл, содержащий набор инструкций для автоматической сборки образа Docker. Содержит шаги, необходимые для создания и настройки образа, включая установку программного обеспечения, копирование файлов и выполнение команд. Dockerfile используется для автоматизации процесса создания образов, что упрощает разработку, тестирование и развертывание приложений. Информацию о примере создания Dockerfile для ALSE и оптимизации работы контейнера можно посмотреть здесь.
Пример создания простого образа на основе ранее базового образа wiki/astralinux:se. Задача образа — хранение файла data-to-import в каталоге build-user.
Создать каталог контекста сборки и файлы этом каталоге:
mkdir build-user
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:
docker build -t test build-user/
Убедиться, что образ test появился в списке образов:
docker images
Запустить контейнер из образа и проверить содержимое:
docker run --rm -it test
3.2. Управление Docker-образами#
Подробная справка по командному интерфейсу Docker представлена на сайте разработчиков: https://docs.docker.com/engine/reference/commandline/docker/. При работе в системе список команд можно получить с помощью команды:
docker help
Более подробную справку по аргументам команд можно получить с помощью ключа –help, или с помощью справочной системы man, например:
docker attach --help
man docker-attach
Получить список доступных на локальной машине образов:
docker images
Поcмотреть статусы контейнеров на локальной машине:
docker ps -a
Для идентификации контейнеров используются либо их числовые идентификаторы (CONTAINER ID) либо имена (NAMES).
Команда docker build позволяет пользователям использовать для создания образов автоматические воспроизводимые сценарии, содержащие множество команд. Пример сборки образа с тегом test из текущего каталога:
docker build -t test .
Не используйте в качестве контекста корневой каталог файловой системы, так как в этом случае будет предпринята попытка передать всё содержимое файловой системы.
Для запуска контейнера из загруженного образа используется docker-команда run, например:
docker run -it --rm registry.astralinux.ru/library/alse:1.7.4 /bin/bash
Для запуска контейнера в фоновом режиме используется опция docker-команды -d:
docker run -d <имя_образа>
При запуске контейнера к его файловой системе может быть примонтирован каталог из файловой системы хост-машины. Для это используется опция –mount, например:
docker run --mount type=bind,source=<монтируемый_каталог>,target=<точка_монтирования> <имя_образа>
Для запуска сохраненного контейнера используется docker-команда start, например:
docker start <идентификатор_контейнера>
Подробнее о запуске приложения в контейнере и просмотре логов можно посмотреть в статье.
Для остановки контейнера используется docker-команда stop:
docker stop <идентификатор_контейнера>
Удаление контейнера производится командой:
docker rm <идентификатор_контейнера>
Перед удалением контейнер должен быть остановлен.
3.3. Получение информации о контейнере, журналов контейнера, статистики работы контейнеров#
Подробную информацию об установленном контейнере можно получить командой:
docker inspect <идентификатор_контейнера>
Для отображения конкретного параметра из представленных данных выше, например, сетевого адреса контейнера, можно использовать опцию –format.
docker inspect <идентификатор_контейнера> --format '{{.NetworkSettings.IPAddress}}'
Просмотр журналов контейнера:
docker logs <идентификатор_контейнера>
Для получения статистики работы контейнеров используется docker-команда stats:
docker stats
Выводится статистика с заданным интервалом (по-умолчанию - 5 секунд). Для однократного вывода статистики с последующим завершением работы необходимо использовать опцию –no-stream:
docker stats --no-stream
3.4. Работа с Docker Compose#
Docker Compose позволяет управлять набором контейнеров, каждый из которых представляет собой сервис приложения. Управление включает в себя сборку, запуск с учетом зависимостей и конфигурацию. Конфигурация Docker Compose описывается в файле docker-compose.yml, лежащем в корне проекта.
Пример файла docker-compose.yml
:
version: "3" # версия схемы (зависит от установленной версии docker)
services: # список сервисов приложения
app: # имя сервиса
build:
context: . # контекст для сборки образа
dockerfile: Dockerfile # имя Docker-файла, из которого будет собран образ
command: make start # команда, которая будет выполнена после старта сервиса
ports: # проброс портов
- "3000:8000"
volumes: # список томов, подключаемые к файловой системе сервиса
- ".:/app" # текущая директория пробрасывается в директорию /app внутри контейнера
- "/tmp:/tmp" # местоположение директории на стороне сервиса указывается после ":"
depends_on: # указание требуемых запущенных сервисов
- db
db: # имя сервиса
image: postgres:latest # имя используемого образа
environment: # задание переменных окружения
POSTGRES_PASSWORD: password
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
Для сборки сервисов, описанных в конфигурационных файлах docker-compose.yml и Dockerfile, используется команда:
docker compose build
Запуск собранных сервисов (для запуска в фоновом режиме нужно использовать параметр -d):
docker compose up
Запуск приложения с остановкой всех сервисов при завершении работы какой-либо сервиса:
docker compose up --abort-on-container-exit
Запуск сервиса application и выполнение внутри команды make install:
docker compose run application make install
Запуск сервиса и подключение к нему с помощью bash:
docker compose run application bash
С флагом –rm запускаемые контейнеры будут автоматически удаляться после завершения:
docker compose run --rm application bash
Останавка и удаление всех сервисов, которые были запущены с помощью up
docker compose down
Останавка без удаления сервисов, запущенных с помощью up:
docker compose stop
Запустить остановленные контейнеры снова можно с помощью команды docker-compose start.
Перезапуск всех остановленных и запущенных сервисов:
docker compose restart
4. Особенности работы в Astra Linux Special Edition#
Выполнение команд docker с нулевой меткой безопасности от имени других учетных записей#
Для выполнения команд docker от имени других учетных записей можно использовать конструкцию:
sudo -u <имя_пользователя> -H -i podman <podman-команда>
где: * -u — опция, определяющая от имени какого пользователя (целевого пользователя) будет выполнена команда; * -H — опция, присваивающая переменной HOME значение домашнего каталоге целевого пользователя; * -i — опция, обеспечивающая перед выполнением команды переход в домашний каталог целевого пользователя.
Выполнение команд docker с ненулевой меткой безопасности от имени других учетных записей#
Для присвоения ненулевой метки безопасности используется команда pdp-exec:
sudo pdp-exec -u macuser -l "1:0:0:0" -- bash -c 'HOME=/home/.pdp/macuser/l1i0c0x0t0x0 ; TMP=/var/private/tmp/l1i0c0x0t0x0 ; cd $HOME ; docker images'