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

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

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



답변

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
$


답변

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

docker exec -t -i container_name /bin/bash

또는

docker exec -ti container_name /bin/bash

또는

docker exec -ti container_name sh


답변

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

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


답변

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

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

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

$ docker-compose exec web bash


답변

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

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


답변

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

winpty docker exec -it <container_id> sh

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


답변

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

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