Введение / Зачем это нужно
Команда docker run — это основной инструмент для запуска контейнеров Docker. Она берёт Docker-образ, создаёт из него новый контейнер и запускает его с заданными параметрами. Понимание этой команды — первый и самый важный шаг в работе с Docker. После прохождения этого гайда вы сможете уверенно запускать контейнеры с веб-серверами, базами данных или любым другим ПО, настраивать сеть, хранилище и интерактивный доступ.
Требования / Подготовка
Перед началом убедитесь, что:
- Docker Engine установлен и работает. Проверьте командой
docker --version. Результат должен показывать версию 20.10 или новее. - Ваш пользователь имеет права на управление Docker. Обычно это требует membership в группе
docker. Проверьтеgroups $USER. Если группыdockerнет, добавьте пользователя (sudo usermod -aG docker $USER) и перелогиньтесь. - Вы можете загружать образы из Docker Hub. Для публичных образов (как
nginx,ubuntu) это работает по умолчанию.
Пошаговая инструкция
Шаг 1: Базовый синтаксис и запуск тестового контейнера
Самый простой вызов команды: docker run <имя_образа>. Docker проверит наличие образа локально. Если его нет — автоматически загрузит (pull) с Docker Hub, создаст контейнер и запустит команду по умолчанию, указанную в Dockerfile образа.
# Запуск официального тестового образа
docker run hello-world
Что произошло: Docker загрузил образ hello-world, запустил его. Контейнер выполнил свою задачу (вывод приветствия) и остановился.
Шаг 2: Интерактивный запуск и работа в контейнере
Чтобы оставаться внутри контейнера после запуска (например, для оболочки bash), используйте флаги -i (интерактивный) и -t (присвоить TTY, терминал).
# Запуск образа Ubuntu и вход в оболочку bash
docker run -it ubuntu:22.04 bash
Что произошло:
-it— вы подключились к контейнеру.ubuntu:22.04— конкретная версия образа.bash— команда, которую нужно выполнить внутри контейнера (переопределяетCMDиз образа).
Вы окажетесь в командной строке внутри контейнера. Чтобы выйти, наберите exit. Контейнер остановится.
Шаг 3: Работа в фоновом режиме и проброс портов
Часто контейнеры (веб-серверы, БД) нужно запускать в фоне (detached). Ключевой флаг -d. Для доступа к сервису из хоста нужен проброс портов -p.
# Запуск Nginx в фоне, проброс порта 8080 хоста -> 80 контейнера
docker run -d -p 8080:80 --name my-nginx nginx:latest
Разбор флагов:
-d— запуск в фоновом режиме (возвращает ID контейнера).-p 8080:80— проброс портов:хостовый_порт:порт_в_контейнере.--name my-nginx— задаёт удобное имя контейнеру (вместо случайного ID).nginx:latest— образ для запуска.
Теперь Nginx работает в контейнере. Откройте в браузере http://localhost:8080 — вы увидите стартовую страницу Nginx.
💡 Совет: Для проброса всех портов контейнера на случайные порты хоста используйте
-P(заглавная P).
Шаг 4: Монтирование томов и управление данными
По умолчанию данные внутри контейнера исчезают после его удаления. Чтобы сохранять файлы на хосте или делиться ими между контейнерами, используйте тома (volumes) или bind mounts.
# Запуск контейнера с монтированием текущей директории хоста в /app контейнера
docker run -it -v "$(pwd)":/app ubuntu:22.04 bash
Что произошло: Директория, в которой вы выполнили команду на хосте, теперь доступна внутри контейнера по пути /app. Все изменения в /app будут видны и на хосте, и после перезапуска контейнера.
Шаг 5: Управление жизненным циклом контейнера
docker run создаёт и запускает новый контейнер. Если контейнер уже существует (остановленный), используйте docker start/docker stop.
# Остановка запущенного контейнера по имени
docker stop my-nginx
# Запуск остановленного контейнера (с теми же параметрами)
docker start my-nginx
# Просмотр всех контейнеров (включая остановленные)
docker ps -a
# Удаление остановленного контейнера
docker rm my-nginx
⚠️ Важно: Удаление контейнера (
rm) не удаляет образ, из которого он был создан. Образы управляются отдельно (docker image rm).
Проверка результата
- Контейнер запущен: Выполните
docker ps. В списке должны быть активные контейнеры (например,my-nginx). - Сервис доступен: Для веб-сервера откройте указанный в
-pпорт в браузере (http://localhost:8080). Для БД проверьте подключение локально. - Данные сохраняются: Если вы монтировали том, создайте файл внутри контейнера (
touch /app/test.txt) и проверьте его наличие в соответствующей директории на хосте. - Логи контейнера: Просмотрите логи на предмет ошибок:
docker logs <имя_или_id_контейнера>.
Возможные проблемы
| Проблема | Причина | Решение |
|---|---|---|
Got permission denied while trying to connect to the Docker daemon socket | Пользователь не в группе docker. | Выполните sudo usermod -aG docker $USER, выйдите из сессии и зайдите заново. |
Unable to find image '<image>:latest' locally и последующая ошибка pull access denied | Ошибка в имени образа или нет доступа к приватному репозиторию. | Проверьте имя образа на Docker Hub. Для приватных репозиториев выполните docker login. |
Порт уже занят (Bind for 0.0.0.0:8080 failed: port is already allocated) | На хосте уже запущен процесс, слушающий порт 8080. | Остановите конфликтующий процесс (sudo lsof -i :8080), или используйте другой порт хоста (-p 8081:80). |
| Контейнер сразу останавливается | Основной процесс внутри контейнера завершился. | Запустите контейнер в интерактивном режиме (-it) с долгоживущей командой (например, bash), чтобы остаться внутри и диагностировать проблему. |
| Файлы не сохраняются после удаления контейнера | Том не был явно объявлен (-v) или это был анонимный volume, привязанный к удалённому контейнеру. | Всегда монтируйте внешние тома для важных данных. Удаляйте только контейнер (docker rm), не затрагивая тома (docker volume ls). |
# Пример диагностики: запуск оболочки в уже созданном контейнере (если он остановился)
docker run -it --rm --entrypoint sh <image_name>