Правильный способ отсоединения от контейнера, не останавливая его


313

В Docker 1.1.2 (последняя версия), как правильно отсоединить контейнер, не останавливая его?

Так, например, если я попробую:

  • docker run -i -t foo /bin/bash или
  • docker attach foo (для уже работающего контейнера)

оба из которых доставляют меня к терминалу в контейнере, как мне выйти из терминала контейнера, не останавливая его?

exitи CTR+Cоба останавливают контейнер.


«Контейнер» - это просто набор ограниченных пространств имен (пространство имен процесса, пространство имен файловой системы и т. Д.), В которых могут выполняться процессы. Если у вас нет процесса внутри пространства имен, действительно ли это пространство имен существует? Это не виртуальная машина, где ядро ​​отвечает на прерывания часов и т. Д. несмотря на.
Чарльз Даффи

Ответы:


166

Обновление: как указано в ответах ниже Ctrl+ p, Ctrl+ qтеперь превратит интерактивный режим в режим демона.


Хорошо Ctrl+ C(или Ctrl+ \) должен отсоединить вас от контейнера, но он убьет контейнер, потому что ваш основной процесс - bash.

Небольшой урок о докере. Контейнер не является полноценной полнофункциональной ОС. Когда вы запускаете контейнер, процесс, который вы запускаете, берет PID 1 и принимает мощность инициализации. Поэтому, когда этот процесс завершается, демон останавливает контейнер до тех пор, пока не будет запущен новый процесс (с помощью запуска докера) (дополнительные пояснения по этому вопросу http://phusion.github.io/baseimage-docker/#intro ).

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

docker run -d foo

С ssh-сервером на контейнере. (самый простой способ - следовать учебному пособию по докеризации openssh https://docs.docker.com/engine/examples/running_ssh_service/ )

Или вы можете просто перезапустить свой контейнер через

docker start foo

(он будет отключен по умолчанию)


3
+1 для baseimage-docker. Приятно знать, что есть шаблон с советами о сложных деталях Docker.
mtmacdonald

Обратите внимание, что ssh не является строго обязательным: blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker
Адриан Муат

1
запуск содержимого в режиме -d был очень полезен. Кроме того, ссылка для запуска ssh через Dockerfile облегчила мне жизнь.
Рави

56
Отсоедините, используя Ctrl-p, Ctrl-q. Совет этого ответа убьет контейнер.
Таранаки

4
Это сработало для меня (взято из ответа ниже): начните с -ti -d, затем присоедините docker attach, затем отсоедините сначала ctrl + p, а затем ctrl + q. Я думал, я мог бы использовать только одно из сочетаний клавиш.
CGFoX

526

Введите Ctrl+, pзатем Ctrl+ q. Это поможет вам переключить интерактивный режим в режим демона.

См. Https://docs.docker.com/v1.7/articles/basics/#running-an-interactive-shell .

# To detach the tty without exiting the shell,
# use the escape sequence Ctrl-p + Ctrl-q
# note: This will continue to exist in a stopped state once exited (see "docker ps -a")

4
Кажется, он не работает с (пытается выйти из подключенного контейнера Wekan).
danger89

7
Я посетил эту страницу так раз, потому что я не мог вспомнить эту комбинацию клавиш точно! :-D
Thamme Gowda

10
@ danger89 ctrl-p, ctrl-q будет работать только тогда, когда вы запустили свой контейнер в интерактивном режиме (-it). Если вы запустили его в режиме deamon (-d) и подключили к нему, вы можете просто выйти из него, и он все равно будет работать в фоновом режиме.
Риски

1
@SlimShady нажмите Ctrl + P, затем Ctrl + Q, чтобы выйти, не один из них, а оба в указанном порядке.
Мохьяддин Алаоддин

160

Я копался в этом, и все ответы выше частично верны. Все зависит от того, как запускается контейнер. При запуске контейнера все сводится к следующему:

  • был выделен TTY ( -t)
  • был открыт STDIN ( -i)

^P^Q работает, НО только когда -tи -iиспользуется для запуска контейнера:

[berto@g6]$ docker run -ti -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;'
b26e39632351192a9a1a00ea0c2f3e10729b6d3e22f8e0676d6519e15c08b518

[berto@g6]$ docker attach test
# here I typed ^P^Q
read escape sequence

# i'm back to my prompt
[berto@g6]$ docker kill test; docker rm -v test
test
test

ctrl+c работает, НО только когда -t( без -i ) используется для запуска контейнера:

[berto@g6]$ docker run -t -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;'
018a228c96d6bf2e73cccaefcf656b02753905b9a859f32e60bdf343bcbe834d

[berto@g6]$ docker attach test
^C

[berto@g6]$    

Третий способ отделить

Есть способ отсоединиться, не убивая контейнер, хотя; вам нужна другая оболочка Таким образом, выполнение этого в другой оболочке отсоединилось и оставило запущенный контейнер pkill -9 -f 'docker.*attach':

[berto@g6]$ docker run -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;'
b26e39632351192a9a1a00ea0c2f3e10729b6d3e22f8e0676d6519e15c08b518

[berto@g6]$ docker attach test
# here I typed ^P^Q and doesn't work
^P
# ctrl+c doesn't work either
^C
# can't background either
^Z

# go to another shell and run the `pkill` command above

# i'm back to my prompt
[berto@g6]$

Зачем? Потому что вы убиваете процесс, который связывал вас с контейнером, а не с самим контейнером.


2
Третий способ работает для меня. Спасибо. если вы присоединяетесь к нескольким экземплярам и хотите отсоединиться только от одного. Может убить конкретный процесс: ps -ef | grep attach -> получить pid. Затем: kill -9 <pid>
phanhuy152

pkill - единственное, что сработало для меня после присоединения докера
sm4rk0

Зачем нам нужен -9. Я заметил, что если мы не используем -9, он закрывает контейнер.
Анджело

Другие сигналы таковы, сигналы. Они сообщают процессу, какой тип сигнала, и дают ему возможность действовать и что-то делать. kill -9Сигнал не делает. Процесс завершен и не имеет права регресса. Я предполагаю, что другие сигналы дают возможность контейнеру отключиться, а -9нет.
Берто

1
Это было очень полезно. Спасибо!
Эван Замир

40

Если вы делаете «docker attach» идентификатор контейнера », вы попадаете в контейнер. Чтобы выйти из контейнера без остановки контейнера, вам нужно ввести Ctrl+ P+Q


6
лучше Ctrl + P и Ctrl + Q
sib10

4
Ctrl + P, Q (все еще удерживая Ctrl);)
dimpiax

это возвращает меня:Error response from daemon: Container f560a0ad6806150b2775d0b6e6d5f7065a03775bae858fb4fb7df05a277976db is not running
веб-женщина

31

Я считаю ответ Эшвина самым правильным, мой старый ответ ниже.


Я хотел бы добавить еще один вариант здесь, чтобы запустить контейнер следующим образом

docker run -dti foo bash

Затем вы можете войти в контейнер и запустить bash с

docker exec -ti ID_of_foo bash

Не нужно устанавливать sshd :)


