Установка и базовое использование Docker на Debian 11 Bullseye

О чём эта инструкция
Эта пошаговая инструкция рассчитана на системных администраторов и разработчиков, которые хотят установить Docker CE (Community Edition) на Debian 11 Bullseye и получить рабочий набор команд для повседневной работы: установка зависимостей, добавление репозитория Docker, запуск контейнеров, работа с томами, просмотр логов и базовая отладка.
Кому пригодится: инженерам DevOps, разработчикам, тестировщикам и инженерам поддержки.
Краткие определения в одну строку:
- Docker: платформа для упаковки приложений в контейнеры с изоляцией на уровне ОС.
- Контейнер: лёгкая среда, запускающая приложение и его зависимости.
- Образ (image): шаблон контейнера, из которого создаются запущенные экземпляры.
Предварительные требования
- Сервер с Debian 11 Bullseye. Обновите пакеты перед началом.
- Доступ root или пользователь с правами sudo.
- Подключение к интернету для загрузки пакетов и образов.
Важно: если вы используете облачный провайдер (VPS), проверьте, что виртуализация поддерживает запуск контейнеров.
Установка зависимостей
Сначала установим базовые пакеты, необходимые для добавления внешнего репозитория и работы apt через HTTPS.
Выполните:
apt install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-releaseПри появлении приглашения введите ‘y’ и нажмите Enter, чтобы подтвердить установку.

Добавление репозитория Docker
Мы будем устанавливать Docker из официального репозитория Docker, чтобы получать актуальные пакеты.
- Импортируйте GPG-ключ Docker:
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg- Добавьте репозиторий для Debian 11:
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null- Обновите кэш пакетов:
apt update
Теперь система готова к установке Docker.
Установка Docker на Debian 11
- Если раньше на системе устанавливался пакет docker из репозиториев Debian, удалите конфликты:
sudo apt remove docker docker-engine docker.io containerd runc- Установите Docker CE, клиент и контейнерный рантайм:
apt install docker-ce docker-ce-cli containerd.ioПодтвердите установку нажатием ‘y’ и Enter.
- Проверьте, что сервисы включены и работают:
systemctl is-enabled docker
systemctl is-enabled containerd
systemctl status docker containerdНиже примерный вывод, который вы увидите, если всё в порядке.

Если сервисы active (running) и enabled — они будут автоматически запускаться при старте системы.
Доступ для non-root пользователя
По умолчанию Docker требует прав root. Чтобы позволить запускать контейнеры без sudo, добавьте пользователя в группу docker.
Пример: создадим пользователя johndoe и дадим ему доступ.
- Создание пользователя:
useradd -m -s /bin/bash johndoe- Добавление в группу docker:
usermod -aG docker johndoe- Войдите под пользователем и проверьте:
su - johndoe
docker run hello-worldВы должны увидеть приветственное сообщение от образа hello-world.

Объяснение поведения команды docker run hello-world
- Docker ищет локальный образ hello-world. Если его нет, загрузит с Docker Hub.
- Затем создаст контейнер и выполнит его, который печатает приветствие и завершится.
Проверить запущенные и все контейнеры:
docker ps
docker ps -aDocker автоматически присваивает контейнерам случайные имена вроде bold_bartix — вы можете указывать имя с помощью –name.
Базовые операции с Docker: образы и контейнеры
Ниже — типичный набор действий: подтянуть образ, запустить контейнер, проверить логи, остановить и удалить.
- Скачивание образа nginx:alpine:
docker pull nginx:alpineТег (tag) — это версия/вариант образа. nginx:alpine означает nginx на базе Alpine Linux.

Посмотреть локальные образы:
docker images
- Запуск контейнера nginx с сопоставлением порта и удалением при остановке:
docker run -it --rm -d -p 8080:80 --name web nginx:alpineРазбор ключей:
- -i, –interactive — держит STDIN открытым.
- -t, –tty — выделяет псевдотерминал.
- –rm — удаляет контейнер после завершения.
- -d — запуск в фоновом режиме (detached).
- -p 8080:80 — пробрасывает порт 80 контейнера на порт 8080 хоста.
- –name web — присваивает контейнеру имя web.
Проверка:
docker psОткройте в браузере: http://

