Docker 프로세스에서 어떻게 연결 및 분리합니까?


456

도커 프로세스에 연결할 수 있지만 Ctrl+ c가 분리되지 않습니다. exit기본적으로 프로세스를 중단합니다.

프로세스를 실행하고 때때로 변경하여 변경 한 다음 분리하는 데 권장되는 워크 플로우는 무엇입니까?


4
nsenter를 사용할 때 Ctrl-D 만 나옵니다.
user2105103

합니까 폐쇄 xterm, konsole등의 일을? 그것은 나를 위해 작동합니다 (분리됩니다).
Vytenis Bivainis

답변:


666

쉘을 종료하지 않고 청각 장애를 분리하려면, 이스케이프 시퀀스 사용 Ctrl+ P뒤에 Ctrl+를 Q. 자세한 내용은 여기를 참조 하십시오 .

이 출처의 추가 정보 :

  • docker run -t -i → ^P^Qdocker attach 로 분리했다 가 다시 부착 가능
  • docker run -i →로 분리 할 수 ​​없습니다 ^P^Q. stdin을 방해합니다
  • 도커 실행 → ^P^Q; 으로 분리 할 수 ​​없습니다 . SIGKILL 클라이언트 수 있습니다; 도커 부착으로 다시 부착 가능

46
실제로 문서에 설명 된대로 작동하면 큰 대답이 될 것입니다.
allingeek

20
-it로 실행할 때도 정리 플래그 (--rm)로 컨테이너를 시작하면 분리 시퀀스가 ​​실패한다는 것을 알았습니다. 이것은 일부 사람들에게는 분명 할 수 있지만 인정하고 싶은 것보다 더 자주 물립니다.
allingeek

7
또 다른 옵션은 터미널 창 또는 cmd-w를 닫는 것입니다. :)
buildmaestro

3
예를 들어 "detachKeys": "ctrl-a,a".docker / config.json 파일 또는 --detach-keys "ctrl-a,a"명령 줄에서 attach 등을 사용하여 구성 가능한 분리 키를 설정할 수 있습니다 .
Matthew Hannigan

4
Ctrl + Z분리하지 않습니다. 프로세스를 배경으로합니다. 분리와 같지 않으며 성능이 저하됩니다.
Zenexer

177

또한 체크 아웃 옵션 :--sig-proxy

docker attach --sig-proxy=false 304f5db405ec

그런 다음 CTRL+ c를 사용 하여 분리


4
연결 대신 실행으로 시작하여 시도해 보았습니다. docker run -ti --sig-proxy=false busybox top 작동하지 않는 것처럼 보이지만 프로세스는 ctrl-c로 종료되지만 시작 docker run -t -sig-proxy=false busybox top 하면 작동 하는 것처럼 보이며 ctrl-c로 종료 할 수 있습니다.
Henning

Ctrl-c컨테이너도 멈 춥니 다.
Evan Hu

Docker 19.03.5를 실행하는 Debian 9 서버에서 작동하는 여기에 나열된 솔루션 중 유일한 솔루션입니다. 질문은 이것이 왜 첨부 명령의 기본 설정이 아닌 것입니까? 가장 일반적인 사용 사례 인 것 같습니다.
fviktor

Ctrl-p, Ctrl-q 시퀀스가 ​​작동하지 않습니다 (docker container attach xyz로 시작). 그러나 이것은 작동합니다. 감사합니다 @czerasz
PravyNandas

92

파일을 수정하거나 프로세스를 검사하려는 경우 원하는 다른 솔루션이 있습니다.

다음 명령을 실행하여 기존 컨테이너에서 새 프로세스를 실행할 수 있습니다.

sudo docker exec -ti [CONTAINER-ID] bash

bash 셸을 사용하여 새 프로세스를 시작하면 Ctrl+로 C직접 벗어날 수 있으며 원래 프로세스에는 영향을 미치지 않습니다.


6
이렇게하면 원래 프로세스에 영향을주지 않고 "종료"를 입력 할 수 있습니다.
Eko3alpha

이것은 실행중인 컨테이너에 연결하는 좋은 방법입니다. 그러나 컨테이너에서 일부 프로세스가 실행 중이고 해당 프로세스를 다시 시작하려면 어떻게해야합니까? 아, 이전 프로세스를 종료하고 새 프로세스를 다시 시작한 다음 Cp, Cq를 사용하면 대화 형 tty이므로 작동합니다. --sig-proxy = false 방법도 마음에 들지만이 방법은 더욱 다양하며 현재 프로세스를 중단시키지 않습니다.
taranaki

