Docker 컨테이너의 셸에 들어가려면 어떻게합니까?


1160

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

초기 빌드 중에 작성된 파일 / 디렉토리를 검사하기 위해 컨테이너 중 하나에 ssh하려고합니다. 나는 달리려고했지만 docker-compose run containername ls -la아무것도하지 않았다. 그랬더라도 단일 명령을 실행하는 대신 디렉토리 구조를 통과 할 수있는 콘솔이 필요합니다. Docker 로이 작업을 수행하는 올바른 방법은 무엇입니까?


답은 docker attach 인 것 같습니다. 그러나 docker-compose에서 어떻게 얻을 수 있습니까?
앤드류

3
docker exec askubuntu.com/a/543057/35816을 사용하십시오 . docker ps
Mauricio Scheffer를

26
sudo docker run -it --entrypoint /bin/bash <container_name>대화식으로 컨테이너에 들어갑니다. 그러면 다음을 사용하여 컨테이너의 파일 시스템을 검사 할 수 있습니다.cd <path>
Sergei

답변:


1730

docker attachDocker 컨테이너에 연결할 수 있지만 실제로는 같은 것이 아닙니다 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
$

76
또한 docker exec컨테이너를 실행하는 경우 에만 작동합니다 (그렇지 않으면 사용 docker run -it --entrypoint /bin/bash또는 유사).
L0j1k

59
사용자의 편의를 위해, -it의 조합 -i-t--interactive각각 ( "STDIN가 연결되어 있지 않더라도 열 유지") --tty( "의사 TTY을 할당").
Adrian Föder

23
Alpine Linux 기반 컨테이너에서는 bash가 없을 수 있으므로 대신 sh를 사용하십시오.
Robin Green

9
L0j1k @ 그것은 docker run -it --entrypoint /bin/bash <imageid> --any --more --args단지 사람들을 위해 명확하게,
알렉산더 밀스

2
@AlexanderMills 그렇습니다. 더 명확하게 설명 --any --more --args하면 CMDDocker가 아닌 이미지가 정의 한대로 공급됩니다 (또는 이미지가 ENTRYPOINTand 만 정의 하지 않은 경우 여기에 지정된대로 CMD옵션이 제공됩니다) /bin/bash). 예를 들어 다른 docker run옵션 (예 :) --net "host"<imageid>.
L0j1k

302

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

docker exec -t -i container_name /bin/bash

또는

docker exec -ti container_name /bin/bash

또는

docker exec -ti container_name sh

리눅스 컨테이너라고 생각하십니까?
피터 Mortensen

5
/ bin / bash는 bash 만 필요했습니다
Anand Varkey Philips

6
docker exec -it대신에 선호 합니다docker exec -t -i
VaTo

차이점은 무엇입니까 @VaTo
AATHITH RAJENDRAN

@AATHITHRAJENDRANI는 두 개의 플래그 대신 짧은 형식의 명령을 선호하므로 두 인수를 동일한 인수 -it에 포함시킬 수 있습니다.
VaTo

85

자신의 이유로 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)

이제 X11을 SSH 클라이언트로 전달하여 그래픽 응용 프로그램 (컨테이너에 설치된 경우)을 실행할 수도 있습니다.

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

관련 리소스는 다음과 같습니다.


33

여기와 같은 Docker Compose 관련 답변을 찾고 있다면 생성 된 컨테이너 ID를 조회하지 않고도 쉽게 할 수 있습니다.

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

따라서 '웹'서비스에 대한 Bash 쉘을 얻으려면 다음을 수행하십시오.

$ docker-compose exec web bash

docker-compose run컨테이너가 아직 없으면 작동합니다.
바울

23

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

컨테이너로 실행되는 컨테이너에 '고착'할 수있는 컨테이너화 된 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를 참조하십시오.


1
꽤 달콤합니다. 이런 식으로하는 것의 가장 큰 장점은 모든 기능을 갖춘 터미널을 얻는 것입니다. "docker exec"접근 방식을 사용했을 때 터미널 내용을 지울 수 없었고, less실행할 때마다 경고를 표시했습니다. Jeroen의 컨테이너를 사용하면 지금까지 훨씬 더 나은 경험을 얻을 수 있습니다. 설명서확인 하십시오 . 응답의 샘플 명령이 더 이상 유효하지 않은 것 같습니다.
Rafał G.

1
훌륭한 도구입니다. 젠킨스 파이프 라인 도커 에이전트로 어떻게 사용할 수 있습니까? jenkins가 SCP에 의해 일부 파일을 원격 호스트로 전송하고 SSH로 실행하기를 원합니다
Gilson

21

