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
명령에 사용할 수 있습니다 .