새로운 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.