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


307

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

docker run a8asd8f9asdf0

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

docker start

делать?

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

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


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, и данные и параметры будут такими же.

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


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) .
Вы можете перезапустить покинутый контейнер .


@Tarik вы не должны добавить -iк docker runдля интерактивного процесса? Я имею в виду, что для запуска Docker необходим образ для запуска контейнера.
— VonC

10
Кажется, у кого-то есть место, чтобы написать более сложный ответ. Ответ не выглядит очень объяснительным.
— 17

4
Следующий вопрос для меня , Что-разностного-между-а-контейнера и-ан-изображение stackoverflow.com/questions/21498832/...
— Alex Punnen

18

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

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

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

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

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

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


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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.