Как запустить Ubuntu в Docker
Docker — один из самых популярных инструментов для разработки и развёртывания приложений. Он облегчает упаковку приложений и их зависимостей в лёгкие контейнеры, которые запускаются одинаково в разных окружениях. В этой статье мы пошагово покажем, как получить минимальный образ Ubuntu, запустить его в Docker, выполнить базовые команды, сохранить состояние и настроить персистентность данных.
Зачем запускать Ubuntu в Docker
Коротко: контейнеры дают изоляцию и предсказуемость окружения без нагрузки полной виртуальной машины. Ubuntu в Docker полезен, когда вам нужен знакомый пользовательский опыт (apt, Bash, знакомые пакеты) в лёгком контейнере для разработки, тестирования или CI.
Когда контейнеры подходят лучше всего:
- Быстрая изоляция среды разработки.
- Лёгкие тестовые стенды и CI-пайплайны.
- Эксперименты с пакетами без изменения хоста.
Когда стоит выбрать виртуальную машину вместо контейнера:
- Нужен полноценный отдельный kernel или загрузчик.
- Требуется GUI/десктоп со сложным графическим стеком.
- Требуется полная имитация отдельного физического сервера.
Шаг 1: Получение образа Ubuntu для Docker
Если Docker ещё не установлен, установите его на вашу ОС (Ubuntu, macOS или Windows). Официальные и проверенные образы обычно публикуют на Docker Hub — это рекомендуемый источник. Также у облачных провайдеров есть собственные репозитории образов.
Чтобы загрузить последний официальный образ Ubuntu, выполните:
sudo docker pull ubuntuЧтобы получить конкретную версию, используйте тег. Примеры:
sudo docker pull ubuntu:22.04
sudo docker pull ubuntu:20.04Посмотреть все локальные образы можно командой:
sudo docker imagesСоветы:
- При необходимости указывайте конкретный тег (например, :22.04) — это даёт предсказуемость.
- Для приватных образов используйте собственный реестр или службу облака.
Шаг 2: Запуск образа Ubuntu в Docker
Образ — это «чертёж», а контейнер — запущенная копия образа. Чтобы запустить Ubuntu в интерактивном режиме и попасть в Bash, выполните:
sudo docker run -ti --rm ubuntu /bin/bashРазбор флагов:
- -ti: интерактивный терминал (TTY + stdin).
- –rm: удалить контейнер автоматически после остановки.
- /bin/bash: команда, которая запускается внутри контейнера (интерактивная оболочка).
После запуска вы окажетесь в окружении Bash под root-пользователем. Контейнер получает случайное имя и hostname по умолчанию. Обратите внимание: образ минимален — в нём нет GUI и многих из привычных утилит.
Выполнение команд Linux в Ubuntu Docker
Многие стандартные утилиты могут отсутствовать в минимальном образе. Например, команда lsb_release часто недоступна. Вместо этого можно читать системный файл:
cat /etc/os-releaseЧтобы получить более подробную информацию или установить недостающие утилиты, обновите индексы пакетов и установите нужные пакеты. Пример для установки lsb-core:
apt update && apt install lsb-coreЗамечания:
- sudo не нужен, так как вы обычно в контейнере под root.
- Для долгоживущих контейнеров и продакшн-образов лучше заранее включать нужные пакеты в Dockerfile, а не устанавливать их вручную.
Пример Dockerfile (минимальный):
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y lsb-core curl vim && rm -rf /var/lib/apt/lists/*
CMD ["/bin/bash"]Это обеспечивает повторяемость сборки образа и избавляет от ручных действий в запущенном контейнере.
Сохранение состояния контейнера
По умолчанию изменения в контейнере исчезают после его удаления. Чтобы зафиксировать текущее состояние и создать образ на его основе, используйте docker commit.
Сначала найдите ID работающего контейнера:
sudo docker psЗатем создайте образ из контейнера:
sudo docker commit -p myubuntu Примечания:
- Замените
на реальный ID контейнера. - Имена образов должны быть в нижнем регистре.
- Флаг -p позволяет приостановить контейнер перед фиксацией, чтобы минимизировать неконсистентность.
После создания образа вы можете просмотреть его в списке docker images и запустить как любой другой образ.
Дополнительно: если вы хотите разметить и отправить образ в реестр, используйте docker tag и docker push:
sudo docker tag myubuntu myregistry.example.com/myubuntu:latest
sudo docker push myregistry.example.com/myubuntu:latestДля публичного Docker Hub:
sudo docker tag myubuntu yourhubusername/myubuntu:latest
sudo docker login
sudo docker push yourhubusername/myubuntu:latestНе забудьте, что для push в приватные репозитории требуется аутентификация.
Персистентность данных: тома и монтирования
Есть два распространённых способа сохранять данные за пределами контейнера:
- Bind mount (прямое монтирование каталога хоста).
- Docker volumes (именованные и управляемые Docker тома).
Docker рекомендует использовать volumes, поскольку они более изолированы и протестированы для производительности и бэкапов. Однако bind mounts удобны для разработки, когда нужно быстро монтировать код из домашнего каталога.
Пример создания каталога на хосте и запуска контейнера с монтированием:
sudo mkdir -p ~/Docker_Share
sudo docker run -ti --rm -v ~/Docker_Share:/data ubuntu /bin/bashВ контейнере появится каталог /data, который привязан к ~/Docker_Share на хосте. Все изменения синхронизируются в обе стороны.
Пример с именованным томом:
sudo docker volume create my_data_volume
sudo docker run -ti --rm -v my_data_volume:/data ubuntu /bin/bashПлюсы volumes:
- Не зависят от структуры файловой системы хоста.
- Легче переносить между хостами (при использовании драйверов резервного копирования).
- Управление через docker volume команды.
Для docker-compose вы можете описать монтирования и тома в файле docker-compose.yml, что упрощает повторяемость окружения.
Сравнение с виртуальными машинами
Контейнеры легче, быстрее и проще масштабируются, но не заменяют виртуальные машины во всех сценариях. Контейнеры делят kernel хоста, поэтому они не подходят, если нужен отдельный kernel или сложный GUI. В других случаях контейнеры — экономичная и быстрая альтернатива для разработки и микросервисов.
Когда предпочесть VM:
- Требуется изоляция на уровне ядра.
- Необходимо тестировать разные ядра и драйверы.
- Нужен полноценный десктоп со сложным GUI и аппаратным доступом.
Когда выбрать контейнер:
- Быстрое развертывание сервисов и их тестирование.
- CI/CD, лёгкие микросервисы, автоматизированные сборки.
Безопасность и лучшие практики
Короткая шпаргалка по безопасности при работе с Ubuntu в Docker:
- Избегайте запуска приложений в контейнере под root-пользователем. Создавайте непривилегированных пользователей и используйте USER в Dockerfile.
- Не запускайте контейнеры с флагом –privileged без крайней необходимости.
- Ограничьте ресурсы контейнера флагами –memory и –cpus.
- Используйте read-only файловые системы, где это возможно.
- Сканируйте образы на уязвимости (инструменты сканирования образов помогают выявлять CVE).
- Поддерживайте образы обновлёнными и пересобирайте их после обновлений зависимостей.
- Применяйте политики для управления доступом к реестру и к запуску контейнеров в продакшне.
Пример пользовательских и ресурсных ограничений при запуске:
sudo docker run -ti --rm --user 1000:1000 --memory 512m --cpus 0.5 ubuntu /bin/bashЧек-лист по ролям
Для разных ролей — краткий практический чек-лист.
Разработчик:
- Использовать bind mounts для локальной разработки.
- Писать Dockerfile для воспроизводимости.
- Запускать контейнеры без –privileged.
DevOps / SRE:
- Автоматизировать сборку и публикацию образов (CI/CD).
- Хранить секреты в безопасном хранилище, не в образах.
- Настроить мониторинг и лимиты ресурсов.
Инженер по безопасности:
- Сканировать образы на уязвимости.
- Настроить политики запуска контейнеров (Pod Security Policies, если K8s).
- Проверять права доступа к реестру и томам.
QA:
- Автоматически поднимать тестовые контейнеры в CI.
- Использовать предсказуемые теги образов для тестирования.
- Очищать артефакты и тома после тестов.
Шпаргалка команд (cheat sheet)
Основные команды, которые пригодятся при работе с Ubuntu в Docker:
# Скачать образ
sudo docker pull ubuntu:22.04
# Запустить интерактивный контейнер
sudo docker run -ti --rm ubuntu /bin/bash
# Список локальных образов
sudo docker images
# Список запущенных контейнеров
sudo docker ps
# Сохранить состояние контейнера в новый образ
sudo docker commit -p myubuntu
# Пометить и запушить образ в реестр
sudo docker tag myubuntu yourhubusername/myubuntu:latest
sudo docker push yourhubusername/myubuntu:latest
# Создать именованный том и запустить с ним
sudo docker volume create my_data_volume
sudo docker run -ti --rm -v my_data_volume:/data ubuntu /bin/bash
# Остановить контейнер
sudo docker stop Критерии приёмки
Убедитесь, что следующие пункты выполнены перед переходом в следующую стадию работы с образом или деплоем:
- Образ собран с фиксированным тегом и описан в Dockerfile.
- Все необходимые пакеты установлены или доступны через том/volume.
- Не храните секреты в образе — используйте секреты/переменные окружения и безопасные хранилища.
- Контейнер запускается под непривилегированным пользователем в продакшене.
- Данные, которые нужно сохранить, монтируются в тома или на внешнее хранилище.
Типичные проблемы и устранение неполадок
Проблема: контейнер запускается, но нужная утилита отсутствует. Решение: установить пакет через apt или добавить установку в Dockerfile.
Проблема: файлы не видны на хосте после монтирования. Решение: проверьте права доступа и путь монтирования, убедитесь, что в контейнере записаны файлы именно в смонтированный каталог.
Проблема: образ слишком большой. Решение: минимизируйте слои, удаляйте кэш apt (
rm -rf /var/lib/apt/lists/*), используйте более лёгкие базовые образы или стратегію multi-stage сборки.
Полезные практики при работе с Ubuntu в Docker
- Автоматизируйте сборку образов через CI, не правьте критические пакеты вручную в запущенных контейнерах.
- Версионируйте теги образов (semver или дата), избегайте использования :latest в продакшене.
- Документируйте зависимости и шаги для локального запуска.
Глоссарий в одну строку
- Образ: файл с инструкциями и файлами, из которого создаётся контейнер.
- Контейнер: запускаемая из образа изолированная среда.
- Том (volume): способ хранить данные вне жизненного цикла контейнера.
Краткое резюме
- Ubuntu в Docker даёт знакомое окружение в лёгкой и быстро стартующей упаковке.
- Используйте Dockerfile и теги для воспроизводимости.
- Для персистентности применяйте тома или bind mounts.
- Соблюдайте лучшие практики безопасности: непривилегированные пользователи и ограничения ресурсов.
Важно: контейнеры экономичны и удобны, но не всегда заменяют виртуальные машины. Выбирайте инструмент под задачу.
Краткие рекомендации для следующего шага: создайте Dockerfile с нужными пакетами, автоматизируйте сборку и поместите образ в приватный реестр или Docker Hub для совместного использования.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone