Docker run vs create

93

В чем разница между docker runи docker createкоманды?

Обычно я использую, runно иногда в документации вижу create.

Докеры --helpговорят

create    Create a new container
run       Run a command in a new container

Означает ли это, что runон используется, когда нам нужно передать команду новому контейнеру? В чем тогда цель create?

Фред Мерио
источник

Ответы:

105

Из документации докеров

Команда docker create создает слой контейнера с возможностью записи поверх указанного образа и подготавливает его для выполнения указанной команды. Затем идентификатор контейнера печатается в STDOUT. Это похоже на docker run -d, за исключением того, что контейнер никогда не запускается . Затем вы можете использовать команду docker start, чтобы запустить контейнер в любой момент.

Это полезно , когда вы хотите создать контейнер конфигурации впереди времени , так что он готов начать , когда вам это нужно. Создан начальный статус нового контейнера.

DAXaholic
источник
2
Подчеркивая сходство, --run принимает ВСЕ те же аргументы, что и --create (с добавлением только --detach, --detach-keys и --sig-proxy), см. Docs.docker.com/v17.09 / engine / reference / commandline / run /…
Марвин,
117

Технически docker run= docker create+ docker start.

шрирам926
источник
42
На самом деле, я потратил пару часов на изучение этого, docker run= docker create+ docker start+ docker attach. Без attachнего запущенный контейнер работает в фоновом режиме
webbower
19

docker createКоманда создает из образа записываемый контейнер и подготавливает его к запуску .

docker runкоманда создает контейнер (такой же, как docker create) и запускает его .

NetworkMeister
источник
1
U написал: «docker run создает контейнер (так же, как docker create) и запускает его». <--- циклическое определение, и вы не установили разницу между exec и start и тем, что вы называете «запускает его». (И когда вы говорите "запускает его", если мы посмотрим на ваше определение запуска в docker run, это означает создание и запуск, так что вы получите бесконечное число ... так что, вероятно, вы имеете в виду что-то меньшее, чем это, когда вы говорите "запускает его" ... но тогда вы должны отличать "запускает" от exec и start, вы имеете в виду start и exec или просто start). Возможно, -d означает не запускать exec. а без -d - это start и exec
barlop
8

В других ответах это описано, но я подумал, что покажу эквивалентные командные строки оболочки, потому что это действительно ясно:

$ docker run myimage

такой же как

$ docker start -a $(docker create myimage)

Здесь docker createиспользуется для создания контейнера из именованного изображения и вывода созданного идентификатора контейнера, а также docker startдля запуска контейнера с этим идентификатором. Эта -aопция заставляет терминал подключаться, чтобы контейнер работал на переднем плане, что является поведением по умолчанию docker run.

Контейнер, который был создан, но никогда не запускался, будет иметь Createdстатус; это можно увидеть с помощью docker container ls -a.

Starfry
источник
6

Я новичок в докере и только что начал играть с ним;

Я считаю, что docker run по существу выполняет следующее: (в порядке…) docker create , docker start , docker attach , поскольку он сразу же подключается к активной оболочке после того, как вы выполните команду «run» .

Ааронле
источник
1
Просто разместил комментарий выше по этому поводу, прежде чем я заметил ваш ответ. Хотел бы я видеть это час назад или около того.
webbower
-3

Docker run в основном предназначен для запуска команд в контейнере.

docker run -it <Container Name> /bin/bash

Вышеупомянутое предназначено для создания терминала bash. И заставьте нас использовать команды bash в контейнере.

Docker create - это создать контейнер из образа Docker.

docker create -d /var/lib:/var/lib --name docker-ubuntu ubuntu

Сказанное выше предназначено для создания докера контейнера с именем «docker-ubuntu» из образа «ubuntu»

Венкат Судхаршанам
источник
1
Вы можете обойтись docker run -it <Container name>без выполнения / bin / bash. Например, рубиновый автоматически запустит исполняемый файл irb. Кроме того, вы можете выполнить команду run -d, это делается с помощью dockersamples / static-site, который не входит в систему. Поэтому я думаю, что он не выполняет exec, а просто запускает его.
barlop
с 'docker run' вы можете запускать, если контейнер уже создан и создавать, а если нет, то запускать
Сергей Гетман