[linux] Docker 컨테이너의 파일 시스템 탐색
도커와 함께 컨테이너 내부에서 발생하는 일이나 그 안에 존재하는 파일을 이해해야한다는 것을 알았습니다. 한 가지 예는 docker index에서 이미지를 다운로드하는 것입니다. 이미지에 포함 된 단서가 없으므로 응용 프로그램을 시작할 수 없습니다.
이상적인 것은 이것들이나 그와 동등한 것으로 ssh 할 수 있다는 것입니다. 이것을 할 수있는 도구가 있습니까, 아니면 내가 이것을 할 수 있어야한다고 생각하는 docker에 대한 개념화가 잘못 되었습니까?
답변
UPDATE
가장 쉬운 방법 : 고정 표시기 간부를 사용하여
Docker 버전 1.3 이상은와 exec
유사한 동작을 지원합니다 nsenter
. 이 명령은 이미 실행중인 컨테이너에서 새 프로세스를 실행할 수 있습니다 (컨테이너에는 PID 1 프로세스가 이미 실행 중이어야 함). /bin/bash
컨테이너 상태를 탐색하기 위해 실행할 수 있습니다 .
docker exec -t -i mycontainer /bin/bash
Docker 명령 행 설명서를 참조하십시오.
다른 방법 1
스냅 샷
컨테이너 파일 시스템을 다음과 같이 평가할 수 있습니다.
# find ID of your running container:
docker ps
# create image (snapshot) from container filesystem
docker commit 12345678904b5 mysnapshot
# explore this filesystem using bash (for example)
docker run -t -i mysnapshot /bin/bash
이런 식으로 정확한 시간에 실행중인 컨테이너의 파일 시스템을 평가할 수 있습니다. 컨테이너가 여전히 실행 중이며 향후 변경 사항이 포함되지 않습니다.
나중에 실행중인 컨테이너의 파일 시스템에는 영향을 미치지 않습니다.를 사용하여 스냅 샷을 삭제할 수 있습니다.
docker rmi mysnapshot
대체 방법 2
ssh
지속적인 액세스가 필요한 경우 컨테이너에 sshd를 설치하고 sshd 데몬을 실행할 수 있습니다.
docker run -d -p 22 mysnapshot /usr/sbin/sshd -D
# you need to find out which port to connect:
docker ps
이렇게하면 ssh를 사용하여 앱을 실행할 수 있습니다 (원하는 것을 연결하고 실행하십시오).
업데이트 : 대체 방법 3
nsenter
사용 nsenter
은 https://web.archive.org/web/20160305150559/http://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/를 참조 하십시오.
짧은 버전은 다음과 같습니다. nsenter를 사용하면 해당 컨테이너가 SSH 또는 특수 목적 데몬을 실행하지 않더라도 기존 컨테이너로 쉘을 가져올 수 있습니다.
답변
업데이트 : 탐험 중!
이 명령을 사용 하면 실행중인 도커 컨테이너 를 탐색 할 수 있습니다 .
docker exec -it name-of-container bash
docker-compose에서 이에 해당하는 내용은 다음과 같습니다.
docker-compose exec web bash
(이 경우 web은 서비스 이름이며 기본적으로 tty가 있습니다.)
당신이 안으로 들어가면 :
ls -lsa
또는 다음과 같은 다른 bash 명령 :
cd ..
이 명령을 사용 하면 도커 이미지 를 탐색 할 수 있습니다 .
docker run --rm -it --entrypoint=/bin/bash name-of-image
일단 안으로 :
ls -lsa
또는 다음과 같은 다른 bash 명령 :
cd ..
-it
대화 형 및 tty 의 약자.
이 명령을 사용 하면 실행중인 도커 컨테이너 또는 이미지 를 검사 할 수 있습니다 .
docker inspect name-of-container-or-image
이 작업을 수행하고 싶 bash
거나sh
있습니다. json return에서 entrypoint 또는 cmd를 찾으십시오.
docker-compose exec 문서를 참조하십시오
답변
컨테이너가 멈췄거나 쉘이없는 경우 (예 : 설치 안내서에hello-world
언급 되거나alpine
traefik
) 파일 시스템을 탐색하는 유일한 방법 일 수 있습니다.
컨테이너의 파일 시스템을 tar 파일로 보관할 수 있습니다 :
docker export adoring_kowalevski > contents.tar
또는 파일을 나열하십시오.
docker export adoring_kowalevski | tar t
이미지에 따라 시간과 디스크 공간이 걸릴 수 있습니다.
답변
컨테이너의 파일 시스템은 docker의 데이터 폴더에 있으며 일반적으로 / var / lib / docker에 있습니다. 실행중인 컨테이너 파일 시스템을 시작하고 검사하려면 다음을 수행하십시오.
hash=$(docker run busybox)
cd /var/lib/docker/aufs/mnt/$hash
그리고 현재 작업 디렉토리는 컨테이너의 루트입니다.
답변
컨테이너 생성 전 :
컨테이너 안에 장착 된 이미지의 구조를 탐색하려면 다음을 수행하십시오.
sudo docker image save image_name > image.tar
tar -xvf image.tar
이것은 이미지의 모든 레이어와 json 파일에 존재하는 구성의 가시성을 제공합니다.
컨테이너 생성 후 :
이를 위해 위의 답변이 이미 많이 있습니다. 이 작업을 선호하는 방법은 다음과 같습니다.
docker exec -t -i container /bin/bash
답변
컨테이너가 실제로 시작될 때 가장 혐오스러운 답변이 효과가 있지만 실행할 수 없을 때 컨테이너에서 파일을 복사하려는 경우 예를 들어 이전에 저를 저장했습니다.
docker cp <container-name>:<path/inside/container> <path/on/host/>
docker cp ( link ) 덕분에 파일 시스템의 다른 부분처럼 컨테이너에서 직접 복사 할 수 있습니다. 예를 들어, 컨테이너 내부의 모든 파일을 복구합니다.
mkdir /tmp/container_temp
docker cp example_container:/ /tmp/container_temp/
재귀 적으로 복사하도록 지정할 필요는 없습니다.
답변
에 우분투 14.04 실행 도커 1.3.1 , 나는 다음과 같은 디렉토리에있는 호스트 시스템의 컨테이너 루트 파일 시스템을 발견 :
/var/lib/docker/devicemapper/mnt/<container id>/rootfs/
전체 도커 버전 정보 :
Client version: 1.3.1
Client API version: 1.15
Go version (client): go1.3.3
Git commit (client): 4e9bbfa
OS/Arch (client): linux/amd64
Server version: 1.3.1
Server API version: 1.15
Go version (server): go1.3.3
Git commit (server): 4e9bbfa