2.9.16.1 Установка и настройка docker
Установка docker
Доступ к среде контейнеризации
Команды docker
Настройка зеркал общедоступного хранилища образов Docker Hub
Реестр образов РЕД ОС
Базовые образы
Настройка собственного локального реестра docker-образов
Установка и настройка локального реестра docker-образов из репозитория РЕД ОС
Настройка локального реестра образов путем создания контейнера в docker
Загрузка docker-образов в локальный реестр
Настройка контейнеров для автоматического запуска в systemd
Установка Portainer
Установка Portainer из репозитория РЕД ОС
Установка Portainer путем создания контейнера в Docker
Автоматизированное создание контейнера
Окружение
- Версия РЕД ОС: 7.3
- Редакция ОС: Все
- Конфигурация: Сервер графический
- Версия ПО: docker-ce-4:20.10.24-1, docker-ce-cli-1:20.10.24-1, registry-2.8.2-1, portainer-ce-2.18.3-2
Docker — программное обеспечение для автоматизации развертывания и управления приложениями в средах с поддержкой контейнеризации. Позволяет "упаковать" приложение со всем его окружением и зависимостями в контейнер, который может быть развернут на любой Linux-подобной системе с поддержкой контрольных групп в ядре, а также предоставляет набор команд для управления этими контейнерами.
Установка docker
Для установки средства контейнеризации необходимо выполнить команду (потребуются права администратора):
dnf install docker-ce docker-ce-cli
После успешной установки необходимо запустить сервис контейнеризации docker и добавить его в автозагрузку:
systemctl enable docker --now
Убедитесь, что сервис запущен, проверив статус запущенной службы:
systemctl status docker
В статусе должно быть отображено active (running).
Для получения информации об установленном docker выполните команду:
docker info
При корректной настройке будет получен соответствующий ответ от сервиса Docker.
Доступ к среде контейнеризации
По умолчанию доступ к среде контейнеризации и запуску сервисов имеет только суперпользователь. Демон docker подключается к сокету Unix, к которому также имеет доступ только суперпользователь.
Для использования и управления средой контейнеризации обычным пользователем необходимо добавить его в отдельную группу, пользователям которой будет разрешено выполнять необходимые манипуляции. Такая группа создается в процессе установки среды контейнеризации и имеет название docker.
Добавьте необходимого пользователя в группу docker командой:
usermod -aG docker <имя_пользователя>Проверить назначенные права можно, выполнив загрузку тестового образа с правами обычного пользователя:
docker info
При корректной настройке будет получен соответствующий ответ от сервиса Docker.
Команды docker
Часто используемые команды (аргументы команд для краткости не указаны):
Команда | Краткое описание |
| 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 | Cоздать файловую систему образа из архива. |
| 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 | Ожидание завершения работы контейнера (контейнеров) и вывод кодов завершения. |
Настройка зеркал общедоступного хранилища образов Docker Hub
При возникновении проблем с обращением к образам из общедоступного хранилища Docker Hub для обеспечения возможности продолжения корректной работы с образами рекомендуется настроить подготовленные зеркала.
Для настройки обращения docker к определенному зеркалу необходимо выполнить следующий алгоритм действий:
1а. В файл /etc/docker/daemon.json добавить строку вида:
"registry-mirrors": ["<адрес_зеркала>"]где <адрес_зеркала> – адрес настроенного зеркала хранилища образов.
Например:
"registry-mirrors": ["https://mirror.gcr.io/"]где https://mirror.gcr.io/ – публичное зеркало хранилища образов Docker Hub от компании Google.
1б. Если файл /etc/docker/daemon.json пуст или не существует, внести строки вида:
{
"registry-mirrors": ["<адрес_зеркала>"]
}где <адрес_зеркала> – адрес настроенного зеркала хранилища образов.
Например:
{
"registry-mirrors": ["https://mirror.gcr.io/"]
}где https://mirror.gcr.io/ – публичное зеркало хранилища образов Docker Hub от компании Google.
2. Перезапустить службу docker:
systemctl daemon-reload systemctl restart docker
Реестр образов РЕД ОС
На пакетной базе РЕД ОС разработан ряд docker-образов и создан собственный реестр docker-образов — registry.red-soft.ru.
В зависимости от содержащихся образов реестр имеет следующие ветки:
ubi7 — содержит базовые и прикладные образы, построенные на пакетах из репозитория Стандартной редакции РЕД ОС 7.3;
k8s7 — содержит образы кластера Kubernetes, построенные на пакетах из репозитория Стандартной редакции РЕД ОС 7.3;
redos7c — содержит базовые образы, построенные на пакетах из репозитория Сертифицированной редакции РЕД ОС 7.3;
k8s7c — содержит образы кластера Kubernetes, построенные на пакетах из репозитория Сертифицированной редакции РЕД ОС 7.3.
Для получения списка доступных образов в реестре необходимо выполнить команду (в примере будет выведен список образов ветки ubi7):
docker search registry.red-soft.ru/ubi7Для установки требуемого образа из реестра необходимо выполнить команду:
docker pull registry.red-soft.ru/ubi7/<название_образа>
Базовые образы
Универсальные базовые образы (UBI) — это легковесная и безопасная основа для создания облачных и веб-приложений в контейнерах. На основе UBI можно создавать свои контейнерные приложения и собственные образы.
В реестре образов РЕД ОС на данный момент доступны следующие базовые образы:
ubi – "урезанный образ", который использует dnf в качестве менеджера пакетов;
ubi-minimal – еще более "урезанный" образ, который использует microdnf в качестве менеджера пакетов;
ubi-micro – максимально "урезанный" образ, в котором отсутствует собственный менеджер пакетов. Для установки пакетов используется менеджер пакетов хостовой ОС, на котором разворачивается образ.
Также в реестре образов доступны образы типа S2I (Source-to-Image).
S2I — это процесс сборки для создания воспроизводимых образов контейнеров из исходного кода. S2I создает готовые к использованию образы на основе исходных кодов приложений, которые, в свою очередь, могут запускаться в виде собранного приложения.
В реестре образов РЕД ОС доступны следующие образы S2I:
s2i-core — предоставляет образам инструменты, необходимые для использования функциональности source-to-image, сохраняя при этом минимальный размер образа;
s2i-base — основан на s2i-core, предоставляет образам инструменты, необходимые для использования функциональности source-to-image, а также содержит различные библиотеки, которые служат основой для создания других s2i-образов — таких как s2i-python, s2i-ruby, s2i-nodejs и прочих.
Настройка собственного локального реестра docker-образов
В централизованном хранилище хранятся доступные docker-образы.
Одним из примеров общедоступных хранилищ образов является Docker Hub, по умолчанию Docker настроен на поиск образов в нем. Также есть возможность настройки своего собственного хранилища.
При использовании команд docker pull или docker run требуемые образы будут извлекаться из настроенного хранилища. Когда используется команда docker push, образ помещается в настроенное хранилище образов.
Установка и настройка локального реестра docker-образов из репозитория РЕД ОС
Для установки локального реестра docker-образов из репозитория РЕД ОС выполните команду:
dnf install registry
Запустите службу registry:
systemctl enable registry.service --now
Убедитесь, что служба активна, выполнив:
systemctl status registry.service
В статусе должно быть указано active(running).
Необходимо настроить демон docker на обращение к приватному реестру образов. Для этого добавьте в файл /etc/docker/daemon.json следующую строку:
"insecure-registries": ["127.0.0.1:5000"], Локальный реестр docker-образов готов к использованию. Для проверки корректности настройки локального реестра см. п. «Загрузка docker-образов в локальный реестр».
Настройка локального реестра образов путем создания контейнера в docker
Для настройки локального хранилища образов путем использования контейнеров в реестре docker-образов РЕД СОФТ предоставлен образ registry.red-soft.ru/ubi7/registry, являющийся реализацией инструмента хранения и обмена образами Docker Registry.
Для создания локального хранилища образов запустите контейнер на основе образа registry.red-soft.ru/ubi7/registry командой:
docker run -d -p 5000:5000 --restart=always --name test_reg_2 registry.red-soft.ru/ubi7/registry:latestгде:
-p 5000:5000— порт для обращения к реестру по умолчанию;--restart=always— автоматический запуск контейнера после перезапуска хостовой ОС;--name test_reg_2— имя контейнера;registry.red-soft.ru/ubi7/registry:latest— необходимый образ.
Локальный реестр образов готов к использованию. Для проверки корректности настройки локального реестра см. п. «Загрузка docker-образов в локальный реестр».
Изменение расположения хранилища образов
Локальное хранилище образов является контейнером и хранит образы внутри себя в каталоге /var/lib/registry. Однако при переустановке контейнера все данные внутри него будут уничтожены. Для избежания потери данных к контейнеру необходимо подключить внешнее хранилище данных.
Для этого на хостовой ОС сначала следует создать каталог, предназначенный для хранения образов:
mkdir /reg_imagesДалее необходимо остановить и уничтожить имеющийся контейнер с локальным хранилищем:
docker container stop test_reg_2 && docker container rm -v test_reg_2
После этого следует запустить контейнер снова с дополнительным ключом, который отвечает за подключение к нему ранее созданного каталога:
docker run -d -p 5000:5000 --restart=always --name test_reg_2 -v /reg_images:/var/lib/registry registry.red-soft.ru/ubi7/registry:latest
где:
-p 5000:5000— порт для обращения к реестру по умолчанию;--restart=always— автоматический запуск контейнера после перезапуска хостовой ОС;--name test_reg_2— имя контейнера;-v /reg_images:/var/lib/registry— подключение каталога /reg_images к контейнеру в качестве каталога /var/lib/registry;registry.red-soft.ru/ubi7/registry:latest— необходимый образ.
Для проверки корректности настройки локального хранилища образов в качестве примера будет загружен образ nodejs-18 из реестра образов РЕД СОФТ registry.red-soft.ru/ubi7:
docker pull registry.red-soft.ru/ubi7/nodejs-18
Далее будет добавлен тег к загруженному образу:
docker tag registry.red-soft.ru/ubi7/nodejs-18 localhost:5000/js18_test:latestЗатем образ загружается в локальное хранилище:
docker push localhost:5000/js18_test:latest
The push refers to repository [localhost:5000/js18_test]
0932ece797fa: Pushed
6512634988ef: Pushed
526374a3d4d5: Pushed
latest: digest: sha256:fe07d0235d269961ba25f5853809ff81807f52d0aa75a77e51899a540975a675 size: 954Проверка наличия загруженного образа в созданном каталоге /reg_images:
ls /reg_images/docker/registry/v2/repositories/ js18_test
Локальное хранилище с подключенным внешним каталогом успешно работает.
Загрузка docker-образов в локальный реестр
Для загрузки образа docker в локальное хранилище необходимо сперва создать тег образа, ссылающийся на существующий образ (в примере использован образ ubi-minimal из реестра образов РЕД СОФТ registry.red-soft.ru/ubi7), командой:
docker tag registry.red-soft.ru/ubi7/ubi-minimal localhost:5000/test_regгде:
registry.red-soft.ru/ubi7/ubi-minimal— имеющийся образ docker;localhost— имя или IP-адрес хостовой ОС;5000— порт для обращения к реестру по умолчанию;test_reg— новое имя образа.
Убедитесь, что тег образа был успешно создан:
docker images REPOSITORY TAG IMAGE ID CREATED SIZE localhost:5000/test_reg latest 60d2a5f5b971 24 hours ago 102MB registry.red-soft.ru/ubi7/ubi-minimal latest 60d2a5f5b971 24 hours ago 102MB
После этого образ можно загрузить в локальное хранилище командой:
docker push localhost:5000/test_reg:latestОтвет команды должен выглядеть примерно следующим образом:
The push refers to repository [localhost:5000/test_reg] 00983af53c2c: Pushed latest: digest: sha256:fde90838c647d829131f124a6d87801ac28c2a05619efff983dde04e1d6c16c3 size: 529
В корректности загрузки docker-образов в локальный реестр можно убедиться, удалив имеющиеся образы из docker (следующие команды удаляют образы из docker, но не затрагивают образы в локальном реестре):
docker image remove registry.red-soft.ru/ubi7/ubi-minimal Untagged: registry.red-soft.ru/ubi7/ubi-minimal:latest Untagged: registry.red-soft.ru/ubi7/ubi-minimal@sha256:fde90838c647d829131f124a6d87801ac28c2a05619efff983dde04e1d6c16c3 docker image remove localhost:5000/test_reg Untagged: localhost:5000/test_reg:latest Untagged: localhost:5000/test_reg@sha256:fde90838c647d829131f124a6d87801ac28c2a05619efff983dde04e1d6c16c3 Deleted: sha256:60d2a5f5b971ce5a1938d692175ece7416e148394f0d3987c9ff7e80b88e3e66 Deleted: sha256:00983af53c2c493b01c7f747c4197794c6250140357fba2cfbc0fb0c312162c0 docker images REPOSITORY TAG IMAGE ID CREATED SIZE
При загрузке docker-образов в локальный реестр, настроенный как контейнер docker, установленный образ registry.red-soft.ru/ubi7/registry удалять не нужно!
После этого загрузите образ из локального реестра командой:
docker pull localhost:5000/test_reg Using default tag: latest latest: Pulling from test_reg ebc434fd7dc8: Pull complete Digest: sha256:fde90838c647d829131f124a6d87801ac28c2a05619efff983dde04e1d6c16c3 Status: Downloaded newer image for localhost:5000/test_reg:latest localhost:5000/test_reg:latest docker images REPOSITORY TAG IMAGE ID CREATED SIZE localhost:5000/test_reg latest 60d2a5f5b971 24 hours ago 102MB
Локальный реестр образов работает корректно.
Настройка контейнеров для автоматического запуска в systemd
Бывают ситуации, когда контейнеры могут быть остановлены вследствие определенных факторов. Для того чтобы остановленные контейнеры не приходилось запускать вручную, можно использовать настройку их автоматического запуска.
Далее будет рассмотрен пример настройки автоматического запуска локального реестра registry, настроенного как контейнер с именем test_reg_systemd и внешним каталогом для хранения образов /reg_images_sys.
Настройка автоматического запуска контейнера через службу systemd актуальна только в тех случаях, когда при запуске контейнера командой docker run не была использована опция --restart=always.
Предварительно был создан внешний каталог для хранения образов /reg_images_sys и запущен контейнер с локальным хранилищем следующими командами:
mkdir /reg_images_sys docker run -d -p 5000:5000 --name test_reg_systemd -v /reg_images_sys:/var/lib/registry registry.red-soft.ru/ubi7/registry:latest
После запуска контейнера registry необходимо создать файл настройки для службы systemd со следующим содержимым:
nano /etc/systemd/system/registry.service
[Unit]
Description=registry container
Requires=docker.service
After=docker.service
[Service]
Restart=always
ExecStart=/usr/bin/docker start -a test_reg_systemd
ExecStop=/usr/bin/docker stop -t 15 test_reg_systemd
TimeoutSec=30
[Install]
WantedBy=multi-user.target Сохраните изменения в файле и закройте его.
После этого необходимо запустить настроенную службу и добавить ее в автозагрузку командой:
systemctl enable registry.service --now
Проверьте статус службы:
systemctl status registry.service
В статусе должно быть указано active(running).
После перезагрузки хостовой ОС проверьте статус контейнера командой:
docker ps -a
В графе STATUS должно отображаться Up:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5cee2dc6e925 registry.red-soft.ru/ubi7/registry:latest "entrypoint.sh /etc/…" 20 minutes ago Up 49 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp test_reg_systemd
Установка Portainer
Установка Portainer доступна как из репозитория РЕД ОС, так и с помощью docker путем создания контейнера portainer.
Установка Portainer из репозитория РЕД ОС
Для установки portainer из репозитория РЕД ОС выполните команду (потребуются права администратора):
dnf install portainer-ce
Запустите службу portainer:
systemctl enable portainer.service --now
Убедитесь, что служба активна, выполнив:
systemctl status portainer.service
В статусе должно быть указано active(running).
Для корректной работы в Portainer должен быть установлен и активен docker.
Получить доступ к Portainer можно через веб-интерфейс на порту 9443. Для этого в адресной строке браузера пропишите https://localhost:9443.
Будет открыта страница с веб-интерфейсом portainer и формой для создания пользователя, под которым будет производиться вход в систему.
В форме необходимо задать сложный пароль длиной не менее 12 символов.
После того, как имя пользователя и пароль заданы, следует нажать «Create user».
Далее будет открыта приветственная страница, где нужно выбрать «Get started», после чего откроется панель управления, где будет отображено локальное окружение, в котором хранятся установленные контейнеры.


