Docker 컨테이너의 셸에 들어가는 방법

docker docker-container


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

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




Answer 1 larsks


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
$



Answer 2 Agustí Sánchez


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

docker exec -t -i container_name /bin/bash

or

docker exec -ti container_name /bin/bash

or

docker exec -ti container_name sh



Answer 3 nobar


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

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




Answer 4 bcmcfc


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

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

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

$ docker-compose exec web bash



Answer 5 Jeroen Peeters


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

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