Я думаю, что во второй команде вам нужно заменить foo идентификатором контейнера foo
Nehal J Wani

В этом контексте, я думаю, docker attachбыло бы более стандартным, присоединяясь к первому запуску bash. docker execтакже работает здесь, однако он создает новый процесс bash в дополнение к первому. Конечно, процесс создается в том же контексте / среде / контейнере, что и первый, но он другой (аналогично открывать новую вкладку терминала в вашем любимом эмуляторе терминала).
thiagowfx

20

Способ отсоединения от интерактивного контейнера по умолчанию - Ctrl+ P Ctrl+ Q, но вы можете переопределить его при запуске нового контейнера или присоединении к существующему контейнеру с помощью флага --detach-keys .


17

Если вы подключились через docker attach, вы можете отсоединиться, убив процесс присоединения докера. Лучше использовать параметр sig-proxy, чтобы избежать передачи Ctrl + C в ваш контейнер:

docker attach --sig-proxy=false [container-name]

Та же опция доступна для docker runкоманды.


6
Хотя --sig-proxy = false чрезвычайно полезен, он не работает для уже подключенных контейнеров, для которых он не был указан. Проблема в том, что после присоединения, похоже, НЕТ способа отсоединения без остановки процесса, включая «уничтожение процесса присоединения докера». Cp, Cq не работает с прикрепленными контейнерами, только интерактивные (как в вопросе).
Таранаки

1
Это должен быть принятый ответ, включая комментарий @taranaki, Ctrl + P, Q не работает дляphp:7.3-apache
MKaama

10

Если вы просто хотите увидеть результаты процесса, запущенного из контейнера, вы можете сделать это просто docker container logs -f <container id>.

-fФлаг делает это так , что выход из контейнера followedи обновляется в режиме реального времени. Очень полезно для отладки или мониторинга.


8

Вы можете использовать эту --detach-keysопцию при запуске, docker attachчтобы переопределить последовательность CTRL+ P, CTRL+ по умолчанию Q(это не всегда работает).

Например, когда вы запускаете docker attach --detach-keys="ctrl-a" testи нажимаете CTRL+, Aвы выходите из контейнера, не убивая его.

Другие примеры:

  • docker attach --detach-keys="ctrl-a,x" test- нажмите CTRL+Aи затем, Xчтобы выйти
  • docker attach --detach-keys="a,b,c" test- нажмите A, затем B, Cчтобы выйти

Выписка из официальной документации:

Если вы хотите, вы можете настроить переопределение последовательности клавиш Docker для отсоединения. Это полезно, если последовательность Docker по умолчанию конфликтует с последовательностью клавиш, которую вы используете для других приложений. Существует два способа определить собственную последовательность ключей отсоединения: переопределение для каждого контейнера или свойство конфигурации для всей конфигурации.

Чтобы переопределить последовательность для отдельного контейнера, используйте --detach-keys="<sequence>"флаг с командой присоединения docker. Формат <sequence>письма - либо буква [a-Z], либо в ctrl-сочетании с любым из следующего:

  • az (один строчный буквенный символ)
  • @ (под знаком)
  • [(левая скобка)
  • \ (две косые черты)
  • _ (нижнее подчеркивание)
  • ^ (карета)

Эти a, ctrl-a, Xили ctrl-\\значения являются примерами действительных последовательностей ключевыми. Чтобы настроить другую последовательность ключей конфигурации по умолчанию для всех контейнеров, см. Раздел «Файл конфигурации ».

Примечание: это работает с версии 1.10+ докера (на момент этого ответа текущая версия была 18.03)


0

Старый пост, но просто выйдите и запустите его снова ... Проблема в том, что если вы работаете на компьютере с Windows, Ctrl p или Ctrl P привязаны к печати ... выход из стартового контейнера не должен повредить чему-либо

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