Docker 1.1.2 (최신)에서 컨테이너를 멈추지 않고 컨테이너에서 분리하는 올바른 방법은 무엇입니까?
예를 들어 시도하면
docker run -i -t foo /bin/bash
또는docker attach foo
(이미 실행중인 컨테이너의 경우)
둘 다 컨테이너의 터미널로 연결됩니다. 컨테이너 터미널을 멈추지 않고 어떻게 종료합니까?
exit
그리고 CTR+C
둘 다 컨테이너를 멈 춥니 다.
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
(기본적으로 분리됩니다)
-ti -d
, 다음과 부착 docker attach
과 분리 한 후, 첫번째 CTRL + P 한 후 Ctrl + q를. 키보드 단축키 중 하나만 사용할 수 있다고 생각했습니다.
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")
나는 이것에 파고 위의 모든 대답은 부분적으로 맞습니다. 그것은 모두 컨테이너가 어떻게 시작되는지에 달려 있습니다. 컨테이너가 시작되면 다음과 같이 나타납니다.
-t
)-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]$
왜? 컨테이너 자체가 아닌 컨테이너에 연결된 프로세스를 종료하고 있기 때문입니다.
kill -9
신호는하지 않습니다. 프로세스가 종료되고 상환이 없습니다. 내 생각에 다른 신호는 컨테이너에 종료 할 수있는 기회를 주지만 -9
그렇지 않은 경우입니다.
"docker attach"container id "를 수행하면 컨테이너에 들어갑니다. 컨테이너를 중지하지 않고 컨테이너를 종료하려면 Ctrl+ P+ 를 입력해야합니다.Q
Error response from daemon: Container f560a0ad6806150b2775d0b6e6d5f7065a03775bae858fb4fb7df05a277976db is not running
Ashwin의 답변이 가장 정확하다고 생각합니다. 이전 답변은 다음과 같습니다.
docker run -dti foo bash
그런 다음 컨테이너를 입력하고 bash를 실행할 수 있습니다.
docker exec -ti ID_of_foo bash
sshd를 설치할 필요가 없습니다 :)
docker attach
첫 번째 bash 실행에 다시 연결함으로써 더 표준 적이 라고 생각 합니다. docker exec
여기서도 작동하지만 첫 번째 프로세스 외에도 새로운 bash 프로세스가 생성됩니다. 물론 프로세스는 첫 번째 컨텍스트와 동일한 컨텍스트 / 환경 / 컨테이너 내에서 작성되지만 다른 프로세스입니다 (유사한 터미널 에뮬레이터에서 새 터미널 탭을 여는 것입니다).
대화식 컨테이너에서 분리하는 기본 방법은 Ctrl+ P Ctrl+ Q이지만 새 컨테이너를 실행하거나 --detach-keys 플래그를 사용하여 기존 컨테이너에 연결할 때이를 무시할 수 있습니다 .
를 통해 docker attach
연결 한 경우 도커 연결 프로세스를 종료하여 분리 할 수 있습니다. 더 좋은 방법은 sig-proxy 매개 변수를 사용하여 Ctrl + C를 컨테이너에 전달하지 않는 것입니다.
docker attach --sig-proxy=false [container-name]
동일한 옵션을 docker run
명령에 사용할 수 있습니다 .
php:7.3-apache
--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-
와 결합 된 것입니다.
이 a
, ctrl-a
, X
, 또는 ctrl-\\
값이 유효한 키 시퀀스의 예입니다. 모든 컨테이너에 대해 다른 구성 기본 키 시퀀스를 구성하려면 구성 파일 섹션을 참조하십시오 .
참고 : 이것은 docker 버전 1.10 이상부터 작동합니다 (이 답변시 현재 버전은 18.03입니다)