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

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

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

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

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

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

Ответ 1

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


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

Небольшой урок о докере. Контейнер не является полноценной полнофункциональной ОС. Когда вы запускаете контейнер, процесс, который вы запускаете, берет PID 1 и принимает мощность инициализации. Поэтому, когда этот процесс завершается, демон останавливает контейнер до тех пор, пока не будет запущен новый процесс (через запуск Docker) (дополнительные пояснения по этому вопросу 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

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

Ответ 2

Тип 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")

Ответ 3

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

  • был выделен TTY (-t)
  • был оставлен стандартным (-i)

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

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

[[email protected]]$ docker attach test
# here I typed ^P^Q
read escape sequence

# i'm back to my prompt
[[email protected]]$ docker kill test; docker rm -v test
test
test

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

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

[[email protected]]$ docker attach test
^C

[[email protected]]$    

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

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

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

[[email protected]]$ 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
[[email protected]]$

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

Ответ 4

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

Ответ 5

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


Я хотел бы добавить еще один вариант, который должен запускать контейнер следующим образом
docker run -dti foo bash

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

docker exec -ti ID_of_foo bash

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

Ответ 6

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

Ответ 7

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

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

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

Ответ 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> - это буква [aZ] или ctrl- сочетании с любым из следующего:

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

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

Примечание: Это работает начиная с версии 1. Docker 10+ (на момент этого ответа текущая версия была 18.03)

Ответ 9

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

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