"첨부"는 Docker에 특정한 의미를 지니고 exec있습니다.
frnhr

48

나는 이것이 상황에 달려 있다고 생각합니다. 다음 컨테이너를 예로 들어보십시오.

# docker run -it -d ubuntu
91262536f7c9a3060641448120bda7af5ca812b0beb8f3c9fe72811a61db07fc
# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
91262536f7c9        ubuntu              "/bin/bash"         5 seconds ago       Up 4 seconds                            serene_goldstine

(1) " docker attach"를 사용하여 용기를 부착하십시오.

" docker attach" 새 tty를 할당 하지 않지만 원래 실행중인 tty를 재사용하므로 exit명령 을 실행하면 실행 중인 컨테이너가 종료됩니다.

# docker attach 91262536f7c9
exit
exit
# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
91262536f7c9        ubuntu              "/bin/bash"         39 minutes ago      Exited (0) 3 seconds ago                       serene_goldstine

따라서 실제로 컨테이너 종료를 실행하지 않으려면 Ctrl+ p+ Ctrl+ 를 사용해야합니다 q.

(2) " docker exec" 사용

" docker exec" 새로운 tty 할당하므로 + + + exit대신 사용해야한다고 생각합니다 . CtrlpCtrlq

다음은 컨테이너를 종료하기 위해 Ctrl+ p+ Ctrl+ q를 실행하는 것입니다 .

# docker exec -it 91262536f7c9 bash
root@91262536f7c9:/# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  18160  1908 ?        Ss+  04:03   0:00 /bin/bash
root        15  0.0  0.0  18164  1892 ?        Ss   04:03   0:00 bash
root        28  0.0  0.0  15564  1148 ?        R+   04:03   0:00 ps -aux
root@91262536f7c9:/# echo $$
15

그런 다음 로그인 컨테이너를 다시 사용하면 bash이전 docker exec명령 의 프로세스 가 여전히 활성 상태 임을 알 수 있습니다 (PID는 15 임).

# docker exec -it 91262536f7c9 bash
root@91262536f7c9:/# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  18160  1908 ?        Ss+  04:03   0:00 /bin/bash
root        15  0.0  0.0  18164  1892 ?        Ss+  04:03   0:00 bash
root        29  0.0  0.0  18164  1888 ?        Ss   04:04   0:00 bash
root        42  0.0  0.0  15564  1148 ?        R+   04:04   0:00 ps -aux
root@91262536f7c9:/# echo $$
29

39

실행중인 컨테이너에서 분리하기 위해 사용 ^P^Q(홀드 Ctrl를 눌러 P눌러 Q, 릴리스 Ctrl).

캐치가있다 : 컨테이너가 시작되었다있을 경우에만 작동 모두 -t-i.

이러한 옵션 중 하나 (또는 ​​둘 다)없이 시작된 실행중인 컨테이너가 있고로 연결하는 docker attach경우 분리 할 다른 방법을 찾아야합니다. 선택한 옵션과 실행중인 프로그램에 따라 ^C작동하거나 전체 컨테이너가 종료 될 수 있습니다. 실험해야합니다.

또 다른 캐치 : 사용중인 프로그램에 따라 터미널, 셸, SSH 클라이언트 또는 멀티플렉서가 ^P또는 ^Q(보통 후자)를 가로 챌 수 있습니다 . 이것이 문제인지 테스트하려면 --detach-keys z인수로 실행하거나 첨부하십시오 . 이제 z수정자를 사용하지 않고을 눌러 분리 할 수 ​​있습니다 . 이것이 작동하면 다른 프로그램이 방해하는 것입니다. 이 문제를 해결하는 가장 쉬운 방법 은 인수를 사용 하여 고유 한 분리 시퀀스설정하는 것--detach-keys 입니다. (예를 들어로 종료 ^K하려면을 사용하십시오 --detach-keys 'ctrl-k'.) 또는 터미널 또는 기타 간섭 프로그램에서 키 차단을 비활성화 할 수 있습니다. 예를 들어, stty start ''또는 stty start undef가로채는 단말 못할 수도^Q 일부 POSIX 시스템에서는 이것이 도움이되지 않습니다.


