Programing

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

lottogame 2020. 2. 13. 00:27
반응형

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


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

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

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


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

docker exec -it [container-id] bash

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

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

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


최신 정보

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 명령을 입력하십시오.

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


첫 번째 단계는 컨테이너 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


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

$ docker attach {container id}

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

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

사용법은 쉽다

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

"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

docker exec -t -i container_name /bin/bash

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


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

docker exec -it <nameOfContainer> powershell

도커 중지 containster_name

docker start -i container_name

이것은 우분투에 로그인 한 터미널 원격에서 나를 위해 일했습니다.


On Windows 10, I have docker installed. I am running Jnekins on a container and I encountered the same error message. Here is a step by step guide to resolve this issue:

Step 1: Open gitbash and run docker run -p 8080:8080 -p 50000:50000 jenkins.

Step 2: Open a new terminal.

Step 3: Do "docker ps" to get list of the running container. Copy the container id.

Step 4: Now if you do "docker exec -it {container id} sh" or "docker exec -it {container id} bash" you will get an error message similar to " the input device is not a TTY. If you are using mintty, try prefixing the command with 'winpty'"

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

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

참고 URL : https://stackoverflow.com/questions/20932357/how-to-enter-in-a-docker-container-already-running-with-a-new-tty



반응형