용기를 멈추지 않고 용기에서 분리하는 올바른 방법


313

Docker 1.1.2 (최신)에서 컨테이너를 멈추지 않고 컨테이너에서 분리하는 올바른 방법은 무엇입니까?

예를 들어 시도하면

  • docker run -i -t foo /bin/bash 또는
  • docker attach foo (이미 실행중인 컨테이너의 경우)

둘 다 컨테이너의 터미널로 연결됩니다. 컨테이너 터미널을 멈추지 않고 어떻게 종료합니까?

exit그리고 CTR+C둘 다 컨테이너를 멈 춥니 다.


"컨테이너"는 프로세스가 실행될 수있는 제한된 네임 스페이스 (프로세스 네임 스페이스, 파일 시스템 네임 스페이스 등)의 집합입니다. 네임 스페이스 내부에 프로세스가없는 경우 해당 네임 스페이스가 실제로 존재합니까? 커널 응답 클럭 인터럽트 & c가있는 가상 머신과 다릅니다. 상관없이.
Charles Duffy

답변:


166

업데이트 : 같이 대답 아래에 언급 된 Ctrl+ p, Ctrl+ q이제 데몬 모드로 대화 형 모드를 설정합니다.


Ctrl+ C(또는 Ctrl+ \)는 컨테이너에서 분리해야하지만 기본 프로세스는 bash이기 때문에 컨테이너 가 종료됩니다.