На вкладке «Containers» представлены все доступные контейнеры. При выборе контейнера будет открыта страница с подробными сведениями.


Установка Portainer путем создания контейнера в Docker
Для развертывания контейнера с Portainer необходимо сначала создать хранилище данных командой:
docker volume create portainer_data
Затем для установки и запуска контейнера следует выполнить команду:
docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/var/lib/portainer/data registry.red-soft.ru/ubi7/portainer
Получить доступ к Portainer можно через веб-интерфейс на порту 9000. Для этого в адресной строке браузера пропишите https://localhost:9000. Будет открыта страница с веб-интерфейсом portainer. Подробнее о веб-интерфейсе portainer см. выше.
Автоматизированное создание контейнера
Для автоматизированного создания контейнера необходимо создать скрипт create_minimal_image_moby.sh
nano create_minimal_image_moby.sh
со следующим содержимым:
#!/usr/bin/env bash
dnf_config=""
build_dir=""
name=""
usage() {
cat << EOOPTS
$(basename $0) [OPTIONS] NAME
NAME Имя создаваемого docker-образа.
OPTIONS:
-d "путь" Указывает путь к файлу конфигурации dnf.
По умолчанию используется системный конфигурационный файл (/etc/dnf/dnf.conf).
-b "путь" Директория, в которой будет производиться сборка.
По умолчанию '/tmp'.
-t "тег" Тег, которым будет помечен docker-образ.
По умолчанию используется версия из файла /etc/redos-release.
EOOPTS
exit 1
}
while getopts "d:b:t:h" opt; do
case $opt in
d)
dnf_config=$OPTARG
;;
b)
build_dir=$OPTARG
;;
h)
usage
;;
t)
tag="$OPTARG"
;;
\?)
echo "Invalid option: -$OPTARG"
usage
;;
esac
done
shift $((OPTIND - 1))
if [[ "x$1" == "x" ]]; then
echo "Не задано имя docker-образа"
exit 1
fi
name=$1
if [[ "$(id -u)" -gt "0" ]]; then
echo "Пользователь должен иметь права суперпользователя"
exit 1
fi
command -v dnf &> /dev/null
if [[ "$?" -gt "0" ]]; then
echo "Не найден dnf"
exit 1
fi
command -v docker &> /dev/null
if [[ "$?" -gt "0" ]]; then
echo "Не найден docker"
exit 1
fi
docker info &> /dev/null
if [[ "$?" -gt "0" ]]; then
echo "Невозможно получить информацию о docker"
echo "Возможно не запущен сервис docker"
exit 1
fi
if [[ "x$dnf_config" == "x" ]]; then
if [ -f /etc/dnf/dnf.conf ] ; then
dnf_config=/etc/dnf/dnf.conf
else
echo "Не задан конфигурационный файл dnf"
exit 1
fi
else
if [ ! -f $dnf_config ]; then
echo "Ошибка открытия конфигурационного файла dnf"
exit 1
fi
fi
if [[ "x$build_dir" == "x" ]]; then
target=$(mktemp -d /tmp/ubi.XXXXXX)
else
mkdir -p $build_dir
target=$(mktemp -d -p $(readlink -f $build_dir) ubi.XXXXXX)
fi
mkdir -m 755 "$target"/dev
mknod -m 600 "$target"/dev/console c 5 1
mknod -m 600 "$target"/dev/initctl p
mknod -m 666 "$target"/dev/full c 1 7
mknod -m 666 "$target"/dev/null c 1 3
mknod -m 666 "$target"/dev/ptmx c 5 2
mknod -m 666 "$target"/dev/random c 1 8
mknod -m 666 "$target"/dev/tty c 5 0
mknod -m 666 "$target"/dev/tty0 c 4 0
mknod -m 666 "$target"/dev/urandom c 1 9
mknod -m 666 "$target"/dev/zero c 1 5
packages="acl audit-libs basesystem bash bzip2-libs ca-certificates coreutils-single cracklib cracklib-dicts
crypto-policies crypto-policies-scripts cryptsetup-libs curl-minimal cyrus-sasl-lib dbus dbus-broker dbus-common
dbus-libs device-mapper device-mapper-libs dmidecode dnf dnf-data elfutils-default-yama-scope elfutils-libelf
elfutils-libs expat file-libs filesystem findutils gawk gdb-gdbserver gdbm-libs glib2 glibc glibc-common
glibc-minimal-langpack gmp gnupg2 gnutls gobject-introspection gpgme grep gzip glibc-langpack-ru glibc-langpack-en
ima-evm-utils json-c json-glib keyutils-libs kmod-libs krb5-libs libacl libarchive libassuan libattr libblkid libcap
libcap-ng libcom_err libcomps libcurl-minimal libdb libdnf libeconf libevent libfdisk libffi libgcc libgcrypt libgpg-error
libidn2 libksba libmodulemd libmount libnghttp2 libnl3 libpwquality librepo libreport-filesystem librhsm libseccomp
libselinux libsemanage libsepol libsigsegv libsmartcols libsolv libstdc++ libtasn1 libunistring libuser libutempter
libuuid libverto libxcrypt libxml2 libyaml libzstd lua-libs lz4-libs mpfr ncurses-base ncurses-libs nettle npth openldap
openssl openssl-libs p11-kit p11-kit-trust pam passwd pcre pcre2 pcre2-syntax popt python3 python3-chardet python3-dateutil
python3-dbus python3-decorator python3-dnf python3-dnf-plugins-core python3-ethtool python3-gpg python3-hawkey python3-idna
python3-iniparse python3-inotify python3-libcomps python3-libdnf python3-librepo python3-libs python-pip-wheel python3-pysocks
python3-requests python3-rpm python3-setuptools python-setuptools-wheel python3-six python3-subscription-manager-rhsm
python3-urllib3 readline redos-release rootfiles rpm rpm-build-libs rpm-libs sed setup shadow-utils sqlite-libs
subscription-manager-rhsm-certificates systemd systemd-libs systemd-pam systemd-rpm-macros tar tpm2-tss tzdata usermode
util-linux util-linux-core vim-minimal virt-what which xz-libs zlib zchunk-libs vi"
dnf -c "$dnf_config" \
--installroot="$target" \
--releasever=/ \
--setopt=group_package_types=mandatory \
--setopt=tsflags=nodocs \
--setopt=install_weak_deps=False \
-y install ${packages[@]}
dnf -c "$dnf_config" --installroot="$target" -y clean all
for file in "$target"/etc/{redos,system}-release; do
if [ -r "$file" ]; then
version="$(sed 's/^[^0-9\]*\([0-9.]\+\).*$/\1/' "$file")"
break
fi
done
cat > "$target"/etc/sysconfig/network << EOF
NETWORKING=yes
HOSTNAME=localhost.localdomain
EOF
rm -rf "$target"/usr/{bin/localedef,sbin/build-locale-archive}
# cracklib
rm -rf "$target"/usr/share/cracklib
# docs and man pages
rm -rf "$target"/usr/share/{man,doc,info,gnome/help}
# i18n
env ls -d "$target"/usr/share/i18n/*/* | grep -E -v 'en$|ru$|en_US|ru_RU|UTF-8' | xargs rm -rf
# dnf cache
rm -rf "$target"/var/cache/dnf
mkdir -p --mode=0755 "$target"/var/cache/dnf
# sln
rm -rf "$target"/sbin/sln
# ldconfig
rm -rf "$target"/etc/ld.so.cache "$target"/var/cache/ldconfig
mkdir -p --mode=0755 "$target"/var/cache/ldconfig
# create docker image
image_id_raw=$(tar --numeric-owner -c -C "$target" . | docker import -)
container_id=$(docker create $image_id_raw bash)
image_id=$(docker commit $container_id)
if [[ "x$tag" == "x" ]]; then
docker tag $image_id $name:$version
else
docker tag $image_id $name:$tag
fi
docker rm $container_id
rm -rf "$target"Затем необходимо предоставить скрипту права на исполнение командой:
chmod +x ./create_minimal_image_moby.sh
При запуске скрипта с опцией -h будет выведена краткая справка по его использованию:
./create_minimal_image_moby.sh -h
create_minimal_image_moby.sh [OPTIONS] NAME
NAME Имя создаваемого docker-образа.
OPTIONS:
-d "путь" Указывает путь к файлу конфигурации dnf.
По умолчанию используется системный конфигурационный файл (/etc/dnf/dnf.conf).
-b "путь" Директория, в которой будет производиться сборка.
По умолчанию '/tmp'.
-t "тег" Тег, которым будет помечен docker-образ.
По умолчанию используется версия из файла /etc/redos-release.Вы можете указать дополнительные опции, как описано выше, или указать только имя контейнера, который требуется создать.
Пример:
./create_minimal_image_moby.sh ro73В результате выполнения данный образ станет доступен при просмотре имеющихся образов:
docker images -a REPOSITORY TAG IMAGE ID CREATED SIZE ro73 7.3.6 bc0984697a17 51 seconds ago 267MB registry.red-soft.ru/ubi7/ubi-minimal latest ce2ca5ca47d4 4 weeks ago 102MB
registry.red-soft.ru/ubi7 latest 4e5d2ab41464 4 weeks ago 242MB
...
Дата последнего изменения: 21.11.2025
Если вы нашли ошибку, пожалуйста, выделите текст и нажмите Ctrl+Enter.