it-gundan.com

Docker 컨테이너의 파일 시스템 탐색

컨테이너 내부에서 어떤 일이 일어나고 있는지, 어떤 파일이 존재 하는지를 이해해야한다는 점을 알았습니다. 한 가지 예는 고정 색인에서 이미지를 다운로드하는 것입니다. 이미지에 포함 된 것을 파악하지 않아도 응용 프로그램을 시작할 수 없습니다.

이상적인 것은 ssh 또는 동등한 것으로 ssh 할 수있는 것입니다. 이 작업을 수행 할 수있는 도구가 있는지 또는이 작업을 수행 할 수 있어야한다고 생각하는 부두에 대한 개념화가 잘못되었습니다.

468
user2668128

방법 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을 사용하십시오. http://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/

짧은 버전은 : nsenter를 사용하면 쉘이 SSH 또는 어떤 종류의 특수 목적 데몬을 실행하지 않더라도 쉘을 기존 컨테이너로 가져올 수 있습니다

업데이트 - 방법 4 : 도커 exec

Docker 버전 1.3 (최신, 2014 년 11 월의 최신 버전을 설치하기 위해 docker apt repo를 사용해야 할 수도 있음)는 exec과 비슷한 동작을하는 새로운 명령 nsenter을 지원합니다. 이 명령은 이미 실행중인 컨테이너 (컨테이너는 PID 1 프로세스가 이미 실행 중이어야 함)에서 새 프로세스를 실행할 수 있습니다. /bin/bash를 실행하여 컨테이너 상태를 탐색 할 수 있습니다.

docker exec -t -i mycontainer /bin/bash

Docker 명령 행 문서 참조

569
Jiri

업데이트 : 탐구!

이 명령은 실행중인 도커 컨테이너 탐색 :

docker exec -it name-of-container bash

이것에 대한 docker-compose의 동등 물은 다음과 같습니다.

docker-compose exec web bash

