programing

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

skycolor 2023. 9. 24. 12:42
반응형

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

나는 이 명령이 실행중인 컨테이너에서 bash shell을 실행할 것이라고 순진하게 예상했습니다.

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 shell을 실행하려면(예: 진단 목적)

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

도커 1.3에서는 새로운 명령이 있습니다.이를 통해 실행 중인 도커를 입력할 수 있습니다.

docker exec -it "id of running container" bash

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

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

할 할 수 있습니다.sudo lxc-attach -n <ID>ID체 ID다()).docker ps -notrunc).

하지만 저는 이에 반대할 것을 강력히 권고합니다.

:-notrunc되지 않습니다.다로 됩니다. 대체됩니다.--no-trunc곧.

그냥 해요

docker attach container_name

댓글에 언급된 것처럼 컨테이너에서 멈추지 않고 분리하려면 다음을 입력합니다.

하고 있기 현재 중인 과 같습니다.nsenter.

깃허브 저장소에 대한 자세한 정보를 확인하실 수 있습니다.그러나 일반적으로 다음과 같이 ensenter를 사용할 수 있습니다.

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>

주제에 대한 멋진 설명은 제롬 페타조니의 블로그 엔트리에서 확인할 수 있습니다.도커 컨테이너에서 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및stop/start스를 하기 위한 .만약 그것으로 충분하지 않다면, 당신은 할 수 있습니다.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

제 해결책은 이렇습니다.

도커 파일에서:

# ...
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
    

    + 를 사용하여 분리합니다.

  2. 첨부 및 실행 사용:

    docker run --name $CONTAINER_NAME -dit $IMAGE_NAME
    

    그리고나서

    docker attach $CONTAINER_NAME
    

    + 와 + 를 사용하여 분리합니다.

    참고: 옵션 간의 차이가 모수에 있습니다.-i

사실 용기에 껍데기를 넣는 방법이 있습니다.

당신의 것을 가정합니다./root/run.sh프로세스, 프로세스 관리자(supervisor) 또는 기타 다른 것을 시작합니다.

./root/runme.sh몇 지 gnu-screen합니다.

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

탭 0 1 입니다.docker attach언제든 컨테이너 안에서 무슨 일이 일어나고 있는지 확인할 수 있습니다.

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

두 가지 방법이 있습니다.

첨부와 함께

$ sudo docker attach 665b4a1e17b6 #by ID

이그제큐티브와 함께

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

애플리케이션의 로그를 확인하는 것이 목적인 경우, 이 게시물에는 CMD의 일부로 tomcat 시작 및 로그 테일링이 표시됩니다.Tomcat 로그는 'docker logs containerid'를 사용하여 호스트에서 사용할 수 있습니다.

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

컨테이너를 실행할 때 유용한 할당 이름입니다.container_id를 참조할 필요가 없습니다.

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

먼저 원하는 컨테이너의 컨테이너 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//envor strace-p를 생각해 보십시오)을 위해 이 파일들에 "첨부"하고 싶을 수도 있지만, 이는 매우 특별한 경우입니다.

일반적으로 프로세스를 "실행"하기 때문에 구성을 수정하거나 로그를 읽고 싶다면 새 컨테이너를 만들고 디렉토리를 공유하거나 stdout에 기록(도커 로그가 작동함)하여 로그를 외부에 기록해야 합니다.

디버깅을 위해 셸을 시작한 다음 코드를 누른 다음 Ctrl-p + Ctrl-q를 눌러 셸을 그대로 유지할 수 있습니다.이렇게 하면 다음을 사용하여 다시 연결할 수 있습니다.

docker attach <container_id>

컨테이너가 예상하지 못한 작업을 수행하고 있으므로 컨테이너를 디버깅하려면 다음과 같이 디버그해 보십시오. https://serverfault.com/questions/596994/how-can-i-debug-a-docker-container-initialization

아뇨, 이건 불가능해요다음과 같은 것을 사용합니다.supervisord필요하다면 ssh 서버를 얻을 수 있을 겁니다.하지만, 저는 분명히 그 필요성에 의문을 갖고 있습니다.

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

반응형