백그라운드 모드에서 bash 또는 ssh를 실행중인 컨테이너에 가져 오는 방법은 무엇입니까?


933

실행중인 도커 컨테이너에 ssh 또는 bash하고 싶습니다. 예를 참조하십시오 :

$ sudo docker run -d webserver
webserver is clean image from ubuntu:14.04
$ sudo docker ps
CONTAINER ID  IMAGE            COMMAND    CREATED STATUS  PORTS          NAMES
665b4a1e17b6  webserver:latest /bin/bash  ...     ...     22/tcp, 80/tcp loving_heisenberg 

이제 다음과 같은 것을 얻고 싶습니다 (실행중인 컨테이너로 이동).

$ sudo docker run -t -i webserver (or maybe 665b4a1e17b6 instead)
$ root@665b4a1e17b6:/# 
However when I run the line above I get new CONTAINER ID
$ root@42f1e37bd0e5:/#

Vagrant를 사용했으며와 비슷한 동작을 원합니다 vagrant ssh.


다른 sudo docker exec -i -t 665b4a1e17b6 /bin/sh프로그램과 패키지를 설치할 수 있도록
fonjeekay

1
SSH를 사용하여 실행중인 컨테이너에 bash를 사용하는 것은 좋지 않습니다. 여기서 근거를 참조 하십시오 . sudo docker exec -i -t container-name /bin/bash갈 길입니다.
patryk.beza

답변:


1306

답은 Docker의 attach명령입니다. 위의 예에서 해결책은 다음과 같습니다.

$ sudo docker attach 665b4a1e17b6 #by ID
or
$ sudo docker attach loving_heisenberg #by Name
$ root@665b4a1e17b6:/#

Docker 버전 1.3 이상 : 컨테이너 쉘을 얻는 다른 방법을 제안한 WiR3D 사용자 에게 감사합니다 . 우리가 사용한다면 attach쉘의 인스턴스를 하나만 사용할 수 있습니다. 따라서 컨테이너 쉘의 새 인스턴스로 새 터미널을 열려면 다음을 실행하면됩니다.

$ sudo docker exec -i -t 665b4a1e17b6 /bin/bash #by ID

또는

$ sudo docker exec -i -t loving_heisenberg /bin/bash #by Name
$ root@665b4a1e17b6:/#

5
또는sudo docker attach loving_heisenberg
Thiago Perrotta를

51
attach 명령이 작동하지 않으면도 커가 얼어 붙습니다. 왜 그런 일이 일어나고 있습니까?
Mo J. Mughrabi

10
boot2docker 사용자를위한 알림 : sudo 제거 :)
Henno

17
-i -t같음-it
pasha.zhukov

47
이것은 선택되어 투표율이 높은 위험한 답변입니다. docker attach예를 들어 MongoDB 인스턴스에 연결하면 인스턴스가 종료됩니다. 에서 자세히 설명한 바와 같이 이 질문 attach 하고 exec다른 동물입니다.
fwc

675

Docker 1.3부터 ​​:

docker exec -it <containerIdOrName> bash

기본적으로 Docker 컨테이너가 /bin/bash명령을 사용하여 시작된 경우을 사용하여 액세스 할 수 있습니다 attach. 그렇지 않은 경우을 사용하여 컨테이너 내에 Bash 인스턴스를 작성하려면 명령을 실행해야합니다 exec.

또한 불량 프로세스에서 Bash를 실행하지 않고 Bash를 종료하려면 다음을 수행하십시오.

exit

그렇습니다, 그것은 간단합니다.


여전히 나노를 작동시키는 방법을 찾지 못했습니다. phusion의 docker-ssh가 포함될 수 있습니다.
WiR3D

도커에서 기본적으로 bash를 설정하는 방법이 있습니까?
ipeacocks

dockerfile의 RUN명령이 이면 @ipeacocks yes 입니다 /bin/bash. 그러나 당신이 의미하는 바에 달려 있습니다. 컨테이너를 실행하고 동일한 터미널에서 즉시 bash를 사용할 수있게하려면 다음과 같이 실행 -it하십시오
WiR3D

10
도커 그룹을 사용하는 것은 좋지 않습니다. docker 그룹에있는 모든 사용자는 sudo를 사용할 필요없이 루트 권한으로 본질적으로 사용됩니다. projectatomic.io/blog/2015/08/…
Maiku Mori

1
난 당신이 사용하는지 여부는, 호스트 보안 관점에서 많은 차이가되지 않습니다 생각 sudodocker그룹. 어느 쪽이든, docker 그룹을 사용하는지 또는 sudo컨테이너를 시작 하는지에 관계없이 게스트로부터 호스트 파일 시스템에 대한 모든 권한을 제공 할 수있는 보안 구멍이 docker에 내장되어 있습니다 .
nobar

123

질문의 저자는 구체적으로 실행중인 컨테이너에 관심이 있다고 말했지만 컨테이너가 실행 중이 아닌 경우 컨테이너를 실행하여 실행할 수 있음을 주목할 가치가 있습니다.

docker run -i -t --entrypoint /bin/bash <imageID>


10
@kraxor의 답변과 같이 다른 컨테이너를 제공합니다.
Blaisorblade


19

@Timur의 답변을 바탕으로 다음과 같은 편리한 스크립트를 만들었습니다.

설정

다음 내용으로 docker-ssh파일을 넣습니다.$PATH

#!/bin/bash -xe

# docker container id or name might be given as a parameter
CONTAINER=$1