Windows에서 Docker를 사용하고 있고 컨테이너에 대한 쉘 액세스 권한을 얻으려면 다음을 사용하십시오.

winpty docker exec -it <container_id> sh

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


1
Linux Docker 컨테이너를 가정합니까?
피터 Mortensen

1
docker exec -ti <container_id> cmd는 잘 작동합니다
PBo

17

컨테이너가 이미 종료 된 경우 (일부 오류로 인해 발생할 수 있음)

$ 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을 지정 했으므로 쉘을 종료하면 컨테이너가 삭제됩니다.


16

경우에 따라 이미지가 알파인 기반 일 수 있습니다. 이 경우에는 다음이 발생합니다.

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

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

docker exec -it 9f7d99aa6625 ash

또는

docker exec -it 9f7d99aa6625 sh

15

이 명령을 사용하여 Docker 컨테이너에 SSH :

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

12

Windows 컨테이너에서 cmd에 연결하려면

docker exec -it d8c25fde2769 cmd

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


11

간단합니다 !

모든 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

11

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


리눅스 도커 이미지를 생각하십니까?
피터 Mortensen

10

고 인사이드 솔루션

다음을 사용하여 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 컨테이너 터미널 크기에 대한 오랜 문제를 해결 합니다 . 당신이 그것을 직면하면 매우 성가신입니다.

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


1
감사. 적어도 bash가 이미 포함 된 이미지의 경우 매력처럼 작동합니다. 그러나 알파인 기반 이미지에서는 작동하지 않을 수 있습니다. sh / ash 등을 위해 특별히 작성된 다른 기능으로 수정 될 수 있습니다.
Gaurav Bhaskar

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

또는 껍질에 따라

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

container-Id를 얻을 수 있습니다docker ps 명령을 통해 를

-i = 대화식

-t = 의사 TTY를 할당


8

컨테이너 터미널에 더 쉽게 액세스 할 수 있도록 터미널 기능을 만들었습니다. 어쩌면 그것은 당신에게도 유용 할 것입니다 :

결과는 다음과 같이 입력하는 것입니다.

docker exec -it [container_id] /bin/bash

당신은 쓸 것이다 :

dbash [container_id]

~ / .bash_profile (또는 그 밖의 다른 것)에 다음을 넣고 새 터미널 창을 열고 바로 가기를 즐기십시오.

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

7

-ti 옵션을 전달하여 docker container의 터미널과 상호 작용할 수 있습니다

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

-t는 터미널을 나타냅니다. -i는 대화식을 나타냅니다.


6

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

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

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

1
귀하의 명령은 실제로 호스트의 디렉토리를 컨테이너에 마운트합니다.
Demonbane

네! 다른 디렉토리로 백업 한 다음 볼륨을 마운트 한 다음 백업을 마운트 된 폴더로 이동하십시오.
Pratik

6

사용하다:

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)


4

Docker를와 함께 설치 한 Kitematic경우 GUI를 사용할 수 있습니다. KitematicDocker 아이콘에서 열고 Kitematic창에서 컨테이너를 선택한 다음exec 아이콘 .

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

메뉴에서 Kitematic을 선택하십시오

exec를 클릭하십시오


2

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

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.


1

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

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

2
에 여러 가지 문제가 nsenter있습니다. 첫 번째는 Docker 호스트에 대한 물리적 액세스 권한이 필요하다는 것입니다. 이는 제공되지 않습니다 (원격 docker API로 작업 중일 수 있음). 또한 아래에서 실행 nsenter하면 Docker가 설정 한 몇 가지 보안 및 리소스 제한 (환경에 따라 찬반 양론)이 면제됩니다.
Larsks

1
nsenter의 저자조차도 요즘 사용 한다고 말합니다docker exec .
L0j1k

1
@larsks 네, 둘 다 자신의 혜택이 있습니다. 예를 들어, 이것은 nsenter over의 이점입니다 docker exec. docker exec나에게 더 우아해 보인다.
xuhdev

2
@ L0j1k 혼동을 줄이려면 : 참조한 게시물은 nsenter의 작성자가 아니라 nsenter를 실행하는 Docker 이미지의 작성자입니다.
xuhdev

1

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

docker-compose run container_name /bin/bash

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

WORKDIR directory_path # E.g  /usr/src -> container's path

0

실행중인 컨테이너라는 이름으로 실행하려면 test 다음 명령을 사용하십시오.

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

docker exec -it test /bin/bash

컨테이너에 bourne쉘이 있고 대부분의 케이스가있는 경우

docker run -it test /bin/sh

-3

도커 작성 용 (Docker4Drupal)

docker-compose exec php bash

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.