(웹은이 경우 서비스 이름이고 기본적으로 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 리턴에서 엔트리 포인트 또는 cmd를 찾으십시오.

docker exec 설명서 참조

도커 작성 - exec 문서 작성

도커 검사 문서보기

180
Khalil Gharbaoui

컨테이너의 파일 시스템을 tar 파일에 보관할 수 있습니다 :

docker export adoring_kowalevski > contents.tar

이 방법은 컨테이너가 중지되고 /bin/bash와 같은 셸 프로그램이없는 경우에도 작동합니다. 나는 Docker documentation 에서 hello-world와 같은 이미지를 의미합니다.

134
Ilya Murav'jov

컨테이너의 파일 시스템은 도커의 데이터 폴더에 있으며, 일반적으로/var/lib/docker에 있습니다. 실행중인 컨테이너 파일 시스템을 시작하고 검사하려면 다음을 수행하십시오.

hash=$(docker run busybox)
cd /var/lib/docker/aufs/mnt/$hash

이제는 현재 작업 디렉토리가 컨테이너의 루트가됩니다.

40
Rovanion

컨테이너 생성 전 :

컨테이너 내부에 마운트 된 이미지의 구조를 탐색 할 수 있다면 할 수 있습니다.

Sudo docker image save image_name > image.tar
tar -xvf image.tar

이렇게하면 이미지의 모든 레이어와 json 파일에있는 구성의 가시성을 얻을 수 있습니다.

컨테이너 생성 후 :

이를 위해 이미 많은 답변이 있습니다. 이 일을하는 나의 선호하는 방법은 -

docker exec -t -i container /bin/bash
19
Gaurav24

우분투 14.04 running Docker 1.3.1 , 다음 디렉토리의 호스트 컴퓨터에 컨테이너 루트 파일 시스템을 발견했습니다 :

/var/lib/docker/devicemapper/mnt/<container id>/rootfs/

Full Docker 버전 정보 :

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
17
piercebot

컨테이너가 실제로 시작될 때 가장 upvoted 대답은 나를 위해 일하고 있지만 실행할 수없는 경우 예를 들어 컨테이너에서 파일을 복사하려고하면 이전에 저를 구해 줬습니다.

docker cp <container-name>:<path/inside/container> <path/on/Host/>

Docker cp ( link ) 덕분에 파일 시스템의 다른 부분처럼 컨테이너에서 직접 복사 할 수 있습니다. 예를 들어, 컨테이너 내부의 모든 파일 복구 :

mkdir /tmp/container_temp
docker cp example_container:/ /tmp/container_temp/

재귀 적으로 복사하도록 지정하지 않아도됩니다.

13
Julius Printz

컨테이너가 실제 Linux 시스템이 아닌 경우를 제외하고 가장 득표 된 대답은 좋습니다.

많은 컨테이너 (특히 이동 기반 컨테이너)에는 표준 바이너리 (/bin/bash 또는 /bin/sh 없음)가 없습니다. 이 경우 실제 컨테이너 파일에 직접 액세스해야합니다.

매력처럼 작동합니다.

name=<name>
dockerId=$(docker inspect -f {{.Id}} $name)
mountId=$(cat /var/lib/docker/image/aufs/layerdb/mounts/$dockerId/mount-id)
cd /var/lib/docker/aufs/mnt/$mountId

참고 : 루트로 실행해야합니다.

11
Florent

나는 aufs/devicemapper 불가 지론 인 또 다른 더러운 트릭을 사용한다.

컨테이너가 실행중인 명령을 봅니다. docker ps 그리고 Apache 또는 Java 인 경우 다음을 수행하십시오.

Sudo -s
cd /proc/$(pgrep Java)/root/

너는 컨테이너 안에있어.

기본적으로 /proc/<PID>/root/ 폴더에 루트 CD를 넣을 수 있습니다. 단, 해당 프로세스가 컨테이너에 의해 실행되는 한. 심볼릭 링크는 그 모드를 사용하는 것이 바람직하지 않습니다.

11
telamon

사용 해보기

docker exec -it <container-name> /bin/bash

Bash가 구현되지 않았을 가능성이 있습니다. 당신이 사용할 수 있기 때문에

docker exec -it <container-name> sh
10
Gaurav Sharma

나에게이 스크립트는 잘 동작한다. (/var/lib/docker/디렉토리를 가리키는 마지막 코멘트 덕분이다.)

chroot /var/lib/docker/containers/2465790aa2c4*/root/

여기서, 2465790aa2c4 는 실행 컨테이너의 짧은 ID입니다 ( docker ps 로 표시됨). 별표가옵니다.

4
dashohoxha

제 경우에는 쉘에서 sh을 제외한 컨테이너가 지원되지 않았습니다. 그래서, 이것은 매력처럼 작동했습니다.

docker exec -it <container-name> sh
4
shx

도커 용 aufs 드라이버 :

스크립트는 컨테이너 루트 디렉토리 (docker 1.7.1 및 1.10.3에서 테스트)

if [ -z "$1" ] ; then
 echo 'docker-find-root $container_id_or_name '
 exit 1
fi
CID=$(docker inspect   --format {{.Id}} $1)
if [ -n "$CID" ] ; then
    if [ -f  /var/lib/docker/image/aufs/layerdb/mounts/$CID/mount-id ] ; then
        F1=$(cat /var/lib/docker/image/aufs/layerdb/mounts/$CID/mount-id)
       d1=/var/lib/docker/aufs/mnt/$F1
    fi
    if [ ! -d "$d1" ] ; then
        d1=/var/lib/docker/aufs/diff/$CID
    fi
    echo $d1
fi
4
qxo

최신 버전의 Docker에서는 컨테이너 내부의 셸을 실행하는 docker exec [container_name]를 실행할 수 있습니다

따라서 컨테이너에있는 모든 파일의 목록을 얻으려면 docker exec [container_name] ls를 실행하면됩니다.

3
xoher

또 다른 트릭은 atomic tool을 다음과 같이 사용하는 것입니다.

mkdir -p /path/to/mnt && atomic mount IMAGE /path/to/mnt

Docker 이미지는/path/to/mnt 에 마운트되어 검사 할 수 있습니다.

3

이미 실행중인 컨테이너의 경우 다음을 수행 할 수 있습니다.

dockerId=$(docker inspect -f {{.Id}} [docker_id_or_name])

cd /var/lib/docker/btrfs/subvolumes/$dockerId

그 디렉토리로 들어가려면 루트 권한이 필요합니다. 루트가 아닌 경우 명령을 실행하기 전에 'sudo su'를 시도하십시오.

편집 : v1.3에 이어 지리의 대답을 참조하십시오.

3
AlonL

이 답변은 컨테이너가 실행 중이 아니더라도 고정 장치 볼륨 파일 시스템을 탐색하려는 사용자 (나 자신과 같은)에게 도움이됩니다.

실행중인 고정 컨테이너 목록 표시 :

docker ps

=> 컨테이너 ID "4c721f1985bd"

로컬 물리적 컴퓨터 ( https://docs.docker.com/engine/tutorials/dockervolumes/ )에있는 도커 볼륨 탑재 지점을 확인하십시오.

docker inspect -f {{.Mounts}} 4c721f1985bd

=> [{/ tmp/container-garren/tmp true rprivate}]

이것은 로컬 물리적 컴퓨터 디렉토리/tmp/container-garren이/tmp 도커 볼륨 대상에 매핑되었음을 알려줍니다.

로컬 물리적 머신 디렉토리 (/ tmp/container-garren)를 알면 docker 컨테이너가 실행 중인지 여부에 관계없이 파일 시스템을 탐색 할 수 있습니다. 이는 컨테이너가 실행되지 않아도 지속되지 않아야하는 잔여 데이터가 있음을 알 수있게하는 데 중요했습니다.

3
Garren S

컨테이너 내부에서 일어나는 일을 이해하기 위해 내가 선호하는 방법은 다음과 같습니다.

  1. 폭로하다 -p 8000

    docker run -it -p 8000:8000 image
    
  2. 그 안의 서버 시작

    python -m SimpleHTTPServer
    
3
kgnete

다음과 같이 컨테이너 내부에서 bash를 실행할 수 있습니다 : $ docker run -it ubuntu /bin/bash

1
Yang Yu

실행중인 컨테이너에서 명령을 실행하는 docker exec 명령은 여러 경우에 도움이 될 수 있습니다.

 
 사용법 : docker exec [옵션] CONTAINER COMMAND [ARG ...] 
 
 실행중인 컨테이너에서 명령 실행 
 [.____ .detach -detach 분리 모드 : 백그라운드에서 명령 실행 
 --detach-keys string 
 컨테이너 
 분리를위한 키 시퀀스를 덮어 씁니다. .] - e, --env list 환경 변수 설정 
 -i, --interactive 접속하지 않은 상태에서도 STDIN을 열어 둔다. 
 --privileged 커멘드에 확장 된 권한을 부여한다. 
 - t, --tty 가상 TTY 할당 
 -u, --user 문자열 사용자 이름 또는 UID (형식 : 
 [:]) 
 -w, --workdir string Working 컨테이너 안의 디렉토리 
 

예 :

1) 실행중인 컨테이너 파일 시스템에 bash로 액세스하기 :

docker exec -it containerId bash 

2) 루트 권한으로 실행중인 컨테이너 파일 시스템에 bash로 액세스하여 필요한 권한을 가질 수 있습니다.

