새로운 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'
(호스트를 재부팅하여 수행했습니다).
이 모든 것이 ...
... [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 " 명령 실행
볼라 !! 이제 터미널 안에 있습니다.
'Programing' 카테고리의 다른 글
grep을 사용하여 폴더 안에서 단어를 찾으려면 어떻게해야합니까? (0) | 2020.02.13 |
---|---|
SQL에서 임의의 행을 요청하는 방법은 무엇입니까? (0) | 2020.02.13 |
JSLint는 "missing radix parameter"라고 말합니다. (0) | 2020.02.13 |
자식 분기, 포크, 가져 오기, 병합, 리베이스 및 복제의 차이점은 무엇입니까? (0) | 2020.02.13 |
Python 3으로 pip를 설치하는 방법은 무엇입니까? (0) | 2020.02.13 |