호스트 파일 시스템에 Docker 컨테이너 내용 마운트


24

Docker 컨테이너의 내용을 검사하고 싶습니다 (읽기 전용). 이를 수행하는 우아한 방법은 컨테이너의 내용을 디렉토리에 마운트하는 것입니다. 컨테이너 내부의 호스트에 폴더를 마운트하는 것이 아니라 호스트의 컨테이너 내용을 마운트하는 것에 대해 이야기하고 있습니다.

Docker에는 두 개의 스토리지 드라이버 인 aufs와 btrfs가 있음을 알 수 있습니다. 내 Docker 설치는 btrfs를 사용하며 / var / lib / docker / btrfs / subvolumes를 탐색하면 시스템의 Docker 컨테이너 당 하나의 디렉토리가 표시됩니다. 그러나 이것은 Docker의 구현 세부 사항이며 이러한 디렉토리를 다른 곳에 마운트하여 잘못 바인딩하는 느낌이 듭니다.

이를 수행하는 올바른 방법이 있습니까, 아니면 이러한 종류의 마운트를 지원하기 위해 Docker를 패치해야합니까?


이것을 다른 곳에 마운트하는 것이 왜 잘못 되었습니까?
Michael Hampton

1
저장 위치는 구현 세부 사항이므로. 데이도 커가 다른 스토리지 드라이버를 추가하면 위치가 이동합니다. 이 반자동을 만들어야하며 그 이유로 공개 API를 사용하는 것이 좋습니다.
dflemstr

2
목표를 달성하기 위해 nsenter (또는 docker-enter)를 통해 작업하는 것이 좋습니다. 물론 컨테이너 내부에서 검사 코드 / 도구를 rnu해야한다는 제약이 있습니다.
VladFr

컨테이너 경계에 Linux를 마운트하도록 지시하는 방법이 없습니까?
dflemstr

@dflemstr 그렇습니다. --volumes-from kinda는 다른 컨테이너의 기본 이미지와 볼륨에서 디렉토리의 통합을 마운트하는 것으로 보이지만이 동작은 문서화되어 있지 않습니다
Tarnay Kálmán

답변:


10

보세요 docker export .

컨테이너에 파일을 빠르게 나열하려면 :

docker export CONTAINER|tar -t

내보내려면

docker export CONTAINER>snapshot.tar
docker export CONTAINER|tar x PATH-IN-CONTAINER

또는 파일을 보려면

docker export CONTAINER|tar x --to-stdout PATH-IN-CONTAINER
# e.g. 
docker export consul|tar x --to-stdout etc/profile

Docker 1.8은 CP를 지원합니다 .

https://docs.docker.com/reference/commandline/cp/

Usage:  docker cp [options] CONTAINER:PATH LOCALPATH|-
        docker cp [options] LOCALPATH|- CONTAINER:PATH

업데이트 :이를 실행할 때 docker 시스템에 ssh해야합니다.


2
내 이미지는 상당히 크므로 (수백 MiB) 개별 파일을 가져 오기 위해이 작업을 수행하는 것은 너무 많은 오버 헤드입니다. 매번 수백 메가 바이트 파일이 생성됩니다.
dflemstr

@dflemstr로 줄을 사용 tar x PATH-IN-CONTAINER하면 필요한 파일 만 추출됩니다.
laktak

...하지만 전체 tar아카이브는 여전히 Docker 데몬에서 생성되며 생성하는 데 몇 분이 걸립니다 ...
dflemstr

@dflemstr 설정이 무엇인지 모르지만 예를 들어 docker export ubuntu|tar -t|grep etc/network3 초가 걸립니다.
laktak

당신은 아마도 Docker 데몬과 같은 머신에서 이것을 실행하고 있으므로 네트워크 전송을 할 필요가 없으며 ubuntu이미지는 정말 작습니다.
dflemstr

3

docker commit 을 사용 하여 컨테이너의 현재 상태를 새 이미지로 유지 하고이 이미지에서 대화 형 컨테이너를 시작하여 내용을 검사 할 수 있습니다.

설명서에서 :

컨테이너의 파일 변경 또는 설정을 새 이미지로 커밋하는 것이 유용 할 수 있습니다. 이를 통해 대화식 쉘을 실행하거나 작업중인 데이터 세트를 다른 서버로 내보내 컨테이너를 디버그 할 수 있습니다.

이것이 도움이되기를 바랍니다.


2

nsenter를 사용하여 컨테이너 / 네임 스페이스 내에서 검사 프로그램 (아마도 컨테이너에 포함되어 있어야 함)을 실행할 수 있습니다. 그러나 컨테이너 파일 시스템을 내부에 보이는 것처럼 마운트하려면 원본 이미지와 모든 레이어를 aufs 또는 장치 매퍼, btrfs 및 사용되는 다른 (미래) 스토리지 엔진에 대해 동등한 경우 각각 다르게 마운트해야합니다. 아마도 docker가 예상대로 정확하게 작업을 수행하고 nsenter를 사용하여 컨테이너 내부에서 검사를 수행하는 것이 더 효율적일 것입니다.

다른 접근법이 있습니다. docker diff는 원본 이미지의 내용 대신 변경된 내용을 보려면 해당 컨테이너에서 변경된 파일을 표시합니다.

그리고 지속적이고 검사 가능한 데이터의 경우 컨테이너의 볼륨에 데이터를 저장하고 실제 파일 시스템이나 순수한 데이터 컨테이너 또는 동일한 컨테이너에 마운트하는 것이 더 나은 패턴 일 것입니다. 해당 볼륨을 마운트하는 검사 프로그램으로 다른 컨테이너를 시작할 수 있습니다.


1

편집 : 아래 솔루션을 시도했지만 불행히도 실제로 나에게 잘 작동하지 않았습니다. 마운트 된 파일 시스템은 컨테이너의 파일 시스템을 정확하게 반영하지 않았습니다 (조차 포함 cache=no). 이것이 근본적인 문제인지 또는 뭔가 잘못하고 있는지 확실하지 않습니다.

docker 이미지에 sshd를 설치 하고 docker 컨테이너에서 docker execssh 서비스 ( /usr/sbin/sshd -D) 를 실행하는 데 사용할 수 있습니다 ( docker 컨테이너의 SSH 포트 22가 노출되어 있어야 함).

그런 다음 docker cp공개 ssh 키를 /root/.ssh/authorized_keysdocker 컨테이너 의 디렉토리에 복사 하는 데 사용 하십시오 .

마지막으로을 사용 docker inspect하여 컨테이너의 IP 주소를 찾고 다음을 사용 하여 컨테이너의 파일 시스템을 마운트하십시오.

sudo sshfs -o allow_other,default_permissions,IdentityFile=/path/to/identityfile  root@xxx.xx.x.x:/ /mnt/my_container

이 작업을 실제로 편하게하려면 스크립트를 작성해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.