etc./StackOverFlow

Docker 컨테이너의 셸에 어떻게 들어가나요?

청렴결백한 만능 재주꾼 2022. 2. 27. 12:39
반응형

질문자 :Andrew


Docker 작업을 시작하고 있습니다. WordPress 기본 이미지와 docker-compose를 사용하고 있습니다.

초기 빌드 중에 생성된 파일/디렉토리를 검사하기 위해 컨테이너 중 하나에 ssh를 시도하고 있습니다. docker-compose run containername ls -la 를 실행하려고 시도했지만 아무 것도 하지 않았습니다. 그렇다고 해도 단일 명령을 실행하는 것보다 디렉토리 구조를 탐색할 수 있는 콘솔을 사용하는 것이 좋습니다. Docker로 이를 수행하는 올바른 방법은 무엇입니까?



docker attach 을 사용하면 Docker 컨테이너에 연결할 수 있지만 실제로는 ssh 와 동일하지 않습니다. 예를 들어 컨테이너에서 웹 서버를 실행 중인 경우 docker attach 은 웹 서버 프로세스 의 표준 출력 에 연결할 것입니다. 반드시 쉘을 제공하지는 않습니다.

docker exec 명령은 아마도 당신이 찾고 있는 것입니다. 이렇게 하면 기존 컨테이너 내에서 임의의 명령을 실행할 수 있습니다. 예를 들어:

 docker exec -it <mycontainer> bash

물론 실행 중인 명령이 컨테이너 파일 시스템에 있어야 합니다.

위 명령에서 <mycontainer> 는 대상 컨테이너의 이름 또는 ID입니다. docker compose 사용 여부는 중요하지 않습니다. docker ps 실행하고 ID(첫 번째 열에 표시되는 16진수 문자열) 또는 이름(마지막 열에 표시됨)을 사용하십시오. 예:

 $ docker ps d2d4a89aaee9 larsks/mini-httpd "mini_httpd -d /cont 7 days ago Up 7 days web

난 뛸 수있어:

 $ docker exec -it web ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 18: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff inet 172.17.0.3/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::42:acff:fe11:3/64 scope link valid_lft forever preferred_lft forever

다음을 실행하여 동일한 작업을 수행할 수 있습니다.

 $ docker exec -it d2d4a89aaee9 ip addr

마찬가지로 컨테이너에서 쉘을 시작할 수 있습니다.

 $ docker exec -it web sh / # echo This is inside the container. This is inside the container. / # exit $

larsks

실행 중인 컨테이너로 bash하려면 다음을 입력하십시오.

 docker exec -t -i container_name /bin/bash

또는

 docker exec -ti container_name /bin/bash

또는

 docker exec -ti container_name sh

Agustí Sánchez

역사적 참고 사항: 이 답변을 작성할 당시 질문의 제목은 "도커 컨테이너로 ssh하는 방법"이었습니다.

다른 답변에서 알 수 있듯이 SSH 대신 docker exec 를 사용하여 로컬에서 액세스할 수 있는 실행 컨테이너에서 사전 설치된 명령(셸 포함)을 실행하고 상호 작용하는 것이 일반적입니다.

 docker exec -it (container) (command)

참고: 아래 답변은 Ubuntu(2016년)를 기반으로 합니다. Debian이 아닌 컨테이너의 경우 설치 프로세스의 일부 번역이 필요합니다.

자신의 이유로 SSH를 정말로 사용하고 싶다고 가정해 보겠습니다. 몇 단계가 필요하지만 수행할 수 있습니다. 다음은 컨테이너 내부에서 실행하여 설정하는 명령입니다...

 apt-get update apt-get install openssh-server mkdir /var/run/sshd chmod 0755 /var/run/sshd /usr/sbin/sshd useradd --create-home --shell /bin/bash --groups sudo username ## includes 'sudo' passwd username ## Enter a password apt-get install x11-apps ## X11 demo applications (optional) ifconfig | awk '/inet addr/{print substr($2,6)}' ## Display IP address (optional)

이제 SSH 클라이언트로 전달하는 X11을 사용하여 그래픽 애플리케이션(컨테이너에 설치된 경우)을 실행할 수도 있습니다.

 ssh -X username@IPADDRESS xeyes ## run an X11 demo app in the client

