Чем отличаются команды docker run и docker create

Ответ

Команды docker create и docker run обе создают контейнер из образа, но отличаются моментом его запуска.

  • docker create: Только создает файловую систему контейнера и подготавливает его к запуску. Контейнер остается в статусе Created и не выполняет никаких процессов.

    # Создаем контейнер, но не запускаем его
    $ docker create --name my-nginx nginx
    
    # Проверяем статус (статус будет "Created")
    $ docker ps -a
    CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS    PORTS     NAMES
    c1a2b3c4d5e6   nginx     "/docker-entrypoint.…"   5 seconds ago    Created             my-nginx
  • docker run: Это составная команда, которая выполняет docker create и сразу же docker start. Она создает и запускает контейнер.

    # Создаем и сразу запускаем контейнер в фоновом режиме (-d)
    $ docker run -d --name my-running-nginx nginx
    
    # Проверяем статус (статус будет "Up ...")
    $ docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS         PORTS     NAMES
    f6e5d4c3b2a1   nginx     "/docker-entrypoint.…"   3 seconds ago    Up 2 seconds   80/tcp    my-running-nginx

Основное правило:

docker run = docker create + docker start

Когда что использовать:

  • docker create: Если нужно подготовить контейнер (например, подключить к нему сеть, настроить тома) перед тем, как его запустить вручную командой docker start <container_id>.
  • docker run: В большинстве случаев для немедленного запуска контейнера.

Ответ 18+ 🔞

Давай разберём эту дичь с Docker, как будто я тебе на кухне объясняю, пока чайник кипит.

Представь, что у тебя есть коробка с конструктором — это образ (nginx). Так вот, команда docker create — это когда ты эту коробку принёс, распаковал, все детальки разложил по столу и даже инструкцию прочитал. Но сам конструктор ещё не собрал, он просто лежит, готовый к работе. Контейнер создан, но он спит, как сурок после завтрака. Статус Created, и всё.

# Говорим: "Докер, приготовь мне Nginx, но не трогай!"
$ docker create --name my-nginx nginx

# Смотрим, что получилось — видишь? Создан, но не запущен.
$ docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS    PORTS     NAMES
c1a2b3c4d5e6   nginx     "/docker-entrypoint.…"   5 seconds ago    Created             my-nginx

А теперь команда docker run — это когда ты взял эту же коробку, высыпал детали, собрал по инструкции и тут же нажал кнопку «Пуск». Всё, конструктор ожил, работает, светится и делает, что должен. Контейнер создан и сразу запущен.

# Говорим: "Докер, давай Nginx, и чтобы сразу работал, на фоне!"
$ docker run -d --name my-running-nginx nginx

# Проверяем — о, ёпта, уже бежит!
$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS         PORTS     NAMES
f6e5d4c3b2a1   nginx     "/docker-entrypoint.…"   3 seconds ago    Up 2 seconds   80/tcp    my-running-nginx

Короче, правило простое, как три копейки:

docker run — это docker create плюс docker start. Всё, точка.

Когда какую юзать?

  • docker create — если ты хитрожопый и хочешь всё подготовить заранее: сети там подцепить, тома настроить, конфиги подшаманить, а запустить потом, когда сам захочешь, командой docker start. Типа отложенный старт.
  • docker run — в 99% случаев, когда тебе нужно просто взять и запустить контейнер прямо сейчас. Не мудри, просто жми run.

Вот и вся магия, без ёбаного шаманства. Понял? Если нет — повтори, пока не дойдёт, как до жирафа.