Programming

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

procodes 2020. 3. 5. 08:01
반응형

실행중인 컨테이너에서 쉘 세션을 시작할 수 있습니까 (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

실제로 컨테이너에 쉘을 넣을 수있는 방법이 있습니다.

/root/run.sh프로세스, 프로세스 관리자 (감독자) 등을 시작 한다고 가정합니다 .

/root/runme.sh일부 gnu- 스크린 트릭으로 작성하십시오 .

# Spawn a screen with two tabs
screen -AdmS 'main' /root/run.sh
screen -S 'main' -X screen bash -l
screen -r 'main'

이제 docker attach컨테이너 0에서 데몬이 있고 탭 1 에서 대화식 쉘이 있어 컨테이너 내부에서 어떤 일이 일어나고 있는지 확인할 수 있습니다.

또 다른 조언은이 스크린 트릭을 포함하여 필요한 모든 도구를 사용하여 프로덕션 이미지 위에 "개발 번들"이미지를 작성하는 것입니다.


여기 내 해결책이 있습니다

DOckerfile의 일부 :

...
RUN mkdir -p /opt
ADD initd.sh /opt/
RUN chmod +x /opt/initd.sh
ENTRYPOINT ["/opt/initd.sh"]

"initd.sh"의 일부

#!/bin/bash
...
/etc/init.d/gearman-job-server start
/etc/init.d/supervisor start
#very important!!!
/bin/bash

이미지가 빌드 된 후 exec 및 attach를 사용하는 두 가지 옵션이 있습니다.

  1. exec (내가 사용하는)로 다음을 실행하십시오.

docker run --name $ CONTAINER_NAME -dt $ IMAGE_NAME

그때

docker exec -it $ CONTAINER_NAME / bin / bash

사용

분리 할 Ctrl + D

  1. 첨부하여 다음을 실행하십시오.

docker run --name $ CONTAINER_NAME -dit $ IMAGE_NAME

그때

도커 첨부 $ CONTAINER_NAME

사용

분리 할 Ctrl + P 및 Ctrl + Q

옵션의 차이점은 매개 변수 -i에 있습니다.


두 가지 방법이 있습니다.

첨부

$ sudo docker attach 665b4a1e17b6 #by ID

exec로

$ sudo docker exec - -t 665b4a1e17b6 #by ID

컨테이너를 실행할 때 이름을 지정하는 것이 유용합니다. container_id를 참조 할 필요는 없습니다.

docker run --name container_name yourimage docker exec -it container_name bash


응용 프로그램의 로그를 확인하는 것이 목표 인 경우이 게시물은 Tomcat을 시작하고 CMD의 일부로 로그의 꼬리를 표시합니다. Tomcat 로그는 'docker logs containerid'를 사용하여 호스트에서 사용할 수 있습니다.

http://blog.trifork.com/2013/08/15/using-docker-to-efficiently-create-multiple-tomcat-instances/


먼저 원하는 컨테이너의 컨테이너 ID를 가져옵니다.

docker ps

당신은 이와 같은 것을 얻을 것입니다 :

CONTAINER ID        IMAGE                  COMMAND             CREATED             STATUS                          PORTS                    NAMES
3ac548b6b315        frontend_react-web     "npm run start"     48 seconds ago      Up 47 seconds                   0.0.0.0:3000->3000/tcp   frontend_react-web_1

이제이 컨테이너 ID를 복사하고 다음 명령을 실행하십시오.

docker exec -it container_id sh

docker exec -it 3ac548b6b315 sh


컨테이너를 개발할 때 VM과 관련하여 생각하는 것처럼 자신이 잘못되었을 수도 있습니다. 내 충고 :하지 마십시오.

컨테이너는 다른 프로세스와 같습니다. 실제로 디버깅 목적으로 (/ proc // env 또는 strace -p 생각) 이들을 "첨부"하고 싶을 때 매우 특별한 경우입니다.

일반적으로 프로세스를 "실행"하기 때문에 구성을 수정하거나 로그를 읽으려면 새 컨테이너를 작성하고 디렉토리를 공유하고 stdout에 기록하여 외부에 로그를 작성하십시오 (Docker 로그가 작동 함). 또는 그런 것.

디버깅 목적으로 쉘을 시작한 다음 코드를 시작한 다음 CTRL-p + CTRL-q를 눌러 쉘을 그대로 두십시오. 이 방법으로 다음을 사용하여 다시 연결할 수 있습니다.

docker attach <container_id>

컨테이너가 예상하지 못한 작업을 수행하여 컨테이너를 디버깅하려면 https://serverfault.com/questions/596994/how-can-i-debug-a-docker-container 초기화


아니요. 불가능합니다. supervisord필요한 경우 ssh 서버를 얻는 것과 같은 것을 사용하십시오 . 그래도 나는 그 필요성에 의문을 제기한다.

참고 URL : https://stackoverflow.com/questions/17903705/is-it-possible-to-start-a-shell-session-in-a-running-container-without-ssh



반응형