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

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

예를 들어 시도하면

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

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

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



답변

업데이트 : 같이 대답 아래에 언급 된 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

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


답변

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")


답변

나는 이것에 파고 위의 모든 대답은 부분적으로 맞습니다. 그것은 모두 컨테이너가 어떻게 시작되는지에 달려 있습니다. 컨테이너가 시작되면 다음과 같이 나타납니다.

  • 할당 된 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]$

왜? 컨테이너 자체가 아닌 컨테이너에 연결된 프로세스를 종료하고 있기 때문입니다.


답변

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


답변

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


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

docker run -dti foo bash

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

docker exec -ti ID_of_foo bash

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


답변

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


답변

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

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

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