- Логи контейнера:
docker logs web
docker logs --tail 10 web
- Остановка контейнера:
docker stop webЕсли контейнер был запущен с –rm, он удалится автоматически после остановки.

Тома и привязки (volumes и bind mounts)
Чтобы хранить данные вне контейнера или служить статическими файлами, используйте тома или привязки каталога (bind mounts).
Пример: смонтируем локальную папку ~/data в /usr/share/nginx/html:
- Создайте директорию и файл index.html:
mkdir -p ~/data/
nano ~/data/index.htmlПример содержимого index.html:
Welcome to Docker Nginx
Hello from Nginx container
Сохраните (Ctrl+x, y, Enter).
- Запустите контейнер с монтированием:
docker run -it --rm -d -p 8080:80 --name web -v ~/data:/usr/share/nginx/html nginx:alpineПроверка в браузере покажет ваш кастомный index.html.

Разница между томом и bind mount:
- Bind mount: монтируется конкретная директория хоста; удобен для разработки.
- Volume (docker volume): управляется Docker и предпочтителен для продакшн данных и бэкапа.
Совет: используйте абсолютные пути в -v и избегайте привязки домашней директории с правами root для обеспечения безопасности.
Вход внутрь контейнера и диагностика
Подключение к работающему контейнеру:
docker exec -it web /bin/shВнутри контейнера можно проверить hostname, IP и маршрутизацию:
hostname
ip a
route -n
Удаление всех контейнеров в состоянии exited:
docker rm $(docker ps --filter "status=exited" -q)Очистка образов и неиспользуемых объектов:
docker system prune
# более агрессивно:
docker system prune -aВнимание: prune -a удалит все неиспользуемые образы, включая те, которые могут понадобиться.
Лучшие практики и безопасность
- Запускайте только проверенные образы. Смотрите подписи и официальные репозитории.
- Ограничивайте ресурсы контейнеров (CPU, память) через –cpus, –memory.
- Не монтируйте /var/run/docker.sock в контейнер без крайней необходимости — это даёт привилегии управления демоном.
- Используйте user namespaces и rootless Docker, если нужна изоляция от host root.
- Обновляйте Docker и containerd своевременно.
- Для production: используйте централизованное логирование, мониторинг и управление секретами (HashiCorp Vault, Docker secrets в Swarm/Kubernetes).
Примеры ограничения ресурсов:
docker run -d --name limited --memory=512m --cpus="1.0" nginx:alpineОтладка проблем — руководство
Сценарий: Docker не запускается. Проверки:
- systemctl status docker — есть ли ошибки в Journal?
- journalctl -u docker -n 200 –no-pager
- Проверить /var/log/syslog на системные ошибки.
- Проверить свободное место: df -h (иногда образы не извлекаются из-за заполненного диска).
Сценарий: контейнер не доступен по сети.
- docker ps — порт сопоставлен ли корректно?
- iptables/nftables — блокирует ли трафик?
- Проверить, слушает ли порт на хосте: ss -ltnp | grep 8080
Сценарий: image pull зависает или медленно скачивается.
- Проверьте сетевой доступ к registry (curl https://registry-1.docker.io).
- Внутри CI используйте локальный registry-кеш (например, регистр с proxy).
Управление образами: теги, версии и стратегия хранения
Рекомендации:
- Всегда фиксируйте теги в деплой-конфигурациях (nginx:1.23.1 вместо nginx:latest).
- Используйте семантическое версионирование и CI, который билдит и пушит образы с тегами CI номера.
- Храните Immutable images — не перекатывайте продакшн-контейнеры на основе latest без тестов.
Команды полезные:
docker tag myapp:latest registry.example.com/myorg/myapp:1.2.3
docker push registry.example.com/myorg/myapp:1.2.3CI/CD и создание собственного образа — краткая инструкция
Простой Dockerfile для приложения на Node.js:
FROM node:16-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
CMD ["node","server.js"]Сборка и локальная проверка:
docker build -t myapp:1.0.0 .
docker run -p 3000:3000 myapp:1.0.0В CI: билд — тесты — пуш в registry — деплой на staging/prod с проверкой интеграции и откатом.
Миграция с Docker из репозитория Debian на официальный репозиторий
Если ранее использовался пакет docker.io из официального Debian repo, стоит удалить старые пакеты и использовать docker-ce из официального репозитория Docker, чтобы получать более свежие версии и доступ к новым возможностям.
Шаги:
- Удалить старые пакеты (см. раздел выше).
- Добавить официальный ключ и репозиторий.
- Установить docker-ce и containerd.
- Проверить совместимость версий и интеграцию с systemd.
Шаблон проверки (Pre-deployment checklist)
Перед деплоем контейнера в production выполните:
- Образ промодерирован и провёрнут сканерами уязвимостей.
- Теги фиксированы, не используется latest.
- Ограничены ресурсы памяти и CPU.
- Логи отправляются в централизованную систему.
- Мониторинг и алерты настроены.
- Выполнен smoke-test после деплоя в staging.
Роль-ориентированные чек-листы
Администратор:
- Установить Docker и обновления безопасности.
- Настроить резервное копирование томов.
- Отслеживать потребление ресурсов и логи.
Разработчик:
- Создавать минимальные образы и фиксировать теги.
- Использовать многослойные Dockerfile для уменьшения размера.
- Локально тестировать контейнеры перед пушем.
Инженер DevOps:
- Настроить CI/CD пайплайн с тестами и проверками безопасности.
- Управлять репозиториями образов и доступом.
Типичные команды-«шпаргалка» (Cheat sheet)
- docker ps — список запущенных контейнеров
- docker ps -a — все контейнеры
- docker logs
— логи - docker exec -it
/bin/sh — попасть в контейнер - docker images — локальные образы
- docker rmi
— удалить образ - docker rm
— удалить контейнер - docker system prune -a — удалить неиспользуемые объекты
Когда Docker может не подойти (ограничения)
- На системах с ограничениями по безопасности и требованием глубокой изоляции (полная виртуализация) лучше использовать виртуальные машины.
- Для очень высоких требований к сетевой изоляции и безопасности стоит рассмотреть Kata Containers или полноценные VM.
- Для stateful больших баз данных нужен тщательный подход к томам и резервному копированию.
Примеры отката (rollback) — быстрый план
Если новый контейнер с тегом v2 вызывает проблемы:
- Откатить сервис к предыдущему образу: docker run –name app_old … myapp:v1
- Если используется orchestrator (Swarm/Kubernetes) — выполнить rollback через его команду.
- Провести анализ логов и метрик, затем создать фикс и повторить релиз.
Сводка ключевых рекомендаций
- Устанавливайте Docker из официального репозитория для актуальных версий.
- Давайте не-root доступ через группу docker, но оценивайте риски.
- Используйте тома и правильные монтирования для хранения данных.
- Фиксируйте теги образов и настраивайте CI/CD.
- Ограничивайте ресурсы контейнеров и следите за безопасностью.
Важное: прежде чем применять команды удаления (prune, rmi -f), проверьте, что вы не потеряете жизненно важные образы или данные.
Заключение
Поздравляем — вы установили Docker на Debian 11 Bullseye и прошли базовую практику: добавление репозитория, установка, разрешения для non-root пользователей, запуск контейнеров nginx, монтирование томов, просмотр логов и базовую отладку. Дальше рекомендуем:
- Создать Pipeline для сборки собственных образов.
- Настроить мониторинг и сканирование уязвимостей.
- Освоить оркестраторы (Kubernetes или Docker Swarm) для управления многоконтейнерными окружениями.
Заметка: для production-инфраструктуры рассмотрите использование приватного registry и систем безопасности/аудита.
Ключевые шаги:
- Установить зависимости и добавить официальный репозиторий Docker.
- Установить docker-ce и containerd.
- Добавить пользователя в группу docker и проверить docker run hello-world.
- Запустить nginx:alpine, пробросить порт и смонтировать локальную директорию.
Приятной работы с контейнерами!
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента