새로운 TTY로 이미 실행중인 Docker 컨테이너에 입력하는 방법


545

포 그라운드에서 Apache 서비스를 실행하는 컨테이너가 있습니다. 다른 셸에서 컨테이너에 액세스하여 그 안에 "포크"하고 파일을 검사하고 싶습니다. 현재 컨테이너에 연결하면 Apache 데몬을보고 남아 있으며 명령을 실행할 수 없습니다.

실행중인 컨테이너에 다른 tty를 연결할 수 있습니까? 아마도 Docker가 실제로 LXC 컨테이너를 감싸고 있다는 사실을 활용할 수 있습니까? 나는 시도 sudo lxc-console -n [container-id] -t [1-4]했지만 하나의 tty 만 사용할 수 있으며 이것이 아파치 데몬을 실행하는 것으로 보입니다. 아마도 빌드 중에 여러 lxc 콘솔을 활성화하는 방법이 있습니까?

가능한 경우 openssh 서비스로 컨테이너를 구성하고 빌드 하지 않습니다 .


7
시도 했습니까 docker attach [conainer-id]?
shabbychef

13
docker attach가 변경되지 않으면 @shabbychef가 attach 명령이 새로운 tty가 아닌 실행중인 tty에 연결되므로 질문 제목은 "... with new TTY"입니다. 이것이 아래 답변이 attach 명령을 사용하지 않는 이유입니다.
Programster

1
1.3
이후이

답변:


1061

docker 1.3에는 새로운 명령이 docker exec있습니다. 이렇게하면 실행중인 도커에 들어갈 수 있습니다.

docker exec -it [container-id] bash

30
질문 당시에 없었던이 새로운 방법이 가장 최신의 방법 IMO이기 때문에 나는 이것을 내 자신의 정답으로 변경했습니다.
Programster

3
그러나 이는 exec일반적인 터미널로 작동하지 않습니다. 예를 들어 컨테이너 내부에서 사용자를 한 번 변경할 수 없습니다.
Pithikos

3
@ Pithikos : exec를 사용하여 쉘을 실행 한 다음 su someuser사용자를 변경할 수 있습니다. Docker 1.4.1 실행
lsh

2
이 토론을 읽는 사람에게 유의하십시오. 나는 docker exec -it결국 완전한 기능을 갖춘 의사 tty를 제공 할 것이라고 확신 하지만, 현재 (Docker 버전 1.9.1)에는 github.com/docker/docker/issues/8755
blong

18
오류 ': "bash는"간부 인 $ PATH에없는 실행 파일을'얻는 경우에 당신이 시도 할 수 있습니다 : 고정 표시기 간부 - 그것은 [컨테이너 ID] / 빈 / SH
다이 Kaixian

42

SSH를 사용하지 않고 컨테이너에 들어가려면 'nsenter'라는 Jérôme Petazzoni의 도구를 사용해야합니다. 참조 : https://github.com/jpetazzo/nsenter

간단하게 실행하여 설치하십시오. docker run -v /usr/local/bin:/target jpetazzo/nsenter

그런 다음 명령 docker-enter <container-id>을 사용하여 컨테이너를 입력하십시오.


이것이 올바른 방법입니다. 블로그를 참조하십시오 .
Jesse Glick

5
docker 1.3에는 새로운 명령이 docker exec있습니다. 이것은 당신이 실행중인 도커에 들어갈 수있게 해줍니다 : docker exec -it <container-id> bash(아래 내 답변 참조)
Michael_Scharf

5
않는 docker-enter여전히 존재? 그것은 나를 준다 command not found.
Snowcrash

22

최신 정보

docker 0.9부터 현재 단계가 작동 하려면 데몬을 다시 시작하기 전에 docker daemon startup 옵션으로 /etc/default/docker파일 을 업데이트해야 합니다 '-e lxc'(호스트를 재부팅 하여이 작업을 수행했습니다).

/ etc / default / docker 파일로 업데이트

이 모든 것이 ...

... [docker 0.9]에는 LXC 이외의 다른 API를 사용하여 컨테이너를 시작할 수있는 새로운 "엔진 드라이버"추상화가 포함되어 있습니다. 또한 LXC 도구를 사용하지 않고 컨트롤 그룹을 처리 할 수있는 새로운 API 라이브러리 (libcontainer)를 기반으로하는 새로운 엔진 드라이버를 제공합니다. 주요 문제는 컨테이너 내부에서 쉘을 시작하는 것과 같이 컨테이너에서 작업을 수행하기 위해 lxc-attach에 의존하는 경우 개발 환경에 매우 유용합니다 ...

출처

이렇게하면 docker 0.11 의 새로운 호스트 전용 네트워킹 옵션 기능이 "작동"하는 것을 막을 수 있으며 루프백 인터페이스 만 표시됩니다. 버그 리포트


그것은에 대한 해결책 밝혀 다른 질문 이 하나의 해결책이었다 :

... docker ps -notrunc를 사용 하여 전체 lxc 컨테이너 ID를 얻은 다음 lxc-attach -n <container_id>해당 컨테이너의 bash 실행을 루트로 사용할 수 있습니다.

업데이트 : 더 이상 사용되지 않는 ps --no-trunc대신 사용해야 합니다 ps -notrunc.

여기에 이미지 설명을 입력하십시오 전체 컨테이너 ID 찾기

여기에 이미지 설명을 입력하십시오 lxc attach 명령을 입력하십시오.

여기에 이미지 설명을 입력하십시오 위는도 커가 시작된 내 아파치 프로세스를 보여줍니다.


따라서 Docker 만으로이 작업을 수행 할 수있는 방법이 없습니다. 나는 개인적으로 LXC를 섞지 않는 것을 선호합니다.
qkrijger

bash를 시작하기 위해 lxc-attach로 명령을 실행하는 방법이 있습니까? 고마워!!
joselo

내가 알고있는 한 @qkrijger는 정확합니다. "혼합"LXC가 걱정되는 이유는 무엇입니까? 도 커가 LXC 위에 구축되어 있다는 것을 알고 있습니까?
Programster

@joselo 귀하의 질문을 이해하지 못하지만 더 자세한 내용으로 새 게시물을 작성하는 것이 좋습니다. bash 나 -d와 같은 데몬처럼 도커 프로세스를 시작하는 방법은 여러 가지가 있습니다.
Programster

@ programster 그렇습니다. 나는 여전히 :) 여전히 Docker와 함께 LXC를 사용하면 해킹처럼 느껴집니다. 재미 있지만 실제로 유지 관리 할 수는 없습니다. 일반적으로, 추상화 계층에서 코드를 작성해야합니다. 실제로 LXC 자체가 필요한 경우 Docker에 대한 풀 요청이 필요할 수 있습니다.
qkrijger

7

첫 번째 단계는 컨테이너 ID를 얻습니다.

docker ps

이것은 당신에게 뭔가를 보여줄 것입니다

컨테이너 ID 이미지 명령 생성 상태 포트 이름

1170fe9e9460 localhost : 5000 / python : env-7e847468c4d73a0f35e9c5164046ad88 "./run_notebook.sh"26 초 전 위로 25 초 0.0.0.0:8989->9999/tcp SLURM_TASK-303337_0

1170fe9e9460 이 경우 컨테이너 ID입니다.

둘째 , 도커를 입력하십시오.

docker exec -it [container_id] bash

위의 경우 : docker exec -it 1170fe9e9460 bash


5

컨테이너 내에서 tmux / GNU Screen을 실행하는 것은 어떻습니까? 간단한 방법으로 원하는만큼 많은 vty에 액세스 할 수있는 더 부드러운 방법 인 것 같습니다.

$ docker attach {container id}

컨테이너에 액세스하려는 경우 (예 : 디버깅) 괜찮은 솔루션이지만 OP가 기존 컨테이너를 둘러보고 싶어하는 사람에게는 도움이되지 않습니다.
Luca Spiller

