[docker] 실행중인 컨테이너에서 쉘 세션을 시작할 수 있습니까 (ssh없이)

나는이 명령이 실행중인 컨테이너에서 bash 쉘을 실행할 것으로 순진하게 기대했다.

docker run "id of running container" /bin/bash

불가능한 것 같습니다. 오류가 발생합니다.

2013/07/27 20:00:24 Internal server error: 404 trying to fetch remote history for 27d757283842

따라서 실행중인 컨테이너에서 bash 쉘을 실행하려면 (예 : 진단 목적으로)

SSH 서버를 실행하고 ssh를 통해 로그인해야합니까?



답변

편집 : 이제 사용할 수 있습니다 docker exec -it "id of running container" bash( doc )

이전에는이 ​​질문에 대한 답변은 다음과 같습니다.

실제로 디버그 환경에 있어야하고이를 수행 할 수있는 경우 다음을 수행 할 수 있습니다 sudo lxc-attach -n <ID>
. id는 전체 이름 ( docker ps -notrunc) 이어야합니다 .

그러나 나는 이것을 반대하는 것이 좋습니다.

공지 : -notrunc더 이상 사용되지 않으며 --no-trunc곧 교체 될 예정입니다.


답변

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

docker exec -it "id of running container" bash


답변

그냥 해

docker attach container_name

주석에서 언급했듯이 컨테이너를 중지하지 않고 분리하려면 Ctrlpthen을 입력하십시오 Ctrlq.


답변

상황이 바뀌기 때문에 현재 실행중인 컨테이너에 액세스하는 권장 방법은 nsenter입니다.

github 저장소 에 대한 자세한 정보를 찾을 수 있습니다 . 그러나 일반적으로 다음과 같이 nsenter를 사용할 수 있습니다.

PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid

또는 래퍼를 사용할 수 있습니다 docker-enter.

docker-enter <container_name_or_ID>

이 주제에 대한 좋은 설명은 Jérôme Petazzoni의 블로그 항목에서 찾을 수 있습니다.
도커 컨테이너에서 sshd를 실행할 필요가없는 이유


답변

가장 먼저 달릴 수없는 것

docker run "existing container" command

이 명령은 컨테이너가 아닌 이미지를 기대하고 있기 때문에 새로운 컨테이너가 생성됩니다 (따라서보고 싶지 않은)

도커를 사용하면 다른 방식으로 생각하도록 스스로를 밀어야한다는 사실에 동의하지만 (컨테이너에 로그온 할 필요가없는 방법을 찾아야 함) 여전히 유용하다는 것을 알았습니다. 그 주위에.

DEAMON 모드에서 감독자를 통해 명령을 실행합니다.

그런 다음 내가 부르는 것을 실행합니다 docker_loop.sh
. 내용은 거의 다음과 같습니다.

#!/bin/bash
/usr/bin/supervisord
/usr/bin/supervisorctl
while ( true )
    do
    echo "Detach with Ctrl-p Ctrl-q. Dropping to shell"
    sleep 1
    /bin/bash
done

컨테이너에 “연결”하고 supervisorctl로그를 중지 / 시작 / 다시 시작 및 확인하기 위한 인터페이스 가 제공됩니다 . 그것이 충분하지 않으면, 당신은 할 수 Ctrl+D있고 당신은 마치 정상적인 시스템 인 것처럼 주변을 들여다 볼 수있는 껍질에 떨어질 것입니다.

이 시스템이 쉘이없는 컨테이너를 갖는 것만 큼 안전하지 않은지 확인하십시오. 따라서 컨테이너를 고정하는 데 필요한 모든 단계를 수행하십시오.


답변

이 풀 요청에 주목하십시오 : https://github.com/docker/docker/pull/7409

다음 docker exec <container_id> <command>유틸리티를 구현 합니다. 이것이 가능할 때, 실행중인 컨테이너 내부에서 ssh 서비스를 시작하고 중지하는 것이 가능해야합니다.

이 또한 nsinit이렇게하려면 “nsinit 실행중인 컨테이너의 네임 스페이스 내부 쉘에 액세스 할 수있는 편리한 방법을 제공합니다” 하지만, 실행 얻을 어려워 보인다.
https://gist.github.com/ubergarm/ed42ebbea293350c30a6


답변

당신이 사용할 수있는

docker exec -it <container_name> bash