Запуск Ubuntu в Docker — пошаговое руководство
Важное: команды в примерах запускаются от имени root внутри контейнера; на хосте многие команды требуют sudo.
Что такое Docker (одной строкой)
Docker — инструмент для упаковки приложений и минимальной ОС в контейнеры: изолированные, быстро стартующие процессы с лёгким управлением версиями и зависимостями.
Шаг 1 — получить образ Ubuntu
Docker Hub — основной публичный репозиторий официальных образов. Чтобы скачать последний официальный образ Ubuntu, выполните:
sudo docker pull ubuntuЕсли нужен конкретный релиз, используйте тег. Пример для Ubuntu 20.04:
sudo docker pull ubuntu:20.04Просмотреть все локально скачанные образы:
sudo docker imagesСоветы:
- Используйте версии с тегами (например, 22.04, 20.04) для повторяемости сборок.
- Для автоматизации сборок лучше хранить Dockerfile в системе контроля версий, а не полагаться на docker commit.
Шаг 2 — запустить образ Ubuntu в контейнере
Образ — это шаблон, контейнер — его запущенный экземпляр. Для интерактивного запуска с Bash:
sudo docker run -ti --rm ubuntu /bin/bashЧто делают флаги:
- -t и -i (часто сокращённо -ti) — подключают терминал и ввод.
- –rm — удалить контейнер после остановки.
- ubuntu — имя образа (может включать тег через двоеточие).
- /bin/bash — команда, выполняемая в контейнере.
Контейнер стартует как root и обычно получает случайный hostname. Увидите очень «пустой» rootfs: без GUI и без многих утилит, которые знакомы из полноценной установки Ubuntu.
Размер минимального официального образа Ubuntu обычно в районе десятков мегабайт (в зависимости от тега); в исходном примере образ был около 78 MB.
Выполнение команд Linux внутри контейнера
Многие привычные утилиты могут отсутствовать. Например, lsb_release не установлен по умолчанию — образ минимален. Для просмотра информации об ОС можно использовать файл /etc/os-release:
cat /etc/os-releaseЧтобы установить дополнительные пакеты, сначала обновите индексы APT и установите нужный пакет:
apt update && apt install -y lsb-releaseПримечание: sudo не нужен внутри контейнера, если вы в нём работаете как root. На хосте команды docker обычно требуют sudo (или добавления пользователя в группу docker).
Сохранение состояния контейнера (docker commit) — когда и зачем
По умолчанию изменения внутри контейнера непродолжительны: при остановке контейнер удаляется (если использовался –rm) и изменения теряются. Чтобы сохранить текуще состояние в новый образ:
- Узнайте ID запущенного контейнера:
sudo docker ps- Зафиксируйте состояние в новый образ:
sudo docker commit -p myubuntu Флаги и нюансы:
- -p приостанавливает контейнер перед коммитом, чтобы получить консистентный снимок.
- Имена образов должны быть в нижнем регистре.
- docker commit полезен для быстрых экспериментов, но не заменяет Dockerfile и CI/CD-процессы: он создаёт небескриптированный образ, который трудно воспроизводить из кода.
Альтернатива (и лучшая практика): создать Dockerfile с шагами установки пакетов и конфигурации и билдить образ через docker build.
Пример простого Dockerfile:
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y lsb-release curl
CMD ["/bin/bash"]Сборка образа:
sudo docker build -t myubuntu:22.04 .Персистентность данных: тома и bind-монты
Чтобы сохранять файлы вне контейнера, используйте Docker-тoмы (volumes) или привязку каталогов (bind mounts).
Создание каталога на хосте:
sudo mkdir -p ~/Docker_ShareЗапуск контейнера с привязкой каталога хоста в /data:
sudo docker run -ti --rm -v ~/Docker_Share:/data ubuntu /bin/bashПоведение:
- /data внутри контейнера будет отображать содержимое ~/Docker_Share на хосте.
- Все изменения в /data синхронизируются с хостом и сохраняются после остановки контейнера.
Разница между типами томов:
- Bind-mount (как в примере) — точная привязка каталога хоста; удобна для разработки.
- Docker volume — управляется Docker, удобен для персистентности в продакшне и для бэкапов; команды: docker volume create, docker run -v volume_name:/data.
Права доступа и UID/GID:
- Внутри контейнера файлы принадлежат UID/GID пользователя, который записал их. Для работы без конфликтов часто создают пользователя с тем же UID, что и на хосте, или настраивают права с помощью опций –user и chown.
Роли и чек-листы
Ниже — краткие чек-листы для разных ролей при работе с Ubuntu в Docker.
Чек-лист для разработчика:
- Использовать тегированный образ (для воспроизводимости).
- Настроить bind-mount для кода и логов.
- Не запускать процессы как root внутри контейнера, если это не нужно.
- Использовать docker-compose для локальной разработки.
Чек-лист для системного администратора/инженера DevOps:
- Публиковать образы в приватном реестре (если нужно).
- Настроить сканирование уязвимостей образов.
- Использовать Docker volumes для данных и бэкапов.
- Задать лимиты ресурсов (—memory, —cpus) для продакшн-контейнеров.
Чек-лист для тестировщика:
- Запустить контейнер с флагом –rm, чтобы не оставлять следов.
- Сохранять окружение через Dockerfile для воспроизводимости тестовых сценариев.
Лучшие практики и рекомендации
- Для постоянных конфигураций используйте Dockerfile и систему CI/CD, а не docker commit.
- Минимизируйте права: не запускайте ненужные сервисы и не давайте контейнерам доступ к Docker socket, если это не требуется.
- Храните секреты в менеджерах секретов, а не в Dockerfile или переменных окружения без шифрования.
- Ограничивайте ресурсы контейнеров: —memory и —cpus.
Когда Docker не подходит — контраргументы и альтернатива
Контейнеры идеальны для упаковки приложений, но бывают случаи, когда лучше использовать виртуальную машину или другой инструмент:
- Нужна полная изоляция ядра и собственного ядра ОС → использовать виртуальные машины (например, KVM, VMware).
- Требуется длительное сохранение состояния и сложная конфигурация хоста → VM или управляемые инстансы лучше подходят.
- Для системного контейнеризации с отдельными системными службами — LXC/LXD может быть более подходящим.
Альтернативы Docker:
- Podman — демонless-альтернатива с совместимыми командами.
- LXC/LXD — контейнеры уровня ОС с более полной виртуализацией окружения.
- Kubernetes — для оркестрации множества контейнеров в продакшне.
Команда docker-compose — быстрое локальное окружение
Пример docker-compose.yml для запуска Ubuntu с томом:
version: "3.8"
services:
ubuntu:
image: ubuntu:22.04
command: /bin/bash
volumes:
- ./Docker_Share:/data
tty: true
stdin_open: trueЗапуск:
sudo docker-compose up --buildБезопасность и привилегии
- Не выполняйте контейнеры с флагом –privileged без крайней необходимости.
- Ограничьте доступ к Docker daemon (не давайте неавторизованным пользователям доступ к сокету /var/run/docker.sock).
- Сканируйте образы на уязвимости и обновляйте базовые образы регулярно.
Краткая таблица сравнения: Docker vs VM vs Podman
| Характеристика | Docker | Виртуальная машина | Podman |
|---|---|---|---|
| Изоляция | Процессы, общий хост-ядро | Полная, собственное ядро | Как Docker, без демона |
| Время старта | Миллисекунды — секунды | Десятки секунд — минуты | Миллисекунды — секунды |
| Размер | Десятки — сотни МБ | ГБ | Десятки — сотни МБ |
| Подходит для | Микросервисы, локальная разработка | Тяжёлые изолированные рабочие нагрузки | Как Docker, безопасная альтернатива |
Мини-методология: надёжная работа с Ubuntu в Docker
- Определите цель: тест, разработка или продакшн.
- Выберите базовый образ с подходящим тегом.
- Описывайте изменения в Dockerfile.
- Храните секреты и конфигурации отдельно.
- Автоматизируйте билды и сканирование образов.
- Используйте тома для данных, а не docker commit.
Шаблон быстрой проверки (cheat sheet)
Команды:
# скачать образ
sudo docker pull ubuntu:22.04
# запустить интерактивно
sudo docker run -ti --rm -v ~/Docker_Share:/data ubuntu:22.04 /bin/bash
# список контейнеров
sudo docker ps
# список образов
sudo docker images
# сохранить состояние контейнера в образ (не рекомендуется для продакшн)
sudo docker commit -p myubuntu
# создать volume
sudo docker volume create mydata
# запустить с docker volume
sudo docker run -ti --rm -v mydata:/data ubuntu /bin/bash Диагностика и частые ошибки
- Проблема: контейнер не запускается — проверьте логи через docker logs
. - Проблема: права на тома — проверьте UID/GID и используйте chown или опцию –user.
- Проблема: «image not found» — убедитесь, что тег указан правильно.
Решение типичных задач (короткая инструкция)
Протестировать пакет в Ubuntu без установки виртуальной машины:
- docker run -ti –rm ubuntu /bin/bash
- apt update && apt install -y <пакет>
Сохранить рабочую среду для команды разработки:
- Написать Dockerfile, залить в репозиторий, билдить и публиковать образ в реестр.
Поделиться данными между контейнером и хостом:
- Использовать -v ~/Docker_Share:/data или docker volume.
Когда стоит использовать docker commit
- Быстро сохранить экспериментальную сессию для локального исследования.
- НЕЛЬЗЯ использовать как долгосрочную практику для воспроизводимости.
Критерии приёмки
- Образ загружается из Docker Hub и запускается без ошибок.
- Все необходимые пакеты установлены через Dockerfile или apt в контейнере.
- Данные, которые должны сохраняться, корректно доступны в каталоге ~/Docker_Share.
- Образ версионирован и доступен в реестре (при необходимости).
FAQ
Можно ли запускать GUI-приложения в контейнере Ubuntu?
Да, но это требует проброса X11/Wayland или использования VNC; контейнеры по умолчанию не содержат GUI.
Чем отличается docker commit от docker build?
docker commit делает снимок текущего контейнера в образ — это быстрый, но нефайловый способ. docker build использует Dockerfile и даёт воспроизводимый и документированный результат.
Как безопасно хранить секреты в контейнерах?
Используйте менеджеры секретов (Docker secrets в Swarm, Vault, KMS) и не храните секреты в образах или в git.
Ресурсы и далее
- Официальная документация Docker: https://docs.docker.com
- Docker Hub: https://hub.docker.com/_/ubuntu
Краткое резюме
Docker позволяет быстро запускать минимальную Ubuntu, экономя ресурсы по сравнению с виртуальной машиной. Для повторяемости и безопасности используйте Dockerfile, управляемые тома и CI/CD. Команда docker commit пригодна для быстрых экспериментов, но не заменяет автоматизированный билд образов.
Пример диаграммы принятия решения (Mermaid):
flowchart TD
A[Нужно запустить Ubuntu?] --> B{Цель}
B -->|Разработка| C[Использовать Docker + bind-mount]
B -->|Тесты/CI| D[Использовать Dockerfile + CI]
B -->|Продакшн| E[Использовать Docker + volumes + реестр]
B -->|Полная изоляция| F[Использовать ВМ]Похожие материалы
TapTap для Android — установка и безопасность
Социальная инженерия: как распознать и защититься
Echo для детей: безопасность и родительский контроль
Отдельные SSID для 2.4/5/6 GHz — настройка
Как очистить Mac от пыли — безопасное руководство