1
이 답변에 대한 나의 문제는 사람들이 이미 사용에 대해 물었고 다음 docker attach과 같이 지적했다는 것입니다....the attach command attaches to the running tty, not a new one, hence the question title is "...with new TTY"
Programster

글쎄, 컨테이너가 이미 실행중인 경우이 솔루션은 도움이되지 않지만 이전에 멀티플렉서를 실행하는 것을 돌보는 경우 추가 tty가 필요하지 않습니다 ... 실제로 tmux를 사용하기 시작한 이후 하나의 tty를 사용합니다 한 번만 tmux에 필요한 모든 것을 할 수있는 것은 단 하나뿐입니다.
cig0

4

nsenter것을 수행. 그러나 나는 또한 간단한 방법으로 컨테이너에 들어갈 필요가 있었고 nsenter는 내 요구에 충분하지 않았습니다. 경우에 따라 버그가 발생했습니다 (검은 화면 + -wd 플래그가 작동하지 않음). 또한 특정 사용자 및 특정 디렉토리로 로그인하고 싶었습니다.

컨테이너에 들어가기위한 도구를 만들었습니다. 다음에서 찾을 수 있습니다.https://github.com/Pithikos/docker-enter

사용법은 쉽다

./docker-enter [-u <user>] [-d <directory>] <container ID>

방금 시도해 보았습니다. 우분투에서 sudo apt-get build-essential -y gcc docker-enter.c -o docker-enter sudo ./docker-enter <short-container-id>를 실행해야했습니다. lxc-attach -n Codebase는 전체를 빠르게 스캔하여 악의적 인 것을 찾을 수있을 정도로 짧습니다.
Programster

github.com/steveeJ/personal-portage-overlay 에서 젠투에서 ebuild 를 app-emulation / docker-enter로 사용할 수있게 만들었습니다 .
stefanjunker


2

"nsinit"방식은 다음과 같습니다.

nsinit 설치

git clone git@github.com:dotcloud/docker.git
cd docker
make shell

컨테이너 내부에서 :

go install github.com/dotcloud/docker/pkg/libcontainer/nsinit/nsinit

밖에서:

docker cp id_docker_container:/go/bin/nsinit /root/

사용해

cd /var/lib/docker/execdriver/native/<container_id>/
nsinit exec bash

2
docker exec -t -i container_name /bin/bash

컨테이너 콘솔로 이동합니다.


나는 같은 문제가 있었기 때문에이 질문에 착륙했습니다. 비슷한 것으로 보이는 대답은 내가 수정하기 전까지는 효과가 없었습니다. 그래도 삭제할 수 있습니다.
Danstan


1

나는 다음을 사용하여 데몬으로 실행중인 microsoft / iis에서 powershell을 시작했습니다.

docker exec -it <nameOfContainer> powershell

리눅스 기반 컨테이너에 관한 질문 인 것 같습니다. 이 답변은 Windows 기반 컨테이너가 있거나 PowerShell의 .NET Core 버전 (예 : PowerShell 6 이상)이 설치된 경우에만 작동합니다.
Manfred

0

윈도우 (10) , 나는 고정 표시기가 설치되어 있습니다. 컨테이너에서 Jnekins를 실행 중이며 동일한 오류 메시지가 표시되었습니다. 이 문제를 해결하기위한 단계별 가이드는 다음과 같습니다.

1 단계: gitbash를 열고 docker run -p 8080 : 8080 -p 50000 : 50000 jenkins를 실행하십시오.

2 단계: 새 터미널을 엽니 다.

3 단계 : "docker ps"를 실행하여 실행중인 컨테이너 목록을 가져옵니다. 컨테이너 ID를 복사하십시오.

4 단계 : 이제 "docker exec -it {container id} sh"또는 "docker exec -it {container id} bash"를 수행하면 "입력 장치가 TTY가 아닙니다."와 유사한 오류 메시지가 표시됩니다. mintty를 사용하여 명령 앞에 'winpty'를 붙여보세요. "

5 단계 : " $ winpty docker exec -it {container id} sh " 명령 실행

볼라 !! 이제 터미널 안에 있습니다.

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