В чем разница между docker run и docker create?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между docker run и docker create
docker run и docker create — это два ключевых инструмента для работы с контейнерами, но они работают немного по-разному.
docker create — создание без запуска
docker create создаёт новый контейнер из образа, но не запускает его. Контейнер находится в состоянии Created и готов к запуску.
docker create --name my-container -it ubuntu:20.04 bash
После этого контейнер существует, но не работает. Для запуска нужно выполнить:
docker start my-container
docker run — всё в одно
docker run — это комбинация двух операций:
- Создание контейнера (как
docker create) - Немедленный запуск (как
docker start)
docker run --name my-container -it ubuntu:20.04 bash
Контейнер создаётся и сразу же запускается.
Ключевые отличия
| Аспект | docker create | docker run |
|---|---|---|
| Создание | Да | Да |
| Запуск | Нет | Да (немедленно) |
| Операции | 1 шаг | 2 шага в одной команде |
| Использование | Когда нужна отложенная работа | Для быстрого старта |
| Полная команда | docker create && docker start | docker run |
Когда использовать каждую
docker create применяется когда:
- Нужно подготовить контейнер, но запустить его позже
- Требуется модифицировать контейнер до первого запуска
- Нужна тонкая настройка в коде перед стартом
# Создаём несколько контейнеров
docker create --name db-1 postgres:14
docker create --name db-2 postgres:14
# Запускаем их в нужный момент
docker start db-1 db-2
docker run применяется когда:
- Нужно быстро запустить контейнер
- Не требуется промежуточная настройка
- Это стандартный рабочий процесс в CI/CD
Практический пример
# Создание контейнера БД для дальнейших приготовлений
docker create \
--name postgres-db \
-e POSTGRES_PASSWORD=secure \
-v db-volume:/var/lib/postgresql/data \
postgres:14
# Копируем скрипты инициализации
docker cp ./init.sql postgres-db:/docker-entrypoint-initdb.d/
# Теперь запускаем
docker start postgres-db
# Проверяем статус
docker ps
В сравнении с docker run, который сделает всё за раз:
docker run -d \
--name postgres-db \
-e POSTGRES_PASSWORD=secure \
-v db-volume:/var/lib/postgresql/data \
postgres:14
Под капотом
Оба инструмента используют один и тот же механизм создания контейнеров через Docker daemon. Разница в API уровне:
import docker
client = docker.from_env()
# Эквивалент docker create
container = client.containers.create(
image="ubuntu:20.04",
command="bash",
stdin_open=True,
tty=True
)
# Затем нужен отдельный вызов для запуска
container.start()
# В отличие от docker run
container = client.containers.run(
image="ubuntu:20.04",
command="bash",
stdin_open=True,
tty=True,
detach=True # Иначе будет заблокирован
)
Резюме
docker create и docker run различаются в том, что первый только создаёт контейнер, а второй создаёт и запускает. Выбор зависит от вашего workflow: используйте docker create, если нужна предварительная подготовка, и docker run для быстрого старта.