도커 컨테이너의 셸에 어떻게 들어가나요?
도커와 함께 일을 시작하고 있습니다.워드프레스 기본 이미지와 도커 합성을 사용하고 있습니다.
초기 빌드 중에 생성된 파일/디렉토리를 검사하기 위해 컨테이너 중 하나에 ssh를 넣으려고 합니다.도망치려고 했어요docker-compose run containername ls -la
하지만 아무 소용이 없었어요설령 그렇다 하더라도, 단일 명령을 실행하는 것보다 디렉터리 구조를 이동할 수 있는 콘솔이 더 좋습니다.Docker로 이 작업을 수행하는 올바른 방법은 무엇입니까?
docker attach
에 연결할 Docker 컨테이너와 하지만 이것은 실제로와 같지 않습니다.ssh
를 들어 컨테이너가 웹, 예를 들어, 예를들어웹, 너가실중행경인우서를버컨,docker attach
아마 웹 서버 프로세스의 stdout에 연결될 것입니다.그것이 반드시 당신에게 껍질을 주는 것은 아닙니다.
그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
$
실행 중인 컨테이너를 격납하려면 다음을 입력합니다.
docker exec -t -i container_name /bin/bash
또는
docker exec -ti container_name /bin/bash
또는
docker exec -ti container_name sh
기록 노트:제가 이 답을 쓸 때, 질문의 제목은 "도커 컨테이너에 ssh를 넣는 방법"이었습니다.
다른 답변에서 알 수 있듯이 SSH 대신 도커 exec을 사용하여 로컬로 액세스할 수 있는 실행 컨테이너에서 사전 설치된 명령(쉘 포함)을 실행하고 상호 작용하는 것이 일반적입니다.
docker exec -it (container) (command)
참고: 아래 답변은 Ubuntu(2016년 기준)를 기반으로 합니다.데비안이 아닌 컨테이너의 경우 설치 프로세스의 일부 변환이 필요합니다.
여러분만의 이유로 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)
이제 SSH 클라이언트로 X11 포워딩을 사용하여 그래픽 애플리케이션(컨테이너에 설치된 경우)을 실행할 수도 있습니다.
ssh -X username@IPADDRESS
xeyes ## run an X11 demo app in the client
다음은 몇 가지 관련 리소스입니다.
- opensh-server가 Docker 컨테이너에서 시작되지 않음
- 백그라운드 모드에서 실행 중인 컨테이너에 bash 또는 ssh를 넣는 방법은 무엇입니까?
- 리눅스 도커 컨테이너에서 GUI 애플리케이션을 실행할 수 있습니까?
- 검색을 통해 그래픽 액세스를 위한 다른 유용한 접근 방식: Docker X11
- 도커 컨테이너에서 SSHD를 실행하면 잘못된 것입니다!
저처럼 도커 컴포지트 관련 답변을 찾는다면 생성된 컨테이너 ID를 조회할 필요 없이 쉽게 들어갈 수 있습니다.
docker-compose exec
은 사용자의 비스이사다니에 사용됩니다.docker-compose.yml
java.
따라서 '웹' 서비스를 위한 Bash 셸을 얻으려면 다음 작업을 수행할 수 있습니다.
$ docker-compose exec web bash
일부 오류로 인해 용기가 이미 종료된 경우 다음 작업을 수행할 수 있습니다.
$ docker run --rm -it --entrypoint /bin/bash image_name
또는
$ docker run --rm -it --entrypoint /bin/sh image_name
또는
$ docker run --rm -it --entrypoint /bin/bash image_name
새 컨테이너를 만들고 셸을 삽입합니다.
다음은 명령의 세부 내용입니다.
--rm: This option specifies that the container should be automatically removed when it is finished.
-it: These options allow the container to be run interactively with a pseudo-tty terminal. The -i option stands for interactive mode and the -t option stands for a pseudo-tty terminal.
--entrypoint /bin/bash: This option specifies the entry point for the container as /bin/bash, which is the shell program.
image_name: This is the name of the Docker image on which the container will be based.
--rm을 지정했으므로 셸을 종료하면 컨테이너가 삭제됩니다.
다음 명령을 사용하여 도커 컨테이너로 세션을 시작합니다.
sudo docker exec -i -t (container ID) bash
간단하죠.
docker exec -it <container_id> bash
에 이상으로-it
대화형 터미널을 의미합니다.
또한 이미지 이름:
docker exec -it <REPOSITORY name> 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가 이미 설치되어 있습니다.설치하지 않으면 설치해야 합니다.
경우에 따라 이미지가 Alpine 기반일 수 있습니다.이 경우 다음을 던집니다.
OCI 런타임 실행 실패: exec 실패: container_linux.go:348: 컨테이너 프로세스 시작으로 인해 "exec: \"bash\": 실행 파일을 $PATH에서 찾을 수 없음": 알 수 없음
ㅠㅠ/bin/bash
존재하지 않습니다.대신 다음을 사용해야 합니다.
docker exec -it 9f7d99aa6625 ash
또는
docker exec -it 9f7d99aa6625 sh
docker exec -it <container_id or name> bash
OR
docker exec -it <container_id or name> /bin/bash
윈도우즈 컨테이너의 cmd에 연결하려면 다음을 사용합니다.
docker exec -it d8c25fde2769 cmd
여기서 d8c25fde2769는 컨테이너 ID입니다.
솔루션 내부로 이동
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 run -it <image> /bin/sh
대화형 터미널을 사용할 수 있습니다.은 이지목다통얻수있을다습니해로 얻을 수 .docker images
반로대와는 docker exec
이 솔루션은 이미지가 시작되지 않거나 실행된 후 즉시 종료되는 경우에도 작동합니다.
그것은 간단합니다!
모든 도커 이미지를 나열합니다.
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에 두 개의 도커 이미지가 있습니다.제가 첫 번째를 실행하고 싶다고 가정해 보겠습니다.
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
2022년 해결책
다른 옵션 고려
왜 당신은 그게 필요한 것이죠?
분산되지 않은 기본 이미지(둘 다 없음)를 기반으로 하는 현대적인 도커 이미지가 많기 때문에 이를 수행하는 것이 불가능합니다.docker exec -it {container-name} bash
그들 속으로.
모든 용기에 쉘을 넣는 방법
오프너 사용:
- 사용자 환경에 별칭을 추가해야 합니다.
opener wordpress
- 어디서나 합니다.
docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock artemkaxboy/opener wordpress
에 에.wordpress
, 할 수 .
작동 방식
오프너는 도커 이미지로 포장된 파이썬 스크립트 세트입니다.고유 속성(이름, ID, 포트, 이미지)을 사용하여 대상 컨테이너를 찾고, 다음을 사용하여 대상에 연결을 시도합니다.bash
.한다면bash
오프너를 사용하여 합니다.sh
마지막으로 만약sh
설치 중 를 찾을 수 없습니다.busybox
쉘을 는 대상테 컨 이 여 하 에 대 사 삭 연 오 너 제 프 결 상 용 을 셸 너 스 에 박 연 고busybox
끊기는 동안.
컨테이너의 터미널에 쉽게 접근할 수 있도록 터미널 기능을 만들었습니다.여러분에게도 유용할 수 있습니다.
따라서 결과는 다음과 같습니다.
docker exec -it [container_id] /bin/bash
다음과 같이 적을 것입니다.
dbash [container_id]
~/.bash_profile(또는 자신에게 적합한 다른 모든 것)에 다음을 입력한 다음 새 터미널 창을 열고 바로 가기를 즐기십시오.
#usage: dbash [container_id]
dbash() {
docker exec -it "$1" /bin/bash
}
$ docker exec -it <Container-Id> /bin/bash
또는 껍질에 따라 다음과 같이 될 수 있습니다.
$ docker exec -it <Container-Id> /bin/sh
컨테이너 ID는 다음을 통해 얻을 수 있습니다.docker ps
-i
-t
합니다.
옵션 -ti를 전달하여 도커 컨테이너의 터미널과 상호 작용할 수 있습니다.
docker run --rm -ti <image-name>
eg: docker run --rm -ti ubuntu
-t는 terminal을 나타냅니다. -i는 Interactive를 나타냅니다.
대상에 따라 2가지 이상의 옵션이 있습니다.
옵션 1: 새 bash 프로세스를 생성하고 프로세스에 참여합니다(더 쉽게).
- 시작: 샘플 시작:
docker exec -it <containername> /bin/bash
- 유: 형
exit
- Pro: 모든 컨테이너에서 작동합니다(CMD/Entrypoint에 의존하지 않음).
- 반대: 자체 세션 및 자체 환경을 사용하여 새로운 프로세스를 생성합니다.
옵션 2: 이미 실행 중인 bash에 연결(더 나은)
- 시작: 샘플 시작:
docker attach --detach-keys ctrl-d <containername>
- 키하기: 키사용
ctrl
그리고.d
- 프로: 컨테이너에 있는 것과 동일한 실행 배시를 조인합니다.세션과 환경 변수가 동일합니다.
- 가 " ": CMD/Entrypoint"와 같은 합니다.
CMD ["/bin/bash"]
또는CMD ["/bin/bash", "--init-file", "myfile.sh"]
컨테이너가 다음과 같은 대화형 옵션으로 시작된 경우docker run -itd <image>
연속, 및 i=damon, -t=ty 및 -d=deamon [opt])
우리는 옵션 2가 더 유용하다는 것을 발견했습니다.예를 들어 우리는 변했습니다.apache2-foreground
인 apache2
그리고 시작했습니다.bash
후에
docker exec
분명 해결책이 될 겁니다질문에 대한 간단한 작업 방법은 Docker 내부의 디렉토리를 로컬 시스템의 디렉토리에 마운트하는 것입니다.
따라서 로컬 경로의 변경 내용을 즉시 볼 수 있습니다.
docker run -v /Users/<path>:/<container path>
사용:
docker attach <container name/id here>
다른 방법은, 비록 그것에 위험이 있지만, 사용하는 것입니다.attach
그러나 +를 눌러 세션을 종료하면 컨테이너도 중지됩니다.무슨 일이 일어나고 있는지 보고 싶다면,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)
다음 명령을 사용합니다.
docker exec -it containerid /bin/bash
실행 중인 컨테이너에 실행하려면 다음과 같이 하십시오.test
과 같습니다.
컨테이너에 다음이 있는 경우bash
docker exec -it test /bin/bash
컨테이너에 다음이 있는 경우bourne
껍데기와 그것이 있는 대부분의 경우.
docker run -it test /bin/sh
되어 Kitematic
GUI를 사용할 수 있습니다.을 엽니다.Kitematic
및 Kitematic
후, ▁on▁windowexec
아이콘
이 GUI에서도 컨테이너 로그와 많은 컨테이너 정보(설정 탭)를 볼 수 있습니다.
도커 빌드 파일에 진입점을 지정하지 않으려는 경우 이 방법이 가장 좋습니다.
sudo docker run -it --entrypoint /bin/bash <container_name>
저의 경우, 어떤 이유로 각 컨테이너에 있는 모든 네트워크 관련 정보를 확인해야 합니다.따라서 다음 명령은 컨테이너에서 유효해야 합니다.
ip
route
netstat
ps
...
저는 이 모든 답변을 통해 확인했지만, 아무 것도 저에게 도움이 되지 않았습니다.저는 다른 웹사이트에서 정보를 검색했습니다.영어로 작성된 것이 아니기 때문에 여기에 슈퍼링크를 추가하지 않겠습니다.그래서 저는 저와 같은 요구사항을 가진 사람들을 위해 이 요약 솔루션을 게시했습니다.
빛 테스트라는 이름의 실행 중인 컨테이너가 있다고 가정해 보겠습니다.다음 단계를 수행합니다.
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
컨테이너에서 네트워크 세계를 탐색합니다.
PS.xxxx
는 항상 첫 번째 명령에서 받은 값과 동일합니다.물론 다른 명령도 사용할 수 있습니다.ip netns exec xxxx netstat -antp|grep 8080
.
할 수 두 .shell
그리고.bash
그러나 일반적으로 bash는 지원되지 않으며 기본적으로 지원되는 terminal 실행 중인 컨테이너에 토시하려면 다음을 입력합니다.
도커 exec -it container_name/container_IDsh
실행 중인 컨테이너를 격납하려면 다음을 입력합니다.
도커 exec -it 컨테이너_이름/도커_아이디 바시
할 수 있는 . bash 터미널을 참조하십시오.Dockerfile
맘에 들다RUN apt install bash -y
도커 합성을 사용하는 경우 도커 컨테이너 내부로 이동합니다.
docker-compose run container_name /bin/bash
컨테이너 안에서 도커 파일에 정의된 WORKDIR로 이동합니다.다음을 통해 작업 디렉토리를 변경할 수 있습니다.
WORKDIR directory_path # E.g /usr/src -> container's path
다른 옵션은 nsenter를 사용하는 것입니다.
PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid
언급URL : https://stackoverflow.com/questions/30172605/how-do-i-get-into-a-docker-containers-shell
'programing' 카테고리의 다른 글
Spring Session Attributes 테이블 이름은 대소문자를 구분합니다. (0) | 2023.09.05 |
---|---|
부트스트랩 열이 여러 행에 걸쳐지도록 하려면 어떻게 해야 합니까? (0) | 2023.09.05 |
Font Awesome 아이콘이 작동하지 않습니다. 필요한 파일을 모두 포함했습니다. (0) | 2023.09.05 |
MariaDB 테이블의 INSERT에 이미지 업로드가 실패하고 PDO::PARAM_LOB (0) | 2023.09.05 |
도커 컨테이너에서 PATH 환경 변수를 영구적으로 업데이트하는 중 (0) | 2023.09.05 |