[docker] 새로운 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