다음은 몇 가지 관련 리소스입니다.


Brent Bradburn

나와 같은 Docker Compose 관련 답변을 찾고 있다면 생성된 컨테이너 ID를 조회할 필요 없이 쉬운 방법을 제공합니다.

docker-compose exec docker-compose.yml 파일에 따라 서비스 이름을 사용합니다.

따라서 '웹' 서비스용 Bash 셸을 얻으려면 다음을 수행할 수 있습니다.

 $ docker-compose exec web bash

bcmcfc

주의 사항 : 이 답변은 내가 작성한 도구를 홍보합니다.

실행 중인 모든 컨테이너에 '고정'할 수 있는 컨테이너화된 SSH 서버를 만들었습니다. 이렇게 하면 모든 컨테이너로 컴포지션을 만들 수 있습니다. 유일한 요구 사항은 컨테이너에 Bash가 있다는 것입니다.

다음 예에서는 이름이 'my-container'인 컨테이너에 연결된 SSH 서버를 시작합니다.

 docker run -d -p 2222:22 \ -v /var/run/docker.sock:/var/run/docker.sock \ -e CONTAINER=my-container -e AUTH_MECHANISM=noAuth \ jeroenpeeters/docker-ssh ssh localhost -p 2222

이 SSH 서비스(선택한 SSH 클라이언트 사용)에 연결하면 이름이 'my-container'인 컨테이너에서 Bash 세션이 시작됩니다.

더 많은 포인터와 문서는 https://github.com/jeroenpeeters/docker-ssh를 참조하십시오.


Jeroen Peeters

컨테이너가 이미 종료된 경우(일부 오류로 인해) 다음을 수행할 수 있습니다.

 $ docker run --rm -it --entrypoint /bin/ash image_name

또는

 $ docker run --rm -it --entrypoint /bin/sh image_name

또는

 $ docker run --rm -it --entrypoint /bin/bash image_name

새 컨테이너를 만들고 쉘을 가져옵니다. --rm을 지정했으므로 셸을 종료하면 컨테이너가 삭제됩니다.


user674669

Windows에서 Docker를 사용 중이고 컨테이너에 대한 셸 액세스 권한을 얻으려면 다음을 사용하세요.

 winpty docker exec -it <container_id> sh

아마도 Git Bash 가 이미 설치되어 있을 것입니다. 그렇지 않은 경우 설치하십시오.


Cosmin Ababei

어떤 경우에는 이미지가 알파인 기반일 수 있습니다. 이 경우 다음을 던집니다.

OCI 런타임 실행 실패: 실행 실패: container_linux.go:348: 컨테이너 프로세스 시작으로 인해 "exec: \"bash\": $PATH에서 실행 파일을 찾을 수 없음": 알 수 없음

/bin/bash 가 존재하지 않기 때문입니다. 이 대신 다음을 사용해야 합니다.

 docker exec -it 9f7d99aa6625 ash

또는

 docker exec -it 9f7d99aa6625 sh

Deoxyseia

Windows 컨테이너에서 cmd에 연결하려면 다음을 사용하십시오.

 docker exec -it d8c25fde2769 cmd

여기서 d8c25fde2769 는 컨테이너 ID입니다.


Aqeel Qureshi

다음 명령을 사용하여 Docker 컨테이너에 대한 세션을 시작합니다.

 sudo docker exec -i -t (container ID) bash

Tjs

고인사이드 솔루션

다음을 사용하여 goinside 명령줄 도구를 설치합니다.

 sudo npm install -g goinside

다음을 사용하여 적절한 터미널 크기로 도커 컨테이너 내부로 이동하십시오.

 goinside docker_container_name

오래된 대답

이 스니펫을 ~/.profile 에 넣었습니다.

 goinside(){ docker exec -it $1 bash -c "stty cols $COLUMNS rows $LINES && bash"; } export -f goinside

이렇게 하면 모든 사람이 다음을 사용하여 실행 중인 컨테이너 내부로 들어갈 수 있습니다.

 goinside containername

또한 고정 Docker 컨테이너 터미널 크기에 대한 오래 지속되는 문제를 해결합니다. 직면하면 매우 짜증납니다.