docker exec -it -u root containerId bash  

이것은 컨테이너에서 루트로 일부 처리를 수행하는 데 특히 유용합니다.

3) 특정 작업 디렉토리가있는 실행중인 컨테이너 파일 시스템에 bash로 액세스 :

docker exec -it -w /var/lib containerId bash 
1
davidxxx

AUFS 스토리지 드라이버를 사용하는 경우, my docker-layer 스크립트를 사용하여 컨테이너의 파일 시스템 루트 (mnt) 및 readwrite 계층을 찾을 수 있습니다.

# docker-layer musing_wiles
rw layer : /var/lib/docker/aufs/diff/c83338693ff190945b2374dea210974b7213bc0916163cc30e16f6ccf1e4b03f
mnt      : /var/lib/docker/aufs/mnt/c83338693ff190945b2374dea210974b7213bc0916163cc30e16f6ccf1e4b03f

2018-03-28 수정 :
도커 - 레이어가 도커 - 백업으로 대체되었습니다 -

0
Vince

그러면 이미지에 대한 bash 세션이 시작됩니다.

도커 실행 --rm -it --entrypoint =/bin/bash

0
LeYAUable

리눅스에서만

내가 사용하는 가장 간단한 방법은 proc 디렉토리를 사용하는 것인데, 이는 docker 컨테이너 파일을 검사하기 위해 컨테이너가 실행 중이어야한다는 것입니다.

  1. 컨테이너의 프로세스 ID (PID)를 찾아서 변수에 저장하십시오.

    PID = $ (docker inspect -f '{{.State.Pid}}'당신의 용기 이름 - 여기)

  2. 컨테이너 프로세스가 실행 중인지 확인하고 nameto 변수를 컨테이너 폴더로 가져옵니다.

    cd/proc/$ PID/root

이 긴 명령을 사용하여 PID 번호를 찾지 않고 dir을 통과하려는 경우

cd /proc/$(docker inspect -f '{{.State.Pid}}' your-container-name-here)/root

희망이 도움이된다.

** 참고 :이 방법은 컨테이너가 계속 실행중인 경우에만 작동하며, 그렇지 않으면 컨테이너가 중지되거나 제거 된 경우 디렉토리가 더 이상 존재하지 않습니다.

0

다이빙을 사용하여 이미지 콘텐츠를 TUI와 대화식으로 볼 수 있습니다.

https://github.com/wagoodman/dive

 enter image description here

0
Andy Wong