
Docker 컨테이너는 초기 생성 시 이미지의 파일 시스템을 상속합니다. 컨테이너의 쓰기 가능 레이어가 변경되면 컨테이너의 파일 시스템이 생성 후 이미지의 내용과 다를 수 있습니다.
파일 시스템의 변경 사항을 검사하는 기능은 문제를 디버그하고 누락된 데이터를 조사하는 데 도움이 될 수 있습니다. 컨테이너의 파일 시스템에 기록된 파일은 해당 컨테이너가 다시 시작되거나 파괴될 때 손실됩니다. 어떤 경우에는 대신 영구 볼륨으로 보내야 하는 쓰기를 의도치 않게 수행할 수 있습니다.
이 기사에서는 컨테이너 파일 시스템에 대한 수정 사항을 식별하는 몇 가지 기술을 공유합니다. 이 정보를 사용하여 컨테이너 활동을 추적하고 다양한 환경 간의 불일치를 조사할 수 있습니다.
도커 차이 사용
Docker CLI에는 이를 위한 내장 명령이 있습니다. 달리기 docker diff 특정 컨테이너 내의 파일 및 디렉토리에 대한 모든 변경 사항을 열거합니다. 검사하려는 컨테이너의 ID 또는 이름을 허용합니다.
데모 목적으로 간단한 컨테이너 시작:
$ docker run -it --name alpine alpine:latest sh
알파인 이미지를 실행하는 새 컨테이너가 시작됩니다. 터미널 창이 컨테이너에 연결됩니다. 이 창을 열어 두십시오.
이제 실행 docker diff 두 번째 터미널 세션에서:
$ docker diff alpine
신선한 컨테이너가 여전히 알파인 이미지의 파일 시스템과 정확히 일치하므로 출력이 생성되지 않습니다.
컨테이너에 아직 연결되어 있는 첫 번째 터미널로 다시 전환합니다. 파일을 추가, 삭제 또는 변경하는 몇 가지 명령을 실행합니다.
/ # touch demo / # touch example
첫 번째 셸 창으로 돌아갑니다. 반복 docker diff 변경된 사항을 확인하는 명령:
$ docker diff alpine A /example C /root C /root/.ash_history A /demo
이제 명령의 출력에 두 개의 새 파일이 표시됩니다. 달리기 touch 또한 컨테이너의 셸 기록에 항목을 추가했습니다. 수정 /root/.ash_history 뿐만 아니라 그에 따른 변경 사항도 보고됩니다. /root 예배 규칙서.
Docker Diff 출력 해석
에 의해 생성된 각 출력 라인 docker diff 접두사 A, C 또는 D 발생한 변경 유형에 따라:
-
A– 파일 또는 디렉토리가 컨테이너의 파일 시스템에 추가되었습니다. 원본 이미지에는 존재하지 않습니다. -
C– 파일 또는 디렉토리의 내용이 이미지의 버전과 다릅니다. -
D– 이미지에 있는 경로가 컨테이너에서 삭제되었습니다.
이 정보를 사용하면 누락된 데이터나 예기치 않은 동작을 설명할 수 있는 불일치를 빠르게 찾을 수 있습니다.
출력에 표시되지 않는 모든 파일 시스템 변경 사항에는 Docker 볼륨에 매핑되는 영향을 받는 경로가 있습니다. 이러한 파일은 파일 시스템과 독립적으로 컨테이너 외부에 저장되므로 외부에 표시되지 않습니다. docker diff .
원본 이미지에서 콘텐츠 보기
원본 이미지에 포함된 파일 버전을 비교하는 것이 도움이 될 수 있습니다. 새 컨테이너를 만든 다음 파일을 복사하여 이 작업을 수행할 수 있습니다. 사용 docker create 대신에 docker run 따라서 컨테이너가 생성되지만 시작되지는 않습니다. 이렇게 하면 이미지의 진입점 스크립트로 인한 수정 사항이 결과에 영향을 미치지 않습니다.
$ docker create --name temp-container my-image:latest $ docker cp temp-container:/path/to/file copied-file $ docker rm temp-container
다른 방법은 파일의 내용을 표준 출력 스트림으로 내보내는 사용자 지정 진입점으로 컨테이너를 실행하는 것입니다. 포함 --rm 명령이 완료된 후 컨테이너가 자동으로 제거되도록 플래그를 지정합니다.
$ docker run --rm --entrypoint cat alpine:latest /path/to/file > copied-file
두 컨테이너의 차이점 비교
때로는 동일한 이미지를 실행하는 두 개의 다른 컨테이너 간의 차이점을 비교해야 할 수도 있습니다. 처음 사용 docker diff 개별 변경 목록을 얻으려면:
$ docker diff first-container > first $ docker diff second-container > second
이제 다음과 같은 표준 Unix 도구를 사용할 수 있습니다. diff 두 변경 목록에서 차이점을 찾는 명령:
diff first second 3c3 < A /a-new-file --- > A /demo
diff는 다음을 보여줍니다. /a-new-file 동안 두 번째 컨테이너에서 제거되었습니다. /demo 추가되었다.
컨테이너를 비교하는 또 다른 방법은 다음을 사용하는 것입니다. docker export 포괄적인 파일 목록에 액세스하기 위한 tar 명령:
$ docker export demo-container | tar tv -rwxr-xr-x 0/0 0 2022-06-21 14:21 .dockerenv drwxr-xr-x 0/0 0 2022-05-23 17:51 bin/ lrwxrwxrwx 0/0 0 2022-05-23 17:51 bin/arch -> /bin/busybox lrwxrwxrwx 0/0 0 2022-05-23 17:51 bin/ash -> /bin/busybox lrwxrwxrwx 0/0 0 2022-05-23 17:51 bin/base64 -> /bin/busybox lrwxrwxrwx 0/0 0 2022-05-23 17:51 bin/bbconfig -> /bin/busybox ...
두 컨테이너에 대해 이 명령을 반복합니다. 그런 다음 사용할 수 있습니다. diff 두 목록을 비교합니다. tar의 향상된 출력은 수정 시간 및 권한이 표시될 때 파일이 변경된 시점을 추적하는 데 도움이 될 수 있습니다.
요약
Docker 컨테이너의 파일 시스템은 생성된 이미지와 매우 유사해야 합니다. 컨테이너 내의 소프트웨어가 콘텐츠를 파일 시스템에 직접 쓸 때 불일치가 발생할 수 있습니다. 사용자는 다음과 같은 메커니즘이 있을 때 차이의 또 다른 원인이 될 수 있습니다. docker exec 실행 중인 컨테이너 내에서 명령을 실행하는 데 사용됩니다.
그만큼 docker diff 유틸리티는 이러한 변경 사항을 볼 수 있는 편리한 방법을 제공합니다. 파일이 추가 또는 제거된 이유를 알 수는 없지만 수정 목록을 검색하는 기능은 특정 동작이 관찰되는 이유를 이해하는 데 매우 중요합니다.
이 기사에서는 실행 중인 컨테이너에 대한 변경 사항을 조사하는 데 중점을 두었습니다. 다음과 같은 다양한 도구를 사용할 수 있습니다. docker history Dive를 사용하여 Docker 이미지 내의 레이어에 대한 변경 사항을 검사합니다. 두 가지 접근 방식을 함께 사용할 수 있으므로 컨테이너의 레이어 스택 내에서 파일이 추가되거나 수정된 정확한 지점을 파악할 수 있습니다.