또한 링크 를 따라가면 도커 컨테이너 이름에 대한 명령 완성도 표시됩니다.


Soorena

파일을 검사하려면 docker run -it <image> /bin/sh 를 실행하여 대화형 터미널을 가져옵니다. 이미지 목록은 docker images 얻을 수 있습니다. docker exec 달리 이 솔루션은 이미지가 시작되지 않는 경우(또는 실행 직후 종료되는 경우)에도 작동합니다.


igo

그것은 간단합니다 !

모든 Docker 이미지를 나열합니다.

 sudo docker images

내 시스템에서는 다음과 같은 출력이 표시되었습니다.

 REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE bash latest 922b9cc3ea5e 9 hours ago 14.03 MB ubuntu latest 7feff7652c69 5 weeks ago 81.15 MB

내 PC에 두 개의 Docker 이미지가 있습니다. 첫 번째 것을 실행하고 싶다고 가정해 봅시다.

 sudo docker run -i -t ubuntu:latest /bin/bash

이렇게 하면 컨테이너를 터미널에서 제어할 수 있습니다. 이제 컨테이너 내에서 모든 유형의 셸 작업을 수행할 수 있습니다. ls 를 수행하는 것과 마찬가지로 파일 시스템의 루트에 있는 모든 폴더를 출력합니다.

 bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

Patel Sunil

컨테이너의 터미널에 더 쉽게 액세스할 수 있도록 터미널 기능을 만들었습니다. 아마도 여러분에게도 유용할 것입니다.

결과는 다음을 입력하는 대신 다음과 같습니다.

 docker exec -it [container_id] /bin/bash

당신은 쓸 것입니다 :

 dbash [container_id]

다음을 ~/.bash_profile(또는 자신에게 맞는 것)에 넣은 다음 새 터미널 창을 열고 바로 가기를 즐기세요.

 #usage: dbash [container_id] dbash() { docker exec -it "$1" /bin/bash }

Guy

$ docker exec -it <Container-Id> /bin/bash

또는 쉘에 따라 다음과 같이 될 수 있습니다.

 $ docker exec -it <Container-Id> /bin/sh

docker ps 명령을 통해 컨테이너 ID 를 얻을 수 있습니다.

-i = 대화식

-t = 의사 TTY 할당


Ashutosh Chamoli

-ti 옵션을 전달하여 도커 컨테이너의 터미널과 상호 작용할 수 있습니다.

 docker run --rm -ti <image-name> eg: docker run --rm -ti ubuntu

-t는 터미널을 의미합니다. -i는 대화형을 의미합니다.


Alwin

docker exec 는 확실히 해결책이 될 것입니다. 귀하가 요청한 질문으로 작업하는 쉬운 방법은 Docker 내부의 디렉토리를 로컬 시스템의 디렉토리 에 마운트하는 것입니다.

로컬 경로의 변경 사항을 즉시 볼 수 있습니다.

 docker run -v /Users/<path>:/<container path>

Pratik

사용하다:

 docker attach <container name/id here>

다른 방법은 위험이 있음에도 불구하고 attach 를 사용하는 것입니다. 그러나 Ctrl + C 를 사용하여 세션을 종료하면 컨테이너도 중지됩니다. 무슨 일이 일어나고 있는지 보고 싶다면 docker logs -f 사용하십시오.

 :~$ docker attach --help Usage: docker attach [OPTIONS] CONTAINER Attach to a running container Options: --detach-keys string Override the key sequence for detaching a container --help Print usage --no-stdin Do not attach STDIN --sig-proxy Proxy all received signals to the process (default true)

rbrooker

다음 명령을 사용하십시오.

 docker exec -it containerid /bin/bash

Admin Hack

대상에 따라 최소 2가지 옵션이 있습니다.

옵션 1: 새 bash 프로세스를 만들고 여기에 참여 (더 쉽게)

  • 샘플 시작: docker exec -it <containername> /bin/bash
  • 종료 : 형 exit
  • 장점: 모든 컨테이너에서 작동합니다(CMD/진입점에 의존하지 않음)
  • 대조: 자체 세션 및 자체 환경 변수를 사용하여 새 프로세스 생성