도커에 대한 약간의 교훈. 컨테이너는 완전한 기능을 갖춘 OS가 아닙니다. 컨테이너를 실행할 때 시작하는 프로세스는 PID 1을 취하고 초기화 전원을 가정합니다. 따라서 해당 프로세스가 종료되면 새로운 프로세스가 시작될 때까지 (도커 시작을 통해) 데몬이 컨테이너를 중지합니다 ( http://phusion.github.io/baseimage-docker/#intro 문제에 대한 자세한 설명 ).

항상 분리 모드로 실행되는 컨테이너를 원한다면 사용하는 것이 좋습니다.

docker run -d foo

컨테이너에 ssh 서버가 있습니다. (가장 쉬운 방법은 dockerizing openssh tutorial https://docs.docker.com/engine/examples/running_ssh_service/ 를 따르는 것입니다 )

또는 다음을 통해 컨테이너를 다시 시작할 수 있습니다.

docker start foo

(기본적으로 분리됩니다)


3
baseimage-docker의 경우 +1 Docker의 어려운 부분에 대한 조언이있는 템플릿이 있다는 것을 아는 것이 좋습니다.
mtmacdonald


1
-d 모드로 포함 된 것을 실행하는 것이 매우 도움이되었습니다. 또한 Dockerfile을 통해 ssh를 시작하는 링크로 인해 내 인생이 쉬워졌습니다.
Ravi

56
Ctrl-p, Ctrl-q를 사용하여 분리하십시오 . 이 답변의 조언은 컨테이너를 죽일 것입니다.
taranaki

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)로 컨테이너를 시작한 경우에만 작동합니다. 데몬 모드 (-d)에서 시작하여 연결 한 경우 해당 모드를 종료하면 백그라운드에서 계속 실행됩니다.
Riscie

1
@SlimShady Ctrl + P를 누른 다음 Ctrl + Q를 눌러 둘 중 하나가 아니라 순서대로 종료하십시오.
Mohyaddin Alaoddin

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( without -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를 얻습니다. 그런 다음 : -9 <pid>를 죽이십시오
phanhuy152

pkill은 docker attach 후 나를 위해 일한 유일한 것
sm4rk0

왜 우리는 -9가 필요합니까? -9를 사용하지 않으면 컨테이너가 종료됩니다.
Angelo

다른 신호는 신호입니다. 그들은 프로세스에 어떤 유형의 신호를 알려주고 행동하고 무언가를 할 수있는 기회를 제공합니다. kill -9신호는하지 않습니다. 프로세스가 종료되고 상환이 없습니다. 내 생각에 다른 신호는 컨테이너에 종료 할 수있는 기회를 주지만 -9그렇지 않은 경우입니다.
berto

1
이것은 매우 도움이되었습니다. 감사!
Evan Zamir가

40

"docker attach"container id "를 수행하면 컨테이너에 들어갑니다. 컨테이너를 중지하지 않고 컨테이너를 종료하려면 Ctrl+ P+ 를 입력해야합니다.Q


6
Ctrl + P와 Ctrl + Q보다 낫다
sib10

4
Ctrl + P, Q (여전히 Ctrl 키를 누른 상태
;;

그것은 나를 돌려줍니다 :Error response from daemon: Container f560a0ad6806150b2775d0b6e6d5f7065a03775bae858fb4fb7df05a277976db is not running
Webwoman

31

Ashwin의 답변이 가장 정확하다고 생각합니다. 이전 답변은 다음과 같습니다.


컨테이너를 다음과 같이 실행하는 다른 옵션을 여기에 추가하고 싶습니다.

docker run -dti foo bash

그런 다음 컨테이너를 입력하고 bash를 실행할 수 있습니다.

docker exec -ti ID_of_foo bash

sshd를 설치할 필요가 없습니다 :)


나는 두 번째 명령에서 foo를 foo의 컨테이너 ID로 대체해야한다고 생각합니다.
Nehal J Wani

이러한 맥락에서, 나는 docker attach첫 번째 bash 실행에 다시 연결함으로써 더 표준 적이 라고 생각 합니다. docker exec여기서도 작동하지만 첫 번째 프로세스 외에도 새로운 bash 프로세스가 생성됩니다. 물론 프로세스는 첫 번째 컨텍스트와 동일한 컨텍스트 / 환경 / 컨테이너 내에서 작성되지만 다른 프로세스입니다 (유사한 터미널 에뮬레이터에서 새 터미널 탭을 여는 것입니다).
thiagowfx

20

대화식 컨테이너에서 분리하는 기본 방법은 Ctrl+ P Ctrl+ Q이지만 새 컨테이너를 실행하거나 --detach-keys 플래그를 사용하여 기존 컨테이너에 연결할 때이를 무시할 수 있습니다 .


16

를 통해 docker attach연결 한 경우 도커 연결 프로세스를 종료하여 분리 할 수 ​​있습니다. 더 좋은 방법은 sig-proxy 매개 변수를 사용하여 Ctrl + C를 컨테이너에 전달하지 않는 것입니다.

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

동일한 옵션을 docker run명령에 사용할 수 있습니다 .


6
하지만 --sig - 프록시 = 거짓이 매우 유용합니다, 그것은 지정되지 않은 이미 연결된 컨테이너 작업을하지 않습니다. 문제는 부착 후 "도커 연결 프로세스 종료"를 포함하여 프로세스를 종료하지 않고 분리 할 수있는 방법이없는 것 같습니다. Cp, Cq는 첨부 된 컨테이너에서는 작동하지 않으며 대화 형 컨테이너 (질문과 같은) 만 작동합니다.
taranaki

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 attach 명령과 함께 플래그를 사용하십시오 . 의 형식은 <sequence>문자 [a-Z]이거나 다음 중 하나 ctrl-와 결합 된 것입니다.

  • az (단일 소문자 알파 문자)
  • @ (표지판에)
  • [(왼쪽 대괄호)
  • \ (두 개의 백 슬래시)
  • _ (밑줄)
  • ^ (캐럿)

a, ctrl-a, X, 또는 ctrl-\\값이 유효한 키 시퀀스의 예입니다. 모든 컨테이너에 대해 다른 구성 기본 키 시퀀스를 구성하려면 구성 파일 섹션을 참조하십시오 .

참고 : 이것은 docker 버전 1.10 이상부터 작동합니다 (이 답변시 현재 버전은 18.03입니다)


0

오래된 게시물이지만 종료하고 다시 시작하십시오 ... 문제는 Windows 컴퓨터에있는 경우 Ctrl p 또는 Ctrl P가 인쇄에 묶여있는 경우 ... 시작을 종료하면 컨테이너가 아프지 않아야합니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.