programing

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

padding 2023. 8. 26. 10:31
반응형

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

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

예를 들어, 제가 시도해본다면,

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

둘 다 저를 컨테이너의 터미널로 데려갑니다. 어떻게 하면 컨테이너의 터미널을 멈추지 않고 나갈 수 있습니까?

exit그리고.CTR+C둘 다 컨테이너를 정지시킵니다.

+를 입력한 다음 +q를 입력합니다.p대화형 모드를 데몬 모드로 전환하는 데 도움이 됩니다.

https://docs.docker.com/engine/reference/commandline/cli/ #default-key-sequence-to-containers를 참조하십시오.

되면, 를 하여 컨테이너를 상태로 둡니다.CTRL-p CTRL-q키 시퀀스이 분리 키 시퀀스는 다음을 사용하여 사용자 지정할 수 있습니다.detachKeys

업데이트: 아래 답변 p+에서 언급한 것처럼 +가 이제 대화형 모드를 데몬 모드로 전환합니다.q


C+ (또는 +)\는 컨테이너에서 당신을 분리해야 하지만 당신의 주요 프로세스가 bash이기 때문에 컨테이너를 죽일 것입니다.

도커에 대한 작은 교훈.컨테이너는 실제 전체 기능 OS가 아닙니다.컨테이너를 실행할 때 시작하는 프로세스는 PID 1을 사용하여 초기화 출력을 가정합니다.따라서 해당 프로세스가 종료되면 데몬은 (도커 시작을 통해) 새로운 프로세스가 시작될 때까지 컨테이너를 중지합니다(자세한 내용은 http://phusion.github.io/baseimage-docker/ #intro).

항상 분리 모드로 실행되는 컨테이너를 원한다면, 저는 당신이 사용하기를 제안합니다.

docker run -d foo

컨테이너에 ssh 서버가 있습니다.(가장 쉬운 방법은 도커라이징 opensh 튜토리얼 https://docs.docker.com/engine/examples/running_ssh_service/) 을 따르는 것입니다.

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

docker start foo

(기본적으로 분리됨)

저는 이것을 파고들었고 위의 모든 답들은 부분적으로 맞습니다.이 모든 것은 컨테이너가 어떻게 진수되느냐에 달려 있습니다.컨테이너가 시작된 시점은 다음과 같습니다.

  • 였습니다(TTY(-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(미포함 -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"를 하면 컨테이너에 들어갑니다.컨테이너를 중지하지 않고 컨테이너를 종료하려면 ++PQ를 입력해야 합니다.

저는 애쉬윈의 답변이 가장 옳다고 생각합니다, 저의 예전 답변은 아래와 같습니다.


I'd like to add another option here which is to run the container as follows

docker run -dti foo bash

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

docker exec -ti ID_of_foo bash

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

+,+PCTRLQ를 사용하여 대화형 모드를 데몬으로 전환합니다.

만약 이것이 작동하지 않고 당신이 첨부한다면,docker attach프로세스를 종료하여 분리할 수 있습니다.

더 나은 방법은 sig-proxy 매개 변수를 사용하여 C+를 용기에 전달하지 않도록 하는 것입니다.

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

다음에 대해 동일한 옵션을 사용할 수 있습니다.docker runcommand

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

당신은 할 수 .--detach-keys를 실행할 때 docker attach기본 +,P + 시퀀스를 재정의합니다(항상 작동하는 것은 아님).

를 들어, 예들어실때할행을 할 때.docker attach --detach-keys="ctrl-a" test+를 A누르면 용기를 죽이지 않고 종료됩니다.

다른 예:

  • docker attach --detach-keys="ctrl-a,x" test프레스를CTRL+A그리고 나서.X
  • docker attach --detach-keys="a,b,c" test프레스를A,그리고나서B,그리고나서C

공식 문서에서 발췌:

원하는 경우 분리를 위해 도커 키 시퀀스 재정의를 구성할 수 있습니다.이 기능은 도커 기본 시퀀스가 다른 응용 프로그램에 사용하는 키 시퀀스와 충돌하는 경우에 유용합니다.고유한 분리 키 시퀀스를 컨테이너별 재정의 또는 전체 구성에 대한 구성 속성으로 정의하는 두 가지 방법이 있습니다.

용기의 하려면 개컨테너대시재퀀사다면용려합다음니을하정의를스한에별이▁the다▁to▁use니사용합▁the,▁for▁sequence▁override다ual▁container를 사용합니다.--detach-keys="<sequence>" docker.docker attach 파일을 합니다.<sequence>둘 중 하나의 문자입니다.[a-Z] 는또.ctrl-다음 중 하나와 결합됩니다.

  • a-z(단일 소문자 영문자)
  • (부호에서)
  • [(왼쪽 괄호)
  • (후진 슬래시 2개)
  • _ ( 밑줄)
  • (계속)

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

참고: 도커 버전 1.10+ 이후에 작동합니다(이 답변 시점에서 현재 버전은 18.03입니다).

컨테이너 내에서 실행 중인 프로세스의 출력을 보려면 간단한 작업을 수행할 수 있습니다.docker container logs -f <container id>.

-f이 flag가 되도록 .followed실시간으로 업데이트할 수 있습니다.디버깅 또는 모니터링에 매우 유용합니다.

Docker 컨테이너에서 프로세스를 하나 이상 실행해야 하는 경우 컨테이너만 종료하지 않고 백그라운드에서 Docker 이미지(ubuntu, httd 등)를 실행합니다.

예를 들어 Ubuntu 도커 이미지에서는

분리 모드(프로세스에서 백그라운드 실행)를 사용하여 새 컨테이너를 생성하려면,

docker run -d -i -t f63181f19b2f /bin/bash

이 이미지(하드웨어) ID에 대한 새 컨테이너를 만듭니다.f63181f19b2f되며, 이때 " " " " " " " " " " " " 이 실행됩니다.tty shell 될 때까지 실행됩니다."라는 메시지가 표시됩니다.

실행 중인 백그라운드 컨테이너에 부착하려면 다음을 사용합니다.

docker attach  b1a0873a8647

shell을) 를 할 수 .ctrl-p,q컨테이너에서 나가지 않고 컨테이너 밖으로 나옵니다(배경 실행).즉, bash 쉘을 죽이지 않고).

컨테이너에 연결하는 동안 사용자 지정 명령을 전달할 수 있습니다.

docker attach --detach-keys="ctrl-s" b1a0873a8647

에는 이에번ctrl-p,q이스케이프 시퀀스가 작동하지 않습니다.대신,ctrl-s컨테이너에서 나가는 데 사용할 수 있습니다.당신은 어떤 열쇠라도 건네줄 수 있습니다.(ctrl-*)

SEGKILL을 전송하여 도커 CLI 프로세스를 간단히 종료할 수 있습니다.컨테이너를 시작한 경우

docker run -it some/container

당신은 그것을 얻을 수 있습니다.

ps -aux | grep docker

user   1234  0.3  0.6 1357948 54684 pts/2   Sl+  15:09   0:00 docker run -it some/container

1234라고 가정하면, 당신은 그것을 "수정"할 수 있습니다.

kill -9 1234

그것은 다소 해킹이지만 효과가 있습니다!

.-d

docker run -d <your_command>

이미 막혀 있는 경우 터미널에서 새 창/탭을 열고 첫 번째 창/탭을 닫을 수 있습니다.실행 중인 작업 프로세스가 중지되지 않습니다.

윈도우에서 도커를 사용하는 경우 'CTRL + D' 조합을 사용할 수 있습니다.

이전 게시물이지만 그냥 종료하고 다시 시작합니다...문제는 Windows 시스템에 있는 경우 Ctrlp 또는 CtrlP가 인쇄에 연결되어 있다는 것입니다.용기가 시작을 벗어나면 아무것도 손상되지 않습니다.

언급URL : https://stackoverflow.com/questions/25267372/correct-way-to-detach-from-a-container-without-stopping-it

반응형