Нужно отсоединиться от контейнера, сохранив его основной процесс. При указанном запуске с -it стандартная последовательность Docker — Ctrl+P, затем Ctrl+Q. Нажимайте сочетания по очереди. После этого вы вернётесь в терминал хоста, а оболочка внутри контейнера останется работать, если она сама не завершилась.
Причина остановки после exit проста: в вашем примере sh является главным процессом контейнера. Пока этот процесс существует, контейнер работает. Когда оболочка выходит, Docker не обязан держать пустой контейнер запущенным ради сохранения приглашения командной строки. Это не поведение полноценной гостевой операционной системы с постоянно работающим init.
Для повторного подключения к тому же основному процессу используйте docker attach ИМЯ_КОНТЕЙНЕРА, подставив настоящее имя. Учтите, что attach присоединяет ввод и вывод уже работающей программы. Если это не оболочка, ваши символы получает именно та программа, а не новый командный интерпретатор.
Ctrl+C не стоит использовать как замену отсоединению. В зависимости от параметров и приложения сигнал может завершить процесс. Само закрытие окна терминала тоже не является точным эквивалентом предусмотренной последовательности. Если Ctrl+P и Ctrl+Q не срабатывают, проверьте, действительно ли контейнер был создан с интерактивным вводом и TTY, и не переопределена ли комбинация через detach keys.
Это отличается от дополнительного сеанса docker exec: завершение созданной им оболочки обычно не завершает основной процесс контейнера. Здесь же вы хотите сохранить именно исходную оболочку, поэтому подходит отсоединение, а не её выход.
Ответить на вопрос