Docker run: порты, переменные, тома, имя и автоудаление

Категория: docker · Язык: Bash · Обновлено:

Команда docker run создаёт и запускает контейнер из образа. Самые частые ключи: -d фоновый режим, --name имя, -p 8080:80 порт, -e переменная окружения, -v том, --rm удалить контейнер после остановки. Остальные команды управления собраны ниже.

Типичный запуск

Bash
docker run -d --name web -p 8080:80 -e APP_ENV=production -v web-data:/data --restart unless-stopped nginx:alpine

Эта команда запускает nginx в фоне с именем web, публикует порт 80 контейнера на порту 8080 хоста, передаёт переменную, подключает том и перезапускает контейнер после сбоя и перезагрузки сервера.

Основные ключи

Ключ

Что делает

-d

Запустить в фоне и вернуть управление

--name web

Задать имя вместо случайного

-p 8080:80

Порт хоста : порт контейнера

-p 127.0.0.1:8080:80

То же, но только для локального доступа

-e KEY=value

Переменная окружения

--env-file .env

Переменные из файла

-v name:/path

Подключить том

-v $(pwd):/app

Подключить папку хоста

-w /app

Рабочая папка внутри контейнера

--rm

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

-it

Интерактивный терминал

--restart unless-stopped

Политика перезапуска

--network my-net

Подключить к сети

--memory 512m --cpus 1

Ограничить память и процессор

Разовый контейнер

Bash
docker run --rm alpine echo "привет"                       # выполнить команду и удалить контейнер
docker run --rm -v "$(pwd)":/work -w /work alpine ls       # работать с файлами текущей папки
docker run --rm -it python:3.13-slim python                # интерактивный интерпретатор

Управление контейнерами

Bash
docker ps                          # работающие контейнеры
docker ps -a                       # все, включая остановленные
docker stop web                    # остановить
docker start web                   # запустить снова
docker restart web                 # перезапустить
docker rm web                      # удалить остановленный
docker rm -f web                   # остановить и удалить
docker logs -f web                 # логи
docker exec -it web sh             # зайти внутрь
docker inspect web                 # подробные сведения
docker stats --no-stream           # потребление ресурсов

Образы

Bash
docker images                      # список образов
docker pull nginx:alpine           # скачать
docker build -t my-app:1.0 .       # собрать из Dockerfile в текущей папке
docker tag my-app:1.0 my-app:latest   # добавить имя
docker rmi my-app:1.0              # удалить образ

Порты: частая путаница

Запись -p 8080:80 читается как «порт хоста 8080 соответствует порту контейнера 80». Порядок именно такой. Программа внутри контейнера должна слушать адрес 0.0.0.0, иначе соединения снаружи не пройдут.

Bash
docker port web                    # какие порты опубликованы
curl http://localhost:8080         # проверить

Политики перезапуска

Значение

Поведение

no

Не перезапускать (по умолчанию)

on-failure:3

Перезапускать при ошибке, не более трёх раз

always

Всегда, включая запуск службы Docker

unless-stopped

Как always, но не после ручной остановки

Частые вопросы

Чем отличаются docker run и docker start?

docker run создаёт новый контейнер из образа и запускает его. docker start запускает уже существующий остановленный контейнер.

Почему контейнер сразу останавливается?

Главный процесс завершился. Посмотрите docker logs имя и убедитесь, что команда запуска не завершается сразу, например что процесс не работает в фоне внутри контейнера.

Как изменить настройки запущенного контейнера?

Порты, тома и переменные изменить нельзя. Удалите контейнер и создайте его заново с нужными ключами либо используйте Docker Compose.