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


306

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

docker run a8asd8f9asdf0

Якщо це так, то що:

docker start

робити?

У посібнику сказано

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


101
run = create + start
Fumisky Wells

4
Я хотів би, щоб в ОП також було включено "стратити"
Моніка Хеднек

Може бути корисним: chat.stackoverflow.com/transcript/76919
Shubham

@MonicaHeddneck Є докер execute?
Корай Тугай

Ви використовуєте пуск до контейнера, якщо раніше ви його зупиняли . Ви використовуєте біг до зображення, якщо елієр видалив контейнер із цим зображенням. Я думаю, це основне використання.
CodeSlave

Відповіді:


349

Це дуже важливе питання, і відповідь дуже проста, але принципова:

  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.

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


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

10
Здається, комусь є можливість написати більш детальну відповідь. Відповідь виглядає не дуже пояснювально.
квартал

4
Наступне питання для мене , Що-різницевого-між-а-контейнера і-ан-зображення stackoverflow.com/questions/21498832 / ...
Alex Punnen

18

Пояснення з прикладом:

Подумайте, що у вас на комп’ютері є ігрове (ізо) зображення.

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

Але коли ви stop(як і докер зупиняєте) це, віртуальний диск все ще існує, але зупиняє всі процеси. [Оскільки контейнер існує, поки він не буде видалений]

А коли ви це робите start(подібно до запуску докера), з віртуального диска файли ігор починають його виконання. [запуск існуючого контейнера]

У цьому прикладі - Ігровий образ - це ваше зображення Docker, а віртуальний диск - ваш контейнер.


8

Відповідь daniele3004 вже досить хороша.

Просто швидка і брудна формула для таких людей , як я , хто плутає runі startчас від часу:

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


2
Це не зовсім так. За даними офіційного doc, "...docker run is equivalent to the API /containers/create then /containers/(id)/start.(джерело: docs.docker.com/engine/reference/commandline/run )
sshh

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. Після закінчення кореневого процесу контейнер зупиняється. На даний момент це в значній мірі марно. Більше нічого не можна виконати або воскресити контейнер. В основному є 2 способи виходу із зупиненого стану: видаліть контейнер або створіть контрольну точку (тобто зображення) із зупиненого контейнера, щоб запустити щось інше. До 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.