Разница между запуском и запуском контейнера Docker

307

На практике для запуска контейнера я делаю:

docker run a8asd8f9asdf0

Если это так, что делает:

docker start

делать?

В инструкции сказано

Запустить один или несколько остановленных контейнеров

mskw
источник
101
run = create + start
Fumisky Wells
4
Хотелось бы, чтобы в ОП также было включено «выполнить»
Моника Хеднек
Может быть полезно: chat.stackoverflow.com/transcript/76919
Shubham
@MonicaHeddneck Есть докер execute?
Корай Тугай
Вы используете start для контейнера, если вы ранее остановили этот контейнер. Вы используете run to image, если вы ранее удалили контейнер этого изображения. Это основное использование, я думаю.
CodeSlave

Ответы:

351

Это очень важный вопрос, и ответ очень простой, но фундаментальный:

  1. Выполнить: создать новый контейнер изображения и выполнить контейнер. Вы можете создать N клонов одного изображения. Команда есть: docker run IMAGE_ID а не docker run CONTAINER_ID

введите описание изображения здесь

  1. Начало: запуск контейнера, ранее остановленного. Например, если вы остановили базу данных с помощью команды docker stop CONTAINER_ID, вы можете перезапустить тот же контейнер с помощью команды docker start CONTAINER_ID, и данные и параметры будут такими же.

введите описание изображения здесь

daniele3004
источник
1
Нужно ли создавать том для остановленного контейнера, чтобы данные сохранялись?
Логан Филлипс
@LoganPhillips Разница в жизненном цикле между файлами, записанными в слой файловой системы объединения по умолчанию контейнера и файлами, записанными в тома: данные слоя файловой системы объединения контейнера всегда теряются при удалении контейнера ( docker rm container_id). С другой стороны, данные томов переживают удаление контейнера, если -vв командной строке явно не указан параметр. Расположение тома в хост-системе может быть проверено напрямую. Смотрите эту статью
Stphane
О процессе, нужно & в конце runкомандной строки? Я нуждаюсь в этом в качестве местной службы (24 часа)
Питер Краусс
Итак, какова цель «создания докера»? Как / когда это будет использовано?
Джозеф Ганьон
100
  • runзапускает изображение
  • startзапускает контейнер .

docker runДокумент упоминает:

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

То есть, докер пробег эквивалентен API /containers/createзатем /containers/(id)/start.

Вы не запускаете существующий контейнер, вы исполняете его с помощью docker (начиная с docker 1.3) .
Вы можете перезапустить покинутый контейнер .

VonC
источник
@Tarik вы не должны добавить -iк docker runдля интерактивного процесса? Я имею в виду, что для запуска Docker необходим образ для запуска контейнера.
VonC
10
Кажется, у кого-то есть место, чтобы написать более сложный ответ. Ответ не выглядит очень объяснительным.
17
4
Следующий вопрос для меня , Что-разностного-между-а-контейнера и-ан-изображение stackoverflow.com/questions/21498832/...
Alex Punnen
18

Пояснение с примером:

Предположим, у вас есть изображение игры (iso) на вашем компьютере.

Когда вы run(монтируете свой образ как виртуальный диск), создается виртуальный диск со всем содержимым игры на виртуальном диске, и автоматически запускается установочный файл игры. [Запуск вашего образа докера - создание контейнера и его запуск.]

Но когда вы stop(по аналогии с остановкой Docker), виртуальный диск все еще существует, но останавливает все процессы. [Поскольку контейнер существует до тех пор, пока он не будет удален]

И когда вы делаете start (аналогично запуску Docker), с виртуального диска запускаются файлы игр. [запуск существующего контейнера]

В этом примере - образ игры - это ваш образ Docker, а виртуальный диск - ваш контейнер.

Apb
источник
8

Ответ daniele3004 уже довольно хорош.

Просто быстрая и грязная формула для таких людей , как я , кто путает runи startвремя от времени:

docker run [...]= docker pull [...]+docker start [...]

Боуэн
источник
2
Это не совсем так. Согласно официальному документу, "...docker run is equivalent to the API /containers/create then /containers/(id)/start.(источник: docs.docker.com/engine/reference/commandline/run )
СГО
2

runКоманда создает контейнер из образа и затем запускает корневой процесс для этого контейнера. Запуск его с run --rmфлагом избавит вас от необходимости удалять ненужный мертвый контейнер после этого и позволит вам игнорировать существование docker startи docker removeвообще.

введите описание изображения здесь

run Команда делает несколько разных вещей:

docker run --name dname image_name bash -c "whoami"
  1. Создает контейнер из изображения. В этот момент контейнер будет иметь идентификатор, может иметь имя, если оно задано, будет отображаться вdocker ps
  2. Запускает / выполняет корневой процесс контейнера. В приведенном выше коде это будет выполняться bash -c "whoami". Если запустить docker run --name dname image_nameбез команды на выполнение, контейнер немедленно перейдет в остановленное состояние.
  3. После завершения корневого процесса контейнер останавливается. На данный момент, это в значительной степени бесполезно. Никто больше не может выполнить или воскресить контейнер. В основном есть два выхода из остановленного состояния: удалить контейнер или создать контрольную точку (то есть изображение) из остановленного контейнера, чтобы запустить что-то еще. Нужно запустить docker removeперед запуском контейнера под тем же именем.

Как удалить контейнер, если он автоматически остановлен? Добавьте--rmфлаг вrunкоманду:

docker run --rm --name dname image_name bash -c "whoami"

Как выполнить несколько команд в одном контейнере? Предотвращая отмирание этого корневого процесса. Это можно сделать, запустив какую-то бесполезную команду при запуске с--detachedфлагом, а затем используя «execute» для запуска реальных команд:

docker run --rm -d --name dname image_name tail -f /dev/null
docker exec dname bash -c "whoami"
docker exec dname bash -c "echo 'Nnice'"

Зачем нам docker stopтогда? Чтобы остановить этот затяжной контейнер, который мы запустили в предыдущем фрагменте с помощью бесконечной командыtail -f /dev/null.

y.selivonchyk
источник