[docker] Docker 컨테이너의 셸에 들어가려면 어떻게합니까?
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
$
답변
실행중인 컨테이너에 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
관련 리소스는 다음과 같습니다.
- openssh-server가 Docker 컨테이너에서 시작되지 않습니다
- 백그라운드 모드에서 bash 또는 ssh를 실행중인 컨테이너에 가져 오는 방법은 무엇입니까?
- Docker 컨테이너에서 GUI 응용 프로그램을 실행할 수 있습니까?
- 검색에서 찾을 수있는 그래픽 액세스에 대한 다른 유용한 접근 방식 : Docker X11
- Docker 컨테이너에서 SSHD를 실행하면 잘못되었습니다!
답변
여기와 같은 Docker Compose 관련 답변을 찾고 있다면 생성 된 컨테이너 ID를 조회하지 않고도 쉽게 할 수 있습니다.
docker-compose exec
docker-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을 지정 했으므로 쉘을 종료하면 컨테이너가 삭제됩니다.