옵션 2: 이미 실행 중인 bash에 연결 (더 좋음)

  • 샘플 시작: docker attach --detach-keys ctrl-d <containername>
  • 종료: ctrld
  • 장점: 컨테이너에 있는 동일한 실행 중인 bash에 조인합니다. 동일한 세션과 동일한 환경 변수가 있습니다.
  • 대조: CMD/Entrypoint가 CMD ["/bin/bash"] 또는 CMD ["/bin/bash", "--init-file", "myfile.sh"] 와 같은 대화형 bash이고 컨테이너가 다음과 같은 경우에만 작동합니다. docker run -itd <image> (-i=interactive, -t=tty 및 -d=deamon [opt])와 같은 대화형 옵션으로 시작되었습니다.

우리는 옵션 2가 더 유용하다는 것을 알았습니다. 예를 들어 apache2-foreground 를 일반 배경 apache2 하고 그 후에 bash 시작했습니다.


terraloader

Kitematic 과 함께 Docker가 설치되어 있으면 GUI를 사용할 수 있습니다. 열기 Kitematic 도커 아이콘에서와의 Kitematic 창은 컨테이너를 선택하고 다음을 클릭 exec 아이콘입니다.

이 GUI에서도 컨테이너 로그와 많은 컨테이너 정보(설정 탭에서)를 볼 수 있습니다.

메뉴에서 Kitematic 선택

실행을 클릭하십시오


Alireza Fattahi

test 라는 이름의 실행 중인 컨테이너로 실행하려면 다음 명령이 있습니다.

컨테이너에 bash 쉘이 있는 경우

 docker exec -it test /bin/bash

컨테이너에 bourne shell이 있고 대부분의 경우 존재하는 경우

 docker run -it test /bin/sh

nischay goyal

제 경우에는 어떤 이유로 각 컨테이너의 모든 네트워크 관련 정보를 확인해야 합니다. 따라서 다음 명령은 컨테이너에서 유효해야 합니다...

 ip route netstat ps ...

나는이 모든 답변을 확인했지만 아무 것도 도움이되지 않았습니다. 다른 웹사이트에서 정보를 검색했습니다. 영어로 작성되지 않았기 때문에 여기에 슈퍼 링크를 추가하지 않겠습니다. 그래서 저와 같은 요구 사항을 가진 사람들을 위해 요약 솔루션으로이 게시물을 올렸습니다.

light-test라는 이름의 실행 중인 컨테이너가 하나 있다고 가정합니다. 아래 단계를 따르세요.

  • docker inspect light-test -f {{.NetworkSettings.SandboxKey}} . /var/run/docker/netns/xxxx 와 같은 응답을 받습니다.
  • 그런 다음 ln -s /var/run/docker/netns/xxxx /var/run/netns/xxxx . 디렉토리가 없을 수 있습니다. 먼저 mkdir /var/run/netns .
  • 이제 ip netns exec xxxx ip addr show 를 실행하여 컨테이너의 네트워크 세계를 탐색할 수 있습니다.

추신. xxxx 는 항상 첫 번째 명령에서 받은 것과 동일한 값입니다. ip netns exec xxxx netstat -antp|grep 8080 과 같은 다른 명령도 유효합니다.


Light.G

또 다른 옵션은 nsenter 를 사용하는 것입니다.

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

xuhdev

Docker Compose를 사용하는 경우 Docker 컨테이너 내부로 이동합니다.

 docker-compose run container_name /bin/bash

컨테이너 내부에서 Dockerfile에 정의된 WORKDIR로 이동합니다. 다음을 통해 작업 디렉토리를 변경할 수 있습니다.

 WORKDIR directory_path # Eg /usr/src -> container's path

Sivakumar

docker-compose up(Docker4Drupal)

 docker-compose exec php bash

Linux 랩톱 에서 Drupal 용 Docker를 사용합니다. 컨테이너를 실행한 후 ' docker-compose exec php bash '를 사용하여 컨테이너에 연결하여 drush 특공대를 실행할 수 있습니다. 그것은 나를 위해 잘 작동합니다.


illutek

출처 : http:www.stackoverflow.com/questions/30172605/how-do-i-get-into-a-docker-containers-shell

반응형