Установка Docker в Ubuntu 24.04 в rootless режиме

Использовать Docker в root-режими достаточно неудобно и не очень безопасно. Опишу как установить Docker в rootless режиме.

Предисловие

Warning

Внимание
Актуально на момент написания статьи 2025-03-22. Использовался Ubuntu 24.04

Запуск Docker в rootless режиме на Ubuntu повышает безопасность, так как позволяет демону Docker и контейнерам работать без привилегий суперпользователя.

Установка необходимых пакетов

bash
sudo apt update
sudo apt install -y uidmap dbus-user-session

uidmap предоставляет утилиты newuidmap и newgidmap, которые необходимы для отображения пространств имен пользователей.

dbus-user-session обеспечивает корректное управление сессиями D-Bus для пользовательских сеансов.

Настройка подчиненных идентификаторов пользователей и групп

bash
echo "$(whoami):100000:65536" | sudo tee -a /etc/subuid /etc/subgid

Установка Docker

bash
sudo apt-get install -y docker-ce-rootless-extras

Danger

E: Unable to locate package docker-ce-rootless-extras Если возникла такая ошибка, то должны помочь следующие действия

Удаление докера (если установлен)

bash
sudo apt-get remove docker docker-engine docker.io containerd runc

Установить репозиторий Docker

bash
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg

Добавить официальный GPG ключ:

bash
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

Добавить репозиторий:

bash
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Установить пакеты докера

bash
sudo apt update
sudo apt-get install -y docker-ce docker-ce-rootless-extras

Установить в rootless режиме

bash
dockerd-rootless-setuptool.sh install

Настройка переменных окружения

Это необходимо добавить в файл инициализации shell (например, ~/.bashrc или ~/.zshrc):

bash
export PATH=/usr/bin:$PATH
export DOCKER_HOST=unix:///run/user/$(id -u)/docker.sock

Важно для серверов

Linger

Если команда ниже покажет Linger=no, то запущенное в докере перестанет работать при отключении от ssh-сессии пользователя.

bash
loginctl show-user "$USER" | grep Linger

Чтобы этого избежать:

bash
sudo loginctl enable-linger <твой_пользователь>
systemctl --user restart docker
systemctl --user enable docker

Нужен порт 80

По-умолчанию в rootless-режиме докера нельзя занимать порты ниже 1024. Но для личного проекта может понадобиться порт 80. Нужно в файл /etc/sysctl.d/99-rootless-ports.conf (создать если не существует) добавить строку net.ipv4.ip_unprivileged_port_start=80.

Для применения:

bash
sudo sysctl --system

После этого ваш сервис (например, nginx) заработает.