if [[ "$CONTAINER" == "" ]]; then
  # if no id given simply just connect to the first running container
  CONTAINER=$(docker ps | grep -Eo "^[0-9a-z]{8,}\b")
fi

# start an interactive bash inside the container
# note some containers don't have bash, then try: ash (alpine), or simply sh
# the -l at the end stands for login shell that reads profile files (read man)
docker exec -i -t $CONTAINER bash -l

참고 : 일부 컨테이너가 포함되어 있지 않습니다 bash,하지만 ash, sh이러한 경우 등은 bash위의 스크립트로 교체해야한다.

용법

실행중인 인스턴스가 하나 뿐인 경우 간단히 실행하십시오.

$> docker-ssh 

그렇지 않으면, 당신이 얻는 docker id 매개 변수를 제공하십시오 docker ps(첫 번째 열)

$> docker-ssh 50m3r4nd0m1d

마지막에 왜 -l이 필요한지 알 수 있습니까?
Nam G VU

bash를 로그인 쉘로 시작하여 환경 매개 변수를 읽습니다 (명령 위의 줄에 설명 됨)
Matyas

13

컨테이너에 bash가 설치되어 있지 않으면 sh를 사용해보십시오.

docker exec -it CONTAINER /bin/sh

또는 먼저 / bin에서 쉘을 찾으십시오.

docker export CONTAINER|tar -t|egrep ^bin/

"영사" 는 무엇입니까 ? 그것에 대한 참조가 있습니까? "콘솔" 을 의미 합니까?
피터 Mortensen

9

실행중인 컨테이너에 SSH 기능을 제공하는 컨테이너화 된 SSH 서버를 만들었습니다. 컨테이너를 변경할 필요가 없습니다. 컨테이너에 bash가 있어야합니다.

이름이 'web-server1'인 컨테이너가있는 경우 다음 docker run 명령은 첫 번째 컨테이너에 SSH를 제공하는 두 번째 컨테이너를 시작합니다.

docker run -ti --name sshd-web-server1 -e CONTAINER=web-server1 -p 2222:22 \
-v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker \
jeroenpeeters/docker-ssh

더 많은 포인터를 보려면 https://github.com/jeroenpeeters/docker-ssh를 확인 하십시오.


이것은 정답입니다 ^
Nam G VU

그런데 솔루션을 사용하여 ssh 세션을 시작할 때 어떻게 .bashrc 자동로드 할 수 있습니까? 또한 github github.com/jeroenpeeters/docker-ssh/issues/30
Nam G VU

6

@jpetazzo는 이 주제에 관한 멋진 게시물을 가지고 있습니다. 짧은 대답은 다음을 사용하는 것입니다 nsenter.

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

추신 : 게시물의 의견에서 토론을 확인하는 것을 잊지 마십시오 ...

건배


1
그것은 더 이상 실제로 필요하지 않은 다소 오래된 게시물입니다 . @ WiR3D의 docker exec솔루션은 오히려 더 편리합니다.
drevicko

4

Docker 컨테이너에 Pipework를 사용하여 라우팅 가능한 IP 주소를 제공 한 후 SSH를 사용하여 새 IP 주소로 시스템에 SSH를 지정할 수도 있습니다.

이것은와 같은 응용 프로그램 특정 명령을 사용하는 대신 "전통적인"(ssh) docker attach이 될 것이며 결국 시스템과 버전에서 더 '이동 가능'하게됩니다.


간단한 방법을 추가하십시오. 솔직히 말하면 정말로 필요하지만 가장 간단한 해결책을 찾을 시간이 없습니다. 여기에 답변을 게시 할 수 있습니까? 그것은 좋을 것이다 ..
Timur Fayzrakhmanov

2
이를 달성하는 데는 두 가지 방법이 있지만 간단하지 않으며 큰 포스트가 될 것입니다. 파이프 링크 또는이 링크 를 사용 하기 위해이 링크 를 직접 확인할 수 있습니다 . 마녀는 본질적으로 파이프와 동일하며 약간 더 간단하지만 수동으로해야합니다. 따라서 대화하는 서버 수에 따라 다릅니다. 더 구체적인 것을 알 수 없다면 알려주세요. 그러나 나는 또한 전체 자습서를 작성할 시간이 없습니다.
radriaanse

당신은 맞다 -.을 (링크에 대한 감사, 내가 나중에 다시 방문 할 생각 할 수없는 분명하고 간단한 방법이 없다
티무르 Fayzrakhmanov



1

GOINSIDE

다음을 사용하여 goinside명령 행 도구를 설치하십시오 .

sudo npm install -g goinside

다음과 같이 적절한 터미널 크기의 도커 컨테이너 안에 들어갑니다.

goinside docker_container_name

자세한 내용은 이것을 확인 하십시오 .


0

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

docker exec -t -i container_name /bin/bash

1
이것은 @AdamKalnas와 같은 답변입니다
Bruni

0

정보를 위해서. 데몬이 아닌 간단한 컨테이너에 로그인해야하는 경우 다음 명령을 사용해야합니다.

docker start {id}
docker attach {id}

-1

컨테이너가 예를 들어 데이터 전용 컨테이너처럼 중지 된 경우 데이터 컨테이너에 연결할 때마다 폐기 컨테이너를 실행하는 것이 좋습니다. 이 경우 임시 컨테이너에 OS 도구가 있으므로 데이터 컨테이너 자체가 완전히 비어있을 수 있습니다.

$ docker run --rm --volumes-from mydata -it ubuntu bash
root@645045d3cc87:/# ls /mydata
root@645045d3cc87:/# touch /mydata/foo
root@645045d3cc87:/# exit
exit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.