2
매우 정확한 설명, 매력처럼 작동
Meir Gabay

27

아무것도 작동하지 않으면 새 터미널 을 열고 다음을 수행하십시오.

$ ps aux | grep attach
username  <pid_here>    ..............  0:00 docker attach <CONTAINER_HASH_HERE>
username  <another_pid> ..............  0:00 grep --color=auto attach
$ kill -9 <pid_here>

무슨 함정이야! 감사합니다. 이것이 유일하게 작동 한 것입니다. -9필요하지 않았습니다.
히스 서까래

이것은 또한 어떤 플래그가 설정되었는지에 따라 컨테이너를 죽입니다.
AdamAL

1
주의 두 가지의 PID가있는 경우 첫 번째는 부모 인 후 표시됩니다. 당신은해야 두 번째 PID를 사용 죽이고 docker attach부모를하지.
joeytwiddle

11

컨테이너에서 분리하려면 간단히 잡고 +를 Ctrl누릅니다 .PQ

사용중인 컨테이너에 연결하려면 다음을 수행하십시오.

$ docker container attach "container_name"

9

나는 동일한 문제가 있었다 ctrl- P그리고 Q작동하지 않을 것입니다,도 ctrl- C결국 나는 다른 터미널 세션을 열고 나가 "고정 표시기 정지했다 ... containerid "와 "고정 표시기 시작 containerid를 "하고 작업이 완료되었다. 기묘한.


--rm플래그로 컨테이너를 시작하면 작동하지 않습니다 . Ctrl+P그리고 Ctrl+Q당신이 컨테이너 시작하면 작동 -it플래그.
Aswath K

4

같은 껍질에서 ctrl키를 누른 상태에서 키를 누른 p다음q


3
-it플래그로 컨테이너를 시작한 경우에만 작동합니다 .
Aswath K

2

난 맥에있어, 어떤 이유로, Ctrl- p Ctrl- q단지 나는 또한 누르고 있으면 작동합니다Shift



0

도커 프로세스를 중지하고 포트를 해제하려면 먼저 사용하십시오 ctrl- c컨테이너를 종료 한 다음 docker ps를 사용하여 실행중인 컨테이너 목록을 찾으십시오. 그런 다음 docker container stop을 사용하여 해당 프로세스를 중지하고 포트를 해제 할 수 있습니다. 컨테이너 이름은 docker ps 명령에서 찾을 수 있으며 이름 열에 이름을 제공합니다. 이것이 귀하의 쿼리를 해결하기를 바랍니다 ....


0

백그라운드에서 도커 프로세스 만 필요하면 사용할 수 있습니다.

Ctrl + Z

실제 분리가 아니며 성능이 저하됩니다. bg명령 을 사용하여 포 그라운드로 되돌릴 수 있습니다 .

또 다른 옵션은 더 이상 필요하지 않은 경우 터미널을 닫는 것입니다.


0

같은 문제가 발생한 사람은 분리 키를 설정할 때도 컨테이너를 죽이지 않고 분리 할 수 ​​없습니다 ...

컨테이너를 시작할 때 docker-compose up -d

docker attach {container name}광미 로그를 보는 데 사용 하는 대신 ....

시도 docker-compose logs -f {service name} ctrl- c컨테이너를 죽이지 않고 로그 꼬리를 죽인다

{service name}docker-compose.yml 파일 옆에 나열된 서비스 인 경우 (예 : 컨테이너 이름 = elk_logstash_1-> service name = logstash

HTH


0

최신 정보

컨테이너 문제를 해결하기 위해 일반적으로 docker attach를 사용하여 STDOUT이 무엇을 표시했는지 확인했습니다. 방금 docker logs --follow 621a4334f97b컨테이너 작업에 영향을 미치지 않고 Ctrl + c를 사용할 수있는 동안 STDOUT을 볼 수있게되었습니다! 내가 항상 원했던 것입니다.

... 자연스럽게 컨테이너 ID를 대체해야합니다.

원래 답변

컨테이너를 계속 실행하고 싶었지만 컨테이너를 시작하지 않고 첨부했습니다 -it. 내 솔루션은 대신 SSH 연결을 희생하는 것이 었습니다 (컨테이너를 실행하는 시스템에 SSH로 연결되었으므로). 그 ssh 세션을 죽이면 컨테이너가 그대로 남았지 만 컨테이너에서 분